在java selenium-webdriver包中,有一个FluentWait
类:
每个FluentWait实例定义等待的最长时间 对于一个条件,以及检查的条件 条件。此外,用户可以配置等待忽略 等待时的特定类型的例外,例如 搜索页面上的元素时的NoSuchElementExceptions。
换句话说,它超过implicit and explicit wait,可以让您更好地控制等待元素。它可以非常方便,绝对有用例。
python selenium package中是否有类似内容,或者我应该自己实施?
(我已查看Waits的文档 - 没有任何内容。
答案 0 :(得分:20)
我相信你可以用Python做到这一点,但它并不像FluentWait类那样打包。其中一些内容已在您提供的文档中进行了详细介绍。
WebDriverWait类具有timeout,poll_frequency和ignored_exceptions的可选参数。所以你可以在那里供应。然后将它与预期条件结合起来等待元素出现,可点击等等......这是一个例子:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import *
driver = webdriver.Firefox()
# Load some webpage
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))
显然你可以将wait / element合并到一个语句中,但我想通过这种方式你可以看到它的实现位置。
答案 1 :(得分:7)
iChar的答案涵盖了如何在Python中使用WebDriverWait
来完成FluentWait
在Java中所做的事情。然而,问题的某些方面没有得到解决:
换句话说,[
FluentWait
]不仅仅是隐式和显式等待
没有。从Selenium的2.42.x版开始,Selenium实现的只有两种等待:隐式和显式。 FluentWait
不是这两种等待的补充。这只是一个明确的等待。
python selenium包中有什么类似的,或者我应该自己实现它?
我唯一可以想到的是,WebDriverWait
实现FluentWait
(以及WebDriverWait
,扩展名)具有以下功能:
[
FluentWait
(并且,通过扩展,WebDriverWait
)] 可以动态配置其超时和轮询间隔。
[引自this。]
Python中的WebDriverWait
类的设计方式使其配置值在创建时一劳永逸地设置。 FluentWait
允许在创建后更改其配置。因此,可以重用单个 FluentWait
对象(或Java中的任何WebDriverWait
对象来等待具有不同轮询频率的不同条件。在Python中,您必须创建一个新的WebDriverWait
对象以使用不同的轮询频率。
因此,Python实现没有提供某些,但我认为这不足以保证实现。
答案 2 :(得分:1)
上述实现在我的用例中效果不佳,因此我也将分享我的实现。 对于流畅的等待,在轮询时检查其他一些条件也很不错,例如,我们可以检查元素的属性是否已更改。因此,在我的情况下,应该刷新页面。下面是代码[调整30秒(循环的6倍,每秒5次)]:
element = None
i = 6
while element is None:
try:
wait = WebDriverWait(driver, 5, poll_frequency=1)
element = wait.until(expected_conditions.visibility_of_element_located(el))
except:
driver.refresh()
i = i - 1
print(i)
if i < 0:
raise Exception('Element not found')
答案 3 :(得分:1)
作为上述答案之一,WebDriverWait类具有用于超时,poll_frequency和ignore_exceptions的可选参数。此外,如果可用的预期条件不能满足您的需求,则可以按照此处https://selenium-python.readthedocs.io/waits.html中的文档创建自定义等待条件 下面是轮询直到元素具有预期文本为止的代码
wait=WebDriverWait(driver,timeout=10,poll_frequency=1)
element=wait.until(element_has_text((By.CSS_SELECTOR,"div#finish>h4"),"Hello World!"))
class element_has_text(object):
"""An expectation for checking that an element has a particular text.
locator - used to find the element
returns the WebElement once it has the particular text
"""
def __init__(self,locator,expected_text):
self.locator=locator
self.expected_text=expected_text
def __call__(self,driver):
element = driver.find_element(*self.locator)
if (element.text==self.expected_text):
return element
else:
return False