使用 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详解——小白进阶之路(二)