我想知道使用的 driver.manage()。timeouts()。implicitlyWait(10000,TimeUnit.SECONDS);
它是仅用于元素搜索还是用于页面加载和刷新等任何其他目的?
我在驱动程序初始化的开始使用它。
但是在我的应用程序中我想在输入错误的密码后检查错误消息,但是一旦我输入错误的密码,它将离开页面并且不会在同一页面上等待错误消息。它将初始化/只加载一次页面,当我使用Thread.sleep(3)时,它在页面停止3秒并正确读取错误信息。
但我不想使用Thread.sleep,因为我已经在使用driver.manage()。timeouts()。implicitlyWait(0,TimeUnit.SECONDS)
有谁能告诉我它的用途以及我如何解决这个错误?
代码段:(不工作,返回FAILURE) (没有Thread.sleep)
setText(WebElements.TEXT_BOX, PASSWORD);
click(WebElements.SUBMIT_BUTTON);
//Thread.sleep(3000);
if (isElementPresent(WebElements.ERROR_MESSAGE)) {
return SUCCESS;
}
else
return FAILURE;
答案 0 :(得分:1)
隐式和显式等待的主要区别在于隐式等待轮询 DOM 定义的时间量(比方说10s) )并查找元素,而显式等待周期性地将请求发送到服务器并检查DOM中的元素。
隐式等待是坚定的并且固定在驱动程序实例上。因此,一旦设置了该时间,就会为整个驱动程序实例设置并应用于所有地方。有了这个,当你使用任何命令来查找一个元素时,它会轮询DOM定义的时间,而不会定期与服务器/发送另一个请求,如果没有找到,最后会抛出异常。< / p>
另一方面,除非明确覆盖,否则显式等待有default time 500毫秒的睡眠时间。这意味着它在间隔和休眠之间充当Thread.sleep();
500ms,然后将请求发送到服务器并定期检查您定义的元素和条件,并定义轮询间隔并达到超时。
因此,在您的情况下,Thread.Sleep()
正在作为显式等待。正确的解决方案当然是使用 Explicit 等待并定期检查元素及其预期条件。
setText(WebElements.TEXT_BOX, PASSWORD);
WebDriverWait wait = new WebDriverWait(driver,10);
try{
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("id of the element to be located")));
return SUCCESS;
}
catch (NoSuchElementException exception)
{
return FAILURE;
}
答案 1 :(得分:-1)
首先点击一下。然后页面改变了。在调用isElementPresent()之前,如果页面已经加载,你怎么知道?
最好不要使用implicitlyWait()而不是sleep()。使用FluentWait: https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html
FluentWait会定期检查您的情况是否为&#34;为真&#34;。如果没有(例如,如果页面尚未完全加载),则等待一段时间并再次检查。
答案 2 :(得分:-1)
我建议你使用下面给出的显式等待
int wait = 10;
WebDriverWait WAIT = new WebDriverWait(driver,wait);
try{
WAIT.until(ExpectedConditions.presenceOfElementLocated(By.id("id of element")));
return SUCCESS;
}
catch (NoSuchElementException exception)
{
return FAILURE;
}
隐性,明确和差异之间的差异流利等待您可以找到here