2012-01-12 25 views
14

Estoy tratando de enviar una entrada (tipo = botón) .Pero no puedo actualizar el valor. Se agradece cualquier ayuda. He adjuntado el caso de prueba a continuación para su referencia.Utilizando enlaces de Python, Selenium WebDriver click() no funciona a veces.

búsqueda de CLIC AQUÍ FALLA

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
import unittest, time, re,datetime,os,sys 

from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.action_chains import ActionChains 


def is_element_present(inst,selector,value): 
    try: 
     inst.find_element(by=selector, value=value) 
     return True 
    except: 
     return False 



class Testing(unittest.TestCase): 
    def setUp(self): 
     self.driver = webdriver.Chrome() 
     self.driver.implicitly_wait(5) 
     self.base_url = "http://new.ossmoketest.appspot.com/" 
     self.verificationErrors = [] 

    def test_ing(self): 
     try: 

      driver = self.driver 
      driver.get(self.base_url + "/Apab4b39d4_09d7_11e1_8df9_139372201eeb/1/signin?forward=/%3F") 
      now = datetime.datetime.now() 
      start = time.clock() 

      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.ID,"userid"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 
      print diff 
      driver.find_element_by_id("userid").clear() 
      driver.find_element_by_id("userid").send_keys("[email protected]") 
      driver.find_element_by_xpath("//input[@src='/static/images/signup.png']").click() 
      print 'finished' 
      start = time.clock() 

      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.LINK_TEXT,"Logout"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 
      print diff 
      time.sleep(5) 

      start = time.clock() 
      name = "smoketest"+ str(now.minute) +str(now.second) 
      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.LINK_TEXT,"PurchaseOrder"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 
      driver.find_element_by_link_text('PurchaseOrder').click() 
      name = "smoketest"+ str(now.minute) +str(now.second) 
      start = time.clock() 
      for i in range(5000000): 
       try: 
        if is_element_present(driver,By.ID,"Customer_Name"): break 
       except: pass 
      else: self.fail("time out") 
      end = time.clock() 
      diff = end - start 

      newproduct = "rexona"+ str(now.minute) +str(now.second) 
      newprice = str(now.minute) +str(now.second) 
      newprice = float(newprice) 
      print newprice 
      driver.find_element_by_xpath("//input[starts-with(@id,'New_Product')]").send_keys(newproduct) 
      driver.find_element_by_xpath("//input[starts-with(@id,'Price')]").clear() 
      time.sleep(3) 

      driver.find_element_by_xpath("//input[starts-with(@id,'Price')]").send_keys(Keys.CONTROL+'a'+Keys.NULL, str(newprice)) 
      Mouse_cntrl = ActionChains(driver) 
      Mouse_cntrl.release(driver.find_element_by_xpath("//input[starts-with(@id,'Price')]")) 
      value = newprice 
      print value 
      time.sleep(2) 
      print 'start' 
      print driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").get_attribute('data-id') 
      # ------------------------CLICK FAILS HERE ------------------------------ 
#   driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").click() 
#   driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").submit() 
      driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]").send_keys(keys.ENTER) 
#   Mouse_cntrl.double_click(driver.find_element_by_xpath("//input[starts-with(@id,'NewItem_NewItem')]")) 
      for i in range(10): 
       try: 
        print driver.switch_to_alert().text 
        if driver.switch_to_alert(): 
         driver.switch_to_alert().accept() 
         break 
       except: pass 
       time.sleep(1) 
      else: 
       print "alert not found" 
      print 'finished -- ' 
      time.sleep(8) 
      driver.find_element_by_xpath("//input[starts-with(@id,'Product')]").click() 
      arg = newproduct 
      print 'end' 
      for i in range(60): 
       try: 
        if is_element_present(driver,By.LINK_TEXT,arg): break 
       except: pass 
       time.sleep(1) 
      else: self.fail("time out") 
    #  sel.mouse_over("//html/body/ul/li/a[.=\""+arg+"\"]") 
      driver.find_element_by_link_text(arg).click() 
      start = time.clock() 
      time.sleep(25) 
      for i in range(1000000): 
       try: 

        if newprice == float(driver.find_element_by_id('Unit_Price').text): 
         end = time.clock() 
         diff = end - start 
         log.log(module='Smoke',testcase='Action New', result='Pass',time_taken= diff) 
         break 
       except: pass 
      else: 
       log.log(module='Smoke',testcase='Action New', result='Fail') 
       self.fail('New Failure') 
      log.log(module='Smoke',testcase='On Submit', result='Pass',time_taken= diff) 
      driver.find_element_by_id('Quantity').send_keys(Keys.CONTROL+'a'+Keys.NULL,"1") 
      time.sleep(5) 
      start = time.clock() 
      for i in range(1000000): 
       try: 
        if value == float(driver.find_element_by_id('Unit_Price').text): 
         end = time.clock() 
         diff = end - start 
         log.log(module='Smoke',testcase='Multiply', result='Pass',time_taken= diff) 
         break 
       except: pass 
      else: self.fail("time out") 
      for i in range(1000000): 
       try: 
        if value == float(driver.find_element_by_id('Amount').text): 
         end = time.clock() 
         diff = end - start 
         log.log(module='Smoke',testcase='DSUM with Parent', result='Pass',time_taken= diff) 
         break 
       except: pass 
      else: 
       end = time.clock() 
       diff = end - start 
       log.log(module='Smoke',testcase='DSUM with Parent', result='Fail',time_taken= diff) 
       self.fail("time out") 

     except: 
      self.driver.quit() 
      e = sys.exc_info()[1] 
      print str(e) 

    def tearDown(self): 
     self.driver.quit() 
     self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    unittest.main() 

