Java Fluent在Python中等待

时间:2014-09-08 15:04:54

标签: java python selenium selenium-webdriver wait

在java selenium-webdriver包中,有一个FluentWait类:

  

每个FluentWait实例定义等待的最长时间   对于一个条件,以及检查的条件   条件。此外,用户可以配置等待忽略   等待时的特定类型的例外,例如   搜索页面上的元素时的NoSuchElementExceptions。

换句话说,它超过implicit and explicit wait,可以让您更好地控制等待元素。它可以非常方便,绝对有用例。

python selenium package中是否有类似内容,或者我应该自己实施?

(我已查看Waits的文档 - 没有任何内容。

4 个答案:

答案 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