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
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)
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.
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.
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")
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
Woohoo! Điều này làm việc như một nhà vô địch: 'wait_for_condition (" $(). Active == 0 ")' – mattmc3
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
Đây là điều mà WebdriverWait thực hiện :) – erm3nda
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')
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
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 ..
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)
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)
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" –
@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
Công trình này hoàn hảo cho tôi! Cảm ơn. – swdev