硒:使用WebElement进行明确等待的预期条件

时间:2019-04-03 15:21:51

标签: python selenium

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,但想知道是否还有其他人遇到过此问题。

先谢谢了。

1 个答案:

答案 0 :(得分:1)

您可以稍微扩展WebDriverWait操作-通过将元素本身和lambda函数传递给until()而不是驱动程序对象,而不是驱动程序对象。

正如您在其代码中所看到的,WebDriverWait的{肉{1}}是将带有参数的传递函数调用传递的对象,并返回结果:

until()

因此,从理论上讲,您可以传递元素本身,并作为函数使用一个表达式,如果所有检查都匹配,则返回该元素;否则返回value = method(self._driver) if value: return value
原始的False期望元素中有两件事(除了存在之外)-element_to_be_clickableis_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