Selenium:使用WebElement进行显式等待的预期条件

问题描述 投票:1回答:1

当您想要对尚未可点击的元素执行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(),但想知道是否有其他人有这个问题。

提前致谢。

python selenium
1个回答
1
投票

你可以稍微扩展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
© www.soinside.com 2019 - 2024. All rights reserved.