2012-01-12 22 views
14

Tôi đang cố gắng gửi đầu vào (nút loại =). Nhưng tôi không thể cập nhật giá trị. Bất kỳ trợ giúp nào được đánh giá cao. Tôi đã đính kèm testcase dưới đây để bạn tham khảo.Sử dụng các ràng buộc Python, Selenium WebDriver nhấp() không hoạt động đôi khi.

tìm kiếm CLICK HERE KHÔNG

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() 

Nó đã được một showstopper cho công việc của tôi. Bất kỳ trợ giúp nào được đánh giá cao.Thanks

+0

mã nào bị lỗi? – Julian

+2

gì về selector css:. 'driver.find_element_by_css_selector ("đầu vào [id * = NewItem_NewItem]") click() ' Ngoài ra, không dòng này cung cấp cho bạn các thuộc tính? 'print driver.find_element_by_xpath (" // input [starts-with (@ id, 'NewItem_NewItem')] "). Get_attribute ('data-id')' Nếu có, có javascript chạy sau khi tải trang đó không có thể ảnh hưởng đến yếu tố này? –

+0

Phần tử này có thể không phải là 'sẵn sàng' cho nhấp chuột theo một cách nào đó như là kết quả của việc viết lại trang. Xác định lý do tại sao, sau đó lặp trong khi điều kiện đó tràn ngập hoặc cho đến khi hết thời gian. –

Trả lời

0

Tôi sẽ thử các công cụ tìm phần tử khác như className, cssSelector hoặc thứ gì đó. xPath đôi khi không cung cấp lỗi nếu phần tử không được tìm thấy. Vì vậy, đầu tiên bắt đầu bằng cách tìm hiểu xem các yếu tố thực sự được tìm thấy bởi webdriver.

Bạn cũng có thể thử click hoặc sử dụng các lệnh khác hai lần liên tiếp. Điều này đã giải quyết được một số vấn đề như vậy.

11

Bạn có thể thử thay thế .click() bằng. send_keys("\n"), tương đương với "Nhấn enter khi tập trung vào một phần tử".

Đây:

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

sẽ trở thành này:

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

Tôi có vấn đề này là tốt. Đôi khi, vì bất kỳ lý do gì mà trình quản lý web không nhấp vào nút. Nó đã có thể tìm thấy các nút (nó đã không ném một NoSuchElementException và một WebDriverWait đã không giúp đỡ).

Sự cố khi nhấp vào nút hai lần là nếu lần nhấp đầu tiên thành công, nhấp chuột thứ hai sẽ không thành công (hoặc nhấp vào nút gửi trên trang tiếp theo nếu nó tìm thấy kết quả phù hợp!). Nỗ lực đầu tiên của tôi là đặt nhấp chuột thứ hai vào khối thử/ngoại trừ - đây là cách tôi đã tìm hiểu về việc nhấp vào gửi trên trang tiếp theo. XD Và nó cũng thực sự làm chậm kiểm tra của tôi khi nó không thể tìm thấy nút thứ hai.

Tôi đã tìm thấy một số thông tin chi tiết hữu ích tại Selenium 2.0b3 IE WebDriver, Click not firing. Về cơ bản, tôi nhấp vào một yếu tố cha mẹ đầu tiên, mà dường như không có gì. Sau đó, tôi nhấp vào nút gửi.

6

Trong trường hợp đây vẫn là sự cố định kỳ cho bất kỳ ai khác, nếu bạn đã xác nhận mã của mình là chính xác (bạn đã xem xét lỗi này…) và bạn vẫn thấy chức năng find_element_by_...('text').click() không hoạt động bình thường, thường là do mã của bạn tiếp tục chạy trước khi JavaScript có thể cập nhật trang.

Một giải pháp đơn giản là để import time sau đó chèn đoạn code dưới đây ngay sau khi bất kỳ click() phương pháp:

time.sleep(2) 

Thời hạn của bộ đếm thời gian ngủ có thể bất cứ điều gì mà bạn chọn. Trong trường hợp của tôi, tôi đã sử dụng 2 giây. Hy vọng rằng sẽ giúp.

+2

không làm điều này. có những cách tốt hơn gây ô nhiễm testcases của bạn với giấc ngủ tĩnh –

+0

Tôi nhận ra rằng điều này không được khuyến khích, nhưng nó đã làm việc cho tôi và, nếu không có gì khác, cung cấp lý do tại sao mã của tôi không hoạt động. –

+0

Ngủ tĩnh là khủng khiếp. Tìm hiểu cách đợi đúng cách. – Moser

0

Nếu phần tử bạn nhấp() là url. Tôi thấy rằng việc sử dụng các thuộc tính href và sử dụng driver.get(elem.get_attribute('href')) là sản phẩm sạch nhất.

Các vấn đề liên quan