ha sido sensacional para mi trabajo. Cualquier ayuda es apreciada. Gracias

+0

¿En qué línea está fallando el código? – Julian

+2

qué pasa con el selector CSS:. 'driver.find_element_by_css_selector ("entrada [id * = NewItem_NewItem]") haga clic en()' Además, esta línea no le dan el atributo? 'print driver.find_element_by_xpath (" // entrada [starts-with (@ id, 'NewItem_NewItem')] "). Get_attribute ('data-id')' Si es así, ¿hay javascript funcionando después de la carga de la página que puede estar afectando a este elemento? –

+0

Es probable que el elemento no esté "listo" para el clic como resultado de la reescritura de la página. Determine por qué, luego realice un ciclo mientras la condición persista o hasta que ocurra un tiempo de espera. –

Respuesta

0

Me gustaría probar otros buscadores de elementos como className, cssSelector o algo así. xPath a veces no proporciona errores si el elemento no se encuentra. Así que primero empiece por averiguar si el elemento realmente lo encuentra webdriver.

También puede intentar click o utilizar los otros comandos dos veces en una fila. Esto ya resolvió algunos de estos problemas.

11

Puede intentar sustituir .click() con. send_keys("\n"), que es equivalente a "Presionar enter mientras enfocas un elemento".

Así que esto:

driver.find_element_by_link_text('PurchaseOrder').click() 

se convertiría en esto:

driver.find_element_by_link_text('PurchaseOrder').send_keys("\n") 
3

tuve este problema también. Algunas veces, por la razón que sea, el controlador web no hizo clic en el botón. Pudo encontrar el botón (no lanzó NoSuchElementException y WebDriverWait no ayudó).

El problema de hacer clic dos veces en el botón es que si el primer clic se realiza correctamente, el segundo falla (o hace clic en el botón enviar en la página siguiente si encuentra una coincidencia). Mi primer intento fue poner el segundo clic en un bloque try/except - así es como me enteré al hacer clic en enviar en la página siguiente. XD Y realmente también desaceleró mi prueba cuando no pudo encontrar el segundo botón.

Encontré algunas buenas ideas en Selenium 2.0b3 IE WebDriver, Click not firing. Básicamente, hago clic en un elemento primario primero, que aparentemente no hace nada. Luego hago clic en el botón enviar.

6

En caso de que este sea un problema recurrente para cualquier otra persona, si confirmó que su código es correcto (lo ha revisado en busca de errores, etc.) y todavía encuentra que la función find_element_by_...('text').click() no funciona correctamente, a menudo se debe a su código continúa ejecutándose antes de que JavaScript pueda actualizar la página.

Una solución simple es import time a continuación, insertar el código de abajo inmediatamente después de cualquier click() métodos:

time.sleep(2) 

La duración del temporizador de apagado puede ser lo que usted elige. En mi caso, utilicé 2 segundos. Espero que eso ayude.

+2

no hagas esto. hay formas mejores que contaminar las pruebas con durmientes estáticos –

+0

Me doy cuenta de que esto no es recomendable, pero funcionó para mí y, si nada más, me proporcionó un motivo por el cual mi código no funcionaba. –

+0

Los durmientes estáticos son horribles. Aprenda cómo esperar de la manera correcta. – Moser

0

Si el elemento que hace clic en() es una url. Descubrí que tomar las propiedades de href y usar driver.get(elem.get_attribute('href')) es lo más limpio.

Cuestiones relacionadas