2011-10-16 10 views
36

Làm cách nào để viết hàm cho Selenium để chờ một bảng chỉ với một mã định danh lớp trong Python? Tôi đang có một thời gian để học cách sử dụng các chức năng trình quản lý web Python của Selenium.Selenium waitForElement

Trả lời

40

Từ Selenium Documentation PDF:

import contextlib 
import selenium.webdriver as webdriver 
import selenium.webdriver.support.ui as ui 

with contextlib.closing(webdriver.Firefox()) as driver: 
    driver.get('http://www.google.com') 
    wait = ui.WebDriverWait(driver,10) 
    # Do not call `implicitly_wait` if using `WebDriverWait`. 
    #  It magnifies the timeout. 
    # driver.implicitly_wait(10) 
    inputElement=driver.find_element_by_name('q') 
    inputElement.send_keys('Cheese!') 
    inputElement.submit() 
    print(driver.title) 

    wait.until(lambda driver: driver.title.lower().startswith('cheese!')) 
    print(driver.title) 

    # This raises 
    #  selenium.common.exceptions.TimeoutException: Message: None 
    #  after 10 seconds 
    wait.until(lambda driver: driver.find_element_by_id('someId')) 
    print(driver.title) 
+3

Bất kỳ cơ hội nào bạn có thể cập nhật url cho tài liệu selenium pdf? Có vẻ như "đã biến mất" –

+1

@ToranBillups: Thật không may, nó không còn xuất hiện trên trang web chính thức nữa. Đây dường như là một bản sao của những gì tôi đã đề cập đến: http://scholar.harvard.edu/files/tcheng2/files/selenium_documentation_0.pdf. Tìm kiếm "WebDriverWait". [Tài liệu trực tuyến] (http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits) tương tự và có thể cập nhật hơn. – unutbu

+0

Công trình này hoàn hảo cho tôi! Cảm ơn. – swdev

7

tôi đã thực hiện những kinh nghiệm tốt sử dụng:

  • time.sleep (giây)
  • webdriver.Firefox.implicitly_wait (giây)

Người đầu tiên là khá rõ ràng - chỉ cần chờ một vài giây cho một số thứ.

Đối với tất cả tập lệnh Selenium của tôi, giấc ngủ() trong vài giây (khoảng từ 1 đến 3) hoạt động khi tôi chạy trên máy tính xách tay, nhưng trên máy chủ của tôi thời gian chờ đợi có phạm vi rộng hơn, vì vậy tôi sử dụng implicitly_wait() quá. Tôi thường sử dụng hàm implicitly_wait (30), điều đó thực sự là đủ.

Chờ đợi tiềm ẩn là yêu cầu WebDriver thăm dò ý kiến ​​DOM trong một khoảng thời gian nhất định khi tìm một yếu tố hoặc thành phần nếu chúng không có sẵn ngay lập tức. Cài đặt mặc định là 0. Sau khi thiết lập, chờ đợi ngầm định được đặt cho tuổi thọ của cá thể đối tượng WebDriver.

1

Sử dụng Wait Until Page Contains Element với trình định vị XPath thích hợp. Ví dụ, với đoạn HTML sau:

<body> 
    <div id="myDiv"> 
    <table class="myTable"> 
     <!-- implementation --> 
    </table> 
    </div> 
</body> 

... bạn có thể nhập từ khóa sau:

Wait Until Page Contains Element //table[@class='myTable'] 5 seconds 

Trừ khi tôi đã bỏ lỡ một cái gì đó, không có nhu cầu để tạo ra một chức năng mới cho việc này.

1

Trong trường hợp này sẽ giúp ...

Trong Selenium IDE, tôi đã thêm ... Command: waitForElementPresent Target: // bảng [@ class = 'PLN']

Sau đó, tôi đã làm file> Export TestCase Như python2 (Web điều khiển), và nó đã cho tôi này ...

def test_sel(self): 
    driver = self.driver 
    for i in range(60): 
     try: 
      if self.is_element_present(By.XPATH, "//table[@class='pln']"): break 
     except: pass 
     time.sleep(1) 
    else: self.fail("time out") 
2

tôi thực hiện những điều sau đây cho python cho wait_for_condition kể từ khi tài xế python selen không hỗ trợ chức năng này.

def wait_for_condition(c): 
for x in range(1,10): 
    print "Waiting for ajax: " + c 
    x = browser.execute_script("return " + c) 
    if(x): 
     return 
    time.sleep(1) 

được sử dụng như

Chờ rằng một cuộc gọi ExtJS Ajax là không chờ phê duyệt:

wait_for_condition("!Ext.Ajax.isLoading()") 
biến

Một Javascript được thiết lập

