【问题标题】:Wait for an element using Selenium webdriver使用 Selenium webdriver 等待一个元素
【发布时间】:2013-08-06 11:13:51
【问题描述】:

等待元素出现在网页上的最佳方式是什么?我读过我们可以使用隐式等待和 webdriverwait、fluentwait 等函数,最后但并非最不重要的是 thread.sleep()...我使用最多但想完全停止使用。

我的场景:

用户登录到网站...网站检查凭据并以覆盖的形式向用户提供优惠(一种弹出窗口,但不是单独的窗口)。我需要验证叠加层上的文本。 用户登录和显示叠加层之间存在时间间隔。什么是最好的方法,以便硒只等到元素不可见的时候。由于覆盖不是单独的页面,而是主页面的一部分,所以隐式等待根本不起作用。

欢迎所有建议...:)

【问题讨论】:

  • 我建议使用 fluent wait,因为它可以很好地控制 ping 时间和总持续时间。但是除非您指定的时间很少,否则隐式等待也应该起作用。可能您正在检查元素是否存在并且此时代码正在中断。
  • 我建议使用 webdriverwait 或 fluentwait。我不喜欢隐式等待,我绝对不喜欢 sleep(),因为两者都经常在不需要的时候导致等待。您可以使用 wait.until() 等待相当多的 ExpectedConditions

标签: selenium selenium-webdriver


【解决方案1】:

始终从使用隐式等待开始。我认为 Selenium 默认为 5 秒,因此如果您执行 driver.findElement(),则意味着它将等待长达 5 秒。那应该这样做。如果您遇到所需时间不可预测的情况,请使用 FluentWait(具有相同的 5 秒超时)但也使用 .ignoring 方法并将其包装在一个 while 循环中。基本思路如下:

int tries=0;
while ( tries < 3 ) {
  //fluent wait (with .ignoring) inside here
  tries ++1;
}

【讨论】:

    【解决方案2】:
    WebDriverWait wait = new WebDriverWait(driver, 20);
    wait.until(ExpectedConditions.elementToBeClickable(By.id("optionsBuilderSelect_input")));
    

    我是一个专业的爬虫 (http://nitinsurana.com) 我已经使用 selenium 编写了 30 多个软件,但我从未遇到过任何此类问题,反正上面是示例代码。

    我能想到的就是必须检查直到条件,因为很多时候元素已经可见,但它们不可点击等等。我想您应该尝试不同的选项,希望您能找到所需的选项。

    【讨论】:

      【解决方案3】:
      public boolean waitForElement(WebElement ele, String xpath, int seconds) throws InterruptedException{
          //returns true if the xpath appears in the webElement within the time
          //false when timed out
          int t=0;
          while(t<seconds*10){
              if(ele.findElements(By.xpath(xpath)).size()>0)
                  return true;
              else{
                  Thread.sleep(100);
                  t++;
                  continue;
              }
          }       
          System.out.println("waited for "+seconds+"seconds. But couldn't find "+xpath+ " in the element specified");
          return false;
      }
      

      【讨论】:

        【解决方案4】:

        您可以等待元素出现,如下所示:

        new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("someId")));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-26
          • 2016-12-25
          • 1970-01-01
          • 2016-07-28
          • 2012-07-28
          • 1970-01-01
          • 2017-10-04
          • 2021-04-01
          相关资源
          最近更新 更多