我尝试在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"))
发布于 2017-11-27 17:03:10
我真正要做的是使用lambda
self.wait.until(lambda x: waittest(driver, "//div[@id="text"]", "myCSSClass", "false"))
发布于 2018-12-21 15:39:30
WebDriverWait(driver, 10).until()
接受一个可调用的对象,该对象将接受webdriver的一个实例(driver
是我们的例子)作为参数。最简单的自定义等待(它希望看到2个元素)如下所示
WebDriverWait(driver, 10).until(
lambda wd: len(wd.find_elements(By.XPATH, 'an xpath')) == 2
)
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
然后它可以被用作
element = WebDriverWait(driver, 10).until(
waittest('//div[@id="text"]', "myCSSClass", "false")
)
发布于 2017-11-21 20:28:53
selenium中的wait.until(..)
函数需要一个可以调用的函数。然而,实际上,您给了它一个布尔值。
element = wait.until(waittest(driver, '//div[@id="text"]', "myCSSClass", "false"))
可重写为:
value = waittest(driver, '//div[@id="text"]', "myCSSClass", "false")
element = wait.until(value)
这使得这更清楚--等待测试返回一个布尔值,而wait.until(..)
试图将其作为函数调用--因此'bool' object is not callable
。
您需要让您的自定义条件返回一个函数,selenium可以调用该函数来检查它是否为真。您可以通过在您的函数中定义一个函数来做到这一点:
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
https://stackoverflow.com/questions/47420957
复制相似问题