我初始化并设置我的驱动程序如下:
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
答案 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));