wait_for_condition("CG.discovery != undefined;") 

, vv

+0

Woohoo! Điều này làm việc như một nhà vô địch: 'wait_for_condition (" $(). Active == 0 ")' – mattmc3

1

Bạn luôn có thể sử dụng một giấc ngủ ngắn trong một vòng lặp và vượt qua nó id yếu tố của bạn:

def wait_for_element(element): 
    count = 1 
    if(self.is_element_present(element)): 
      if(self.is_visible(element)): 
       return 
      else: 
       time.sleep(.1) 
       count = count + 1 
    else: 
     time.sleep(.1) 
     count = count + 1 
     if(count > 300): 
      print("Element %s not found" % element) 
      self.stop 
      #prevents infinite loop 
+0

Đây là điều mà WebdriverWait thực hiện :) – erm3nda

19

Selenium bindings Python 2 của có một lớp hỗ trợ mới được gọi là expected_conditions .py để làm đủ mọi thứ như thử nghiệm nếu một phần tử có thể nhìn thấy được. Đó là available here.

LƯU Ý: tệp ở trên nằm trong thân của ngày 12 tháng 10 năm 2012 nhưng chưa được tải xuống mới nhất vẫn còn 2,25. Hiện tại cho đến khi phiên bản Selenium mới được phát hành, bạn chỉ có thể lưu tệp này cục bộ ngay bây giờ và bao gồm nó trong các lần nhập của bạn như tôi đã thực hiện bên dưới.

Để làm cho cuộc sống đơn giản hơn một chút, bạn có thể kết hợp một số phương pháp điều kiện mong đợi này với logic Selenium wait until để thực hiện một số chức năng rất tiện dụng tương tự như những gì có sẵn trong Selenium 1. Ví dụ, tôi đặt nó vào lớp cơ sở của tôi gọi SeleniumTest mà tất cả các lớp học thử nghiệm Selenium của tôi mở rộng:

from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.common.by import By 
import selenium.webdriver.support.expected_conditions as EC 
import selenium.webdriver.support.ui as ui 

@classmethod 
def setUpClass(cls): 
    cls.selenium = WebDriver() 
    super(SeleniumTest, cls).setUpClass() 

@classmethod 
def tearDownClass(cls): 
    cls.selenium.quit() 
    super(SeleniumTest, cls).tearDownClass() 

# return True if element is visible within 2 seconds, otherwise False 
def is_visible(self, locator, timeout=2): 
    try: 
     ui.WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.CSS_SELECTOR, locator))) 
     return True 
    except TimeoutException: 
     return False 

# return True if element is not visible within 2 seconds, otherwise False 
def is_not_visible(self, locator, timeout=2): 
    try: 
     ui.WebDriverWait(driver, timeout).until_not(EC.visibility_of_element_located((By.CSS_SELECTOR, locator))) 
     return True 
    except TimeoutException: 
     return False 

sau đó, bạn có thể sử dụng những cách dễ dàng trong các thử nghiệm của bạn như vậy:

def test_search_no_city_entered_then_city_selected(self): 
    sel = self.selenium 
    sel.get('%s%s' % (self.live_server_url, '/')) 
    self.is_not_visible('#search-error') 
1

Hy vọng rằng điều này giúp

from selenium import webdriver 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.common.by import By 


driver = webdriver.Firefox() 
driver.get('www.url.com') 

try: 
    wait = driver.WebDriverWait(driver,10).until(EC.presence_of_element_located(By.CLASS_NAME,'x')) 
except: 
    pass 
0

Nếu tôi không biết gì về lệnh selenium, tôi sử dụng ý tưởng web selenium RC với firefox. Bạn có thể chọn và thêm lệnh trong combobox và khi hoàn thành trường hợp thử nghiệm của bạn sau khi bạn có thể xuất mã kiểm tra ngôn ngữ khác nhau. như java, ruby, phyton, C#, vv ..

0

dễ dàng hơn giải pháp:

from selenium.webdriver.common.by import By  
    import time 

    while len(driver.find_elements(By.ID, 'cs-paginate-next'))==0: 
     time.sleep(100) 
0

Bạn có thể thay đổi chức năng này để tất cả các loại của các nguyên tố. Phần dưới đây chỉ dành cho thành phần lớp:

Trong đó "trình điều khiển" là trình điều khiển, "element_name" là tên lớp bạn đang tìm kiếm và "giây" là số giây tối đa bạn sẵn sàng chờ.

def wait_for_class_element(driver,element_name,sec): 

    for i in range(sec):   
     try: 
      driver.find_element_by_class_name(element_name) 
      break 
     except:   
      print("not yet") 
      time.sleep(1)