Selenium提供了显式的等待功能,以处理(例如)当您要对尚无法单击的元素执行click()
操作时的情况。
语法如下:
WebDriverWait(self._driver, 20).until(EC.element_to_be_clickable(BY.ID, 'some-id')).click()
这告诉程序等待直到某个元素(通过其ID定位)可单击。
在内部,EC.element_to_be_clickable()
调用内部_find_element()
函数,以读取element_to_be_clickable()
指定的参数。在这种情况下,它将在DOM中搜索与ID相对应的元素:{ {1}}。
但是,我不能直接将some-id
对象传递给WebElement
函数,因为它在内部element_to_be_clickable()
调用中失败。
在与_find_element()
一起工作时,是否可以使用这些显式等待(或其他替代方法)?
我最初的想法是我可以下载代码并添加功能以在某些情况下绕过WebElements
,但想知道是否还有其他人遇到过此问题。
先谢谢了。
答案 0 :(得分:1)
您可以稍微扩展WebDriverWait操作-通过将元素本身和lambda函数传递给until()
而不是驱动程序对象,而不是驱动程序对象。
正如您在其代码中所看到的,WebDriverWait的{肉{1}}是将带有参数的传递函数调用传递的对象,并返回结果:
until()
因此,从理论上讲,您可以传递元素本身,并作为函数使用一个表达式,如果所有检查都匹配,则返回该元素;否则返回value = method(self._driver)
if value:
return value
。
原始的False
期望元素中有两件事(除了存在之外)-element_to_be_clickable
和is_displayed()
。因此,在lambda中的表达式为:
is_enabled()
整个通话他都会:
lambda x: x if x.is_displayed() and x.is_enabled() else False
我说“从理论上讲”,是因为我在移动设备上输入了:),但在实践中尚未对其进行检查(但理论是可靠的;)。可能出什么问题了?将引发一个异常,该异常不同于WebDriverWait通常处理的异常(默认情况下,它在等待期间仅处理WebDriverWait(self.your_webelemt_object, 20).until(lambda x: x if x.is_displayed() and x.is_enabled() else False).click()
)。如果是这种情况,则必须将这些其他异常传递给其构造函数:
NoSuchElementException