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

jac*_*118 8 python selenium selenium-webdriver

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

TypeError:'bool'对象不可调用

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"))    
Run Code Online (Sandbox Code Playgroud)

jac*_*118 7

我最终要做的是使用 lambda

self.wait.until(lambda x: waittest(driver, "//div[@id="text"]", "myCSSClass", "false"))
Run Code Online (Sandbox Code Playgroud)


Dmy*_*iuk 5

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

WebDriverWait(driver, 10).until(
    lambda wd: len(wd.find_elements(By.XPATH, 'an xpath')) == 2
)
Run Code Online (Sandbox Code Playgroud)

waittest函数必须重写为:

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
Run Code Online (Sandbox Code Playgroud)

然后可以用作

element = WebDriverWait(driver, 10).until(
    waittest('//div[@id="text"]', "myCSSClass", "false")
)
Run Code Online (Sandbox Code Playgroud)