gpt4 book ai didi

java - Selenium:让 findElements 等待可见元素,尽管存在不可见元素

转载 作者:行者123 更新时间:2023-12-02 04:13:34 24 4
gpt4 key购买 nike

我们想要将一些键发送到由名称标识的元素。在应用程序中可能有多个具有相同名称的元素,但在这种情况下只有一个可见。为此,我们有一个类似的代码片段(简单代码,无生产代码):

List<WebElement> list = driver.findElements(By.xpath("//[@name='title']"));
for (WebElement elem : list) {
try {
elem.sendKeys(value);
break;
} catch (Exception e) {
// ignore
}
}

如果 title 元素还不存在,我们使用隐式等待等待它出现。所以通常这会工作得很好。不管怎样,我们有时会遇到这样的情况:已经存在具有该名称的元素(但被隐藏),而正确的元素将由异步代码创建。但在这种情况下,代码将不起作用。由于 findElements() 将立即返回(没有隐式等待),仅返回不可见元素。在这种情况下,sendKeys() 将等待元素变得可见,但这永远不会发生(忽略 findElements 之后创建的新元素),因此它在隐式等待超时后失败。

基本上,我们需要能够告诉 findElements() 我们只想拥有可见元素。如果没有可见元素,Selenium 应该等待隐式等待持续时间。这可能吗?

最佳答案

由于您的用例涉及:

  • 可能有多个同名元素,但在这种情况下只有一个可见
  • 将一些键发送到由名称标识的元素
  • 等待它出现
  • 使用隐式等待

满足上述所有条件的多用途解决方案是将 WebDriverWait 与设置为 elementToBeClickable()ExpectedConditions 结合使用。

  • elementToBeClickable():检查元素的期望是可见的并且已启用,以便您可以单击它。

  • 代码示例:

    try {
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='nsg-button']"))).sendKeys(value);
    }
    catch (TimeoutException e) {
    System.out.println("Desired element was not present");
    }

此外,您必须删除 ImplicitWait 的所有实例

Note: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example setting an implicit wait of 10 seconds and an explicit wait of 15 seconds, could cause a timeout to occur after 20 seconds.

您可以在Replace implicit wait with explicit wait (selenium webdriver & java)中找到相关讨论

关于java - Selenium:让 findElements 等待可见元素,尽管存在不可见元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com