硒 waitForElement
- 2025-02-27 09:06:00
- admin 原创
- 70
问题描述:
如何在 Python 中编写函数让 Selenium 等待仅具有类标识符的表?我在学习使用 Selenium 的 Python webdriver 函数时遇到了很多麻烦。
解决方案 1:
来自Selenium 文档 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)
解决方案 2:
Selenium 2 的 Python 绑定有一个名为 expected_conditions.py 的新支持类,用于执行各种操作,例如测试元素是否可见。可在此处获取。
注意:截至 2012 年 10 月 12 日,上述文件已在主干中,但尚未在最新下载中,最新下载仍为 2.25。在发布新 Selenium 版本之前,您暂时可以将此文件保存在本地,然后将其包含在导入中,就像我下面所做的那样。
为了让生活更简单一点,你可以将其中一些预期条件方法与 Seleniumwait until
逻辑结合起来,制作出一些非常方便的功能,类似于 Selenium 1 中提供的功能。例如,我将其放入名为 SeleniumTest 的基类中,我的所有 Selenium 测试类都对其进行了扩展:
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
然后您可以在测试中轻松地使用它们,如下所示:
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')
解决方案 3:
我使用过以下产品,获得了很好的体验:
时间.睡眠(秒)
webdriver.Firefox.implicitly_wait(秒)
第一个非常明显——只需等待几秒钟即可。
对于我的所有 Selenium 脚本,当我在笔记本电脑上运行它们时,sleep() 几秒钟(范围从 1 到 3)就可以正常工作,但在我的服务器上,等待的时间范围更广,因此我也使用 implicitly_wait()。我通常使用 implicitly_wait(30),这确实足够了。
隐式等待是指当 WebDriver 尝试查找一个或多个元素(如果它们不是立即可用的)时,在一定时间内轮询 DOM。默认设置为 0。一旦设置,隐式等待将设置为 WebDriver 对象实例的生命周期。
解决方案 4:
由于 python selenium 驱动程序不支持此功能,因此我为 python 实现了以下 wait_for_condition。
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)
用作
等待 ExtJS Ajax 调用不再挂起:
wait_for_condition("!Ext.Ajax.isLoading()")
设置了 Javascript 变量
wait_for_condition("CG.discovery != undefined;")
ETC。
解决方案 5:
您始终可以在循环中使用短暂睡眠并将元素 ID 传递给它:
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
解决方案 6:
与适当的 XPath 定位器一起使用Wait Until Page Contains Element
。例如,给定以下 HTML:
<body>
<div id="myDiv">
<table class="myTable">
<!-- implementation -->
</table>
</div>
</body>
...您可以输入以下关键字:
Wait Until Page Contains Element //table[@class='myTable'] 5 seconds
除非我错过了什么,否则没有必要为此创建新功能。
解决方案 7:
如果这有帮助的话......
在 Selenium IDE 中,我添加了... 命令:waitForElementPresent 目标://table[@class='pln']
然后我执行文件>将 TestCase 导出为 Python2(Web 驱动程序),它给了我这个......
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")
解决方案 8:
更简单的解决方案:
from selenium.webdriver.common.by import By
import time
while len(driver.find_elements(By.ID, 'cs-paginate-next'))==0:
time.sleep(100)
解决方案 9:
希望这能有所帮助
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
解决方案 10:
如果我对 selenium 命令不了解,我会使用带有 Firefox 的 selenium web idea RC。您可以在组合框中选择并添加命令,完成测试用例后,您可以导出不同语言的测试代码。例如 java、ruby、phyton、C# 等。
解决方案 11:
您可以将此功能修改为所有类型的元素。下面的代码仅适用于类元素:
其中“driver”是驱动程序,“element_name”是您要查找的类名,“sec”是您愿意等待的最大秒数。
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)
解决方案 12:
我找到了一种更简单的方法来构建它,使用自定义函数,它本质上是递归的
from selenium import webdriver
import time
def wait_element_by_id(id_value):
try:
elem = driver.find_element_by_id(id_value)
except:
time.sleep(2)
print 'Waiting for id '+id_value
wait_element_by_id(id_value)
您可以find_element_by_id
根据需要替换find_element_by_name
或find_element_by_tag_name
解决方案 13:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
# wait until present
WebDriverWait(driver, waittime).until(
EC.presence_of_element_located((By.CSS_SELECTOR, css_selector))
)
# wait until visible
WebDriverWait(driver, waittime).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
)
解决方案 14:
我希望这可能会有所帮助:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
driver = webdriver.Chrome()
driver.get(myURL)
wait = WebDriverWait(driver, 10)
wait.until(ec.presence_of_element_located((By.XPATH, myXPATH)))
我建议你读一下这篇文章,以便更加清楚。
扫码咨询,免费领取项目管理大礼包!