当您想要对尚未可点击的元素执行click()
操作时,Selenium提供显式等待功能来处理情况(例如)。
语法如下:
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对应的元素:some-id
。
但是,我不能直接将WebElement
对象传入element_to_be_clickable()
函数,因为它在内部_find_element()
调用中失败了。
有没有办法在使用WebElements
自己时使用这些明确的等待(或任何替代方案)?
我最初的想法是,我可以下载代码并添加功能,以在某些条件下绕过_find_element()
,但想知道是否有其他人有这个问题。
提前致谢。
你可以稍微扩展WebDriverWait操作 - 通过传递给它不是驱动程序对象,而是传递元素本身,以及传递给until()
的lambda函数。
正如你在其代码中看到的那样,WebDriverWait的until()
的“肉”是用传递的对象调用传递的函数,并返回结果:
value = method(self._driver)
if value:
return value
所以从理论上讲,你可以传递元素本身,并且作为一个函数,如果所有检查都匹配,则返回元素,如果不匹配,则返回False
。
最初的element_to_be_clickable
期待元素中的两件事(除了它存在) - is_displayed()
和is_enabled()
。因此,lambda中的表达式将是:
lambda x: x if x.is_displayed() and x.is_enabled() else False
整个电话会是:
WebDriverWait(self.your_webelemt_object, 20).until(lambda x: x if x.is_displayed() and x.is_enabled() else False).click()
我说“在理论上”,因为我在移动设备上输入这个:),我没有在实践中检查它(但是理论是坚实的;)。怎么可能出错?引发的异常,与WebDriverWait通常处理的异常不同(默认情况下,它在等待时只处理NoSuchElementException
)。如果是这种情况,则必须将这些额外的异常传递给其构造函数:
WebDriverWait(self.your_webelemt_object, 20, ignored_exceptions=[NoSuchElementException, the_other_exceptions]). # the rest omitted for brevity