当前位置: 首页 > 知识库问答 >
问题:

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

孙书
2023-03-14

Selenium提供了显式的等待功能来处理(例如)当您想要对尚未可单击的元素执行单击()操作时的情况。

语法如下:

WebDriverWait(self._driver, 20).until(EC.element_to_be_clickable(BY.ID, 'some-id')).click()

这告诉程序等待,直到某个元素(通过其ID定位)可以单击。

element_to_be_clickable()调用内部_find_element()函数读取element_to_be_clickable()指定的参数。在这种情况下,它在DOM中搜索与ID:sam-id相对应的元素。

但是,我不能直接将WebElement对象传递到element\u to\u be\u clickable()函数中,因为它在内部\u find\u element()调用中失败。

在处理WebElements本身时,有没有一种方法可以使用这些显式等待(或任何替代方法)?

我最初的想法是,在某些情况下,我可以下载代码并添加绕过\u find_element()的功能,但我想知道是否还有其他人遇到过这个问题。

提前谢谢。

共有1个答案

伍成仁
2023-03-14

您可以稍微扩展WebDriverWait操作—不是向其传递驱动程序对象,而是向其传递元素本身,并向until()传递lambda函数。

正如你在它的代码中看到的,WebDriver等到的直到()的"肉"是调用传递函数的参数传递对象,并返回结果:

value = method(self._driver)
if value:
    return value

因此,从理论上讲,您可以传递元素本身,作为一个函数,如果所有检查都匹配,那么表达式将返回元素;如果不匹配,则返回False
要单击的原始元素需要元素中的两件东西(除了它要存在外)显示()和启用()。因此,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通常处理的异常不同(默认情况下,它在等待期间仅处理NoTouchElementException)。如果是这种情况,则必须将这些附加异常传递给其构造函数:

WebDriverWait(self.your_webelemt_object, 20, ignored_exceptions=[NoSuchElementException, the_other_exceptions]).  # the rest omitted for brevity
 类似资料:
  • 我正在尝试自动化基于共享点的应用程序,它有时会很慢。在下面的示例中,我试图将密码输入包装成显式等待。目前,Selenium以快速运行测试,导致无法执行操作。 如何将密码部分包装成硒显式方式?

  • 问题内容: 我正在浏览一个Web应用程序,如果尝试单击某个元素之后才能与之交互,则该Web应用程序通常会引发错误。 使用Selenium WebDriver(java)时,我可以轻松解决此问题: 但是,我试图使用Selenium类型库在VBA中编写脚本,尽管尝试了许多不同的方法,但我唯一的成功是: 有人告诉我,应该尽可能避免这样做。如果有人可以建议如何将Java转换为VBA或提供任何其他解决方案,

  • 我如何用一个显式的替换这个隐式的等待呢? driver=新ChromeDriver(功能); driver.manage().DeleteAllCookies();

  • 问题内容: 我在用: 但是对于以下元素它仍然连续失败 我添加了等待代码: 隐式等待是否应该等到找到一个元素后再进行处理?如果我使用而不是我添加的代码,还会更好吗? 问题答案: TL; DR:始终使用显式等待。忘记隐式等待的存在。 以下是显式等待与隐式等待之间的区别的简要概述: 显式等待: 记录和定义的行为。 在硒的本地部分运行(以你的代码语言显示)。 可以在你能想到的任何条件下工作。 返回成功或超

  • 问题内容: 我是Selenium WebDriver的新手,正在尝试了解“等待”元素出现的正确方法。 我正在测试一个带有单选按钮答案的问题的页面。选择答案时,JavaScript可能启用/禁用页面上的某些问题。 问题似乎是Selenium的“单击速度太快”,而不是等待Javascript完成。我尝试用两种方式解决此问题- 显式等待解决了该问题。具体来说,这可以解决我的问题: 但是,我 宁愿 使用隐

  • 登录后,页面将重定向到一个页面(我想等待页面加载),在那里我通过标记名查找元素, 在这里,我想给出显式等待查找元素,我想等待它的所有可见性或存在。我的网页中只有两个输入。如果我长时间使用隐式等待,代码将起作用。但它各不相同。所以我决定给出显式等待,我怎么能给出显式等待查找元素?或者我如何检查列表中第二个的可见性(列出我的ipt)。即,我的输入(1)。当我给出所有元素()的可见性时,就像下面一样,它