WebDriver中的隐式等待不会暂停执行

时间:2017-08-30 09:27:54

标签: java selenium xpath webdriver

我初始化并设置我的驱动程序如下:

System.setProperty("webdriver.firefox.bin", Vars.FFPATH);
System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setAcceptInsecureCerts(true);
WebDriver driver = new FirefoxDriver(desiredCapabilities);
driver.navigate().to(siteurl);
driver.manage().timeouts().implicitlyWait(30, SECONDS);

我认为,它应该在执行其余代码之前等待30秒。 它没有工作,没有等待时间,执行只需8秒。 我试图使用FluentWait来等待elemnt可点击等待时间。

FluentWait<WebDriver> wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.elementToBeClickable(webpage.linput));

错误讯息:

  

java.lang.NullPointerException at   com.google.common.base.Preconditions.checkNotNull(Preconditions.java:787)     在   org.openqa.selenium.support.ui.FluentWait。(FluentWait.java:102)     在   org.openqa.selenium.support.ui.WebDriverWait。(WebDriverWait.java:71)     在   org.openqa.selenium.support.ui.WebDriverWait。(WebDriverWait.java:45)

我用webpage.linput检查了变量Logger,它有一个有效值,即给定元素的xpath,所以它不是null。 这里创建的变量:

By linput = By.xpath("//*[@id=\"formA\"]/p[1]/label");

版本:

WebDriver 3.5.2
GeckoDriver 0.18.0
Firefox 55.0.3

3 个答案:

答案 0 :(得分:1)

一些事情。

<强> implicitlyWait

它不应该

driver.navigate().to(siteurl);
driver.manage().timeouts().implicitlyWait(30, SECONDS);

应该是

driver.manage().timeouts().implicitlyWait(30, SECONDS);
driver.navigate().to(siteurl);

此外,隐式等待不会暂停执行,只会增加每个操作的超时(即findElement,click)

<强> pageLoadTiemout:

另外,如果你想增加页面加载的时间,隐式等待也无济于事。你应该使用pageLoadTiemout

检查以下页面。 https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html

第二个问题

用户webdriver等待而不是流利的等待。

WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.elementToBeClickable(webpage.linput));

如果您只想暂停执行

使用Thread.sleep()方法。

答案 1 :(得分:1)

关于 Implicit Wait 的几句话:

ImplicitWait根据官方documentation配置 WebDriver 实例,即driver来轮询 {{1} <}> 一段时间( HTML DOM NANOSECONDS MICROSECONDS < / strong>, MILLISECONDS SECONDS MINUTES {{1} } )尝试查找一个或多个元素时,如果它们不是立即可用的。默认设置为 0 ,这意味着HOURS在找到查找元素的指令时,搜索开始,结果立即可用。

根据您的代码,您已将 DAYS 初始化为:

driver

ImplicitWait从未被调用过。要了解有关 driver.manage().timeouts().implicitlyWait(30, SECONDS); 的更多信息,您可以查看此discussion

最后,您已启动End Point,但代码中不存在ImplicitWait的实施。您的代码使FluentWait的实现产生共鸣。因此,您面对 FluentWait

解决方案:

在您的代码块中没有任何其他代码行我觉得您不需要任何等待( WebDriverWait NullPointerException ImplicitWait )。你可以在不启动其中任何一个的情况下继续进行。

更新

如果您需要等待任何特定WebDriverWait的任何特定状态,Selenium已提供内置的 FluentWait ,即 WebElement < / strong>您可以从50个奇数 ExplicitWait 条件中进行选择。有关详细信息,请参阅此documentation和此discussion

答案 2 :(得分:1)

在URL之前使用implicit wait,如下所示:

driver.manage().timeouts().implicitlyWait(30, SECONDS);
driver.navigate().to(siteurl);

使用Explicit wait代替fluent wait,如下所示代码:

WebDriverWait waitForElement = new WebDriverWait(driver, 5);
waitForElement.until(ExpectedConditions.elementToBeClickable(webpage.linput));