使用 Selenium webdriver 等待一个元素

Posted

技术标签:

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

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

我的场景:

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

欢迎所有建议...:)

【问题讨论】:

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

【讨论】:

以上是关于使用 Selenium webdriver 等待一个元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 Selenium webdriver 等待一个元素

selenium 设置元素等待

selenium之webdriver详解——小白进阶之路(二)

Selenium WebDriver JS - 显式等待

Selenium with Python 008 - WebDriver 元素等待

Python+Selenium笔记:元素等待机制