在硒中隐含等待,只用于元素搜索吗



我想了解selenium中隐式等待的用法。

driver.manage().timeouts().implicitlyWait(10000, TimeUnit.SECONDS);

它只用于元素搜索还是用于任何其他目的,如页面加载和刷新?和往常一样,我在驱动程序初始化开始时使用这个。

但在我的应用程序中,我想在输入错误密码后检查错误消息,但一旦我输入错误密码,它就会离开页面,不会在同一页面上等待错误消息。它会只初始化/加载页面一次吗?。当我使用Thread.sleep(3)时,它会在页面上停留3秒,并正确读取错误消息。

但我不想使用Thread.sleep,因为我已经在使用隐式等待了。

谁能告诉我它的用途以及我如何解决这个错误吗?

下面的代码段:(不工作,返回FAILURE)(无线程睡眠)

setText(WebElements.TEXT_BOX, PASSWORD);
click(WebElements.SUBMIT_BUTTON);
//Thread.sleep(3000);
if (isElementPresent(WebElements.ERROR_MESSAGE)) {
return SUCCESS;
}
else 
return FAILURE;

隐式Explicit等待之间的主要区别在于,隐式等待轮询DOM一段定义的时间(比方说10s)并查找元素,而Explicit等待定期将请求发送到服务器并检查DOM中的元素。

隐式等待是固定的,并固定到驱动程序实例。因此,一旦设置了该时间,它就会为整个驱动程序实例设置,并应用于所有地方。有了这一点,当您使用任何命令来查找元素时,它会在定义的时间内轮询DOM,而不会定期与服务器对话/发送另一个请求,如果没有找到,则最终抛出异常。

另一方面,Explicitwait的默认睡眠时间为500ms,除非您明确覆盖它。这意味着它在两个时间间隔之间充当Thread.sleep();,并睡眠500毫秒,之后将请求发送到服务器,并定期检查您定义的元素和条件(定义了轮询时间间隔),并达到超时。

因此,在您的情况下,Thread.Sleep()的工作方式为显式等待。正确的解决方案当然是使用显式等待并定期检查元素及其预期条件。

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;
}

首先单击。然后页面发生变化。在调用isElementPresent()之前,您如何知道页面是否已经加载?

最好不要使用implicityWait(),也不要使用sleep()。使用FluentWait:https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html

FluentWait定期检查您的条件是否为"true"。如果没有(例如,如果页面尚未完全加载),则等待一段时间并再次检查。

我建议您使用下面给出的显式等待

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;
}

隐式、显式和;Fluent等等,你可以在这里找到

最新更新