首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中创建自定义等待条件

在Python中创建自定义等待条件
EN

Stack Overflow用户
提问于 2017-11-21 19:15:42
回答 4查看 11.9K关注 0票数 18

我尝试在Python中创建一个带有自定义等待条件的函数。但是,我得到了一个错误:

TypeError:“bool”对象不可调用

代码语言:javascript
运行
复制
def waittest(driver, locator, attr, value):
    element = driver.find_element_by_xpath(locator)
    if element.get_attribute(attr) == value:
        return element
    else:
        return False
wait = WebDriverWait(driver, 10)
element = wait.until(waittest(driver, '//div[@id="text"]', "myCSSClass", "false"))    
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-27 17:03:10

我真正要做的是使用lambda

代码语言:javascript
运行
复制
self.wait.until(lambda x: waittest(driver, "//div[@id="text"]", "myCSSClass", "false"))
票数 11
EN

Stack Overflow用户

发布于 2018-12-21 15:39:30

WebDriverWait(driver, 10).until()接受一个可调用的对象,该对象将接受webdriver的一个实例(driver是我们的例子)作为参数。最简单的自定义等待(它希望看到2个元素)如下所示

代码语言:javascript
运行
复制
WebDriverWait(driver, 10).until(
    lambda wd: len(wd.find_elements(By.XPATH, 'an xpath')) == 2
)

waittest函数必须重写为:

代码语言:javascript
运行
复制
class waittest:
    def __init__(self, locator, attr, value):
        self._locator = locator
        self._attribute = attr
        self._attribute_value = value

    def __call__(self, driver):
        element = driver.find_element_by_xpath(self._locator)
        if element.get_attribute(self._attribute) == self._attribute_value:
            return element
        else:
            return False

然后它可以被用作

代码语言:javascript
运行
复制
element = WebDriverWait(driver, 10).until(
    waittest('//div[@id="text"]', "myCSSClass", "false")
)
票数 20
EN

Stack Overflow用户

发布于 2017-11-21 20:28:53

selenium中的wait.until(..)函数需要一个可以调用的函数。然而,实际上,您给了它一个布尔值。

代码语言:javascript
运行
复制
element = wait.until(waittest(driver, '//div[@id="text"]', "myCSSClass", "false"))

可重写为:

代码语言:javascript
运行
复制
value = waittest(driver, '//div[@id="text"]', "myCSSClass", "false")
element = wait.until(value)

这使得这更清楚--等待测试返回一个布尔值,而wait.until(..)试图将其作为函数调用--因此'bool' object is not callable

您需要让您的自定义条件返回一个函数,selenium可以调用该函数来检查它是否为真。您可以通过在您的函数中定义一个函数来做到这一点:

代码语言:javascript
运行
复制
def waittest(locator, attr, value):
    def check_condition(driver):
        element = driver.find_element_by_xpath(locator)
        if element.get_attribute(attr) == value:
            return element
        else:
            return False
    return check_condition
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47420957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档