硒中是否隐式等待,仅用于元素搜索?
Does implicit wait in selenium, only used for element search?
想了解selenium中隐式等待的用法。
driver.manage().timeouts().implicitlyWait(10000, TimeUnit.SECONDS);
它是否仅用于元素搜索或用于页面加载和刷新等任何其他目的?像往常一样,我在驱动程序初始化开始时使用它。
但是在我的应用程序中,我想在输入错误的密码后检查错误消息,但是一旦我输入错误的密码,它就会离开页面,不会等待同一页面上的错误消息。会不会 initialize/load 页面只显示一次?。当我使用 Thread.sleep(3) 时,它会在页面上停留 3 秒,并正确读取错误消息。
但我不想使用 Thread.sleep,因为我已经在使用隐式等待。
谁能告诉我它的用途以及如何解决这个错误?
下面的代码片段:(不工作,返回失败)
(没有 Thread.sleep)
setText(WebElements.TEXT_BOX, PASSWORD);
click(WebElements.SUBMIT_BUTTON);
//Thread.sleep(3000);
if (isElementPresent(WebElements.ERROR_MESSAGE)) {
return SUCCESS;
}
else
return FAILURE;
首先点击一下。然后页面发生变化。在调用 isElementPresent() 之前,您如何知道页面是否已经加载?
最好不要使用 implicitlyWait() 而不是 sleep()。使用 FluentWait:
https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html
FluentWait 会定期检查您的情况是否 "true"。如果没有(例如,如果页面尚未完全加载),请等待一段时间并再次检查。
隐式和显式等待之间的主要区别是隐式等待轮询DOM 一段定义的时间(比如说 10 秒)并查找元素,而显式等待会定期向服务器发送请求并检查 DOM 中的元素。
隐式等待是固定的并固定到驱动程序实例。因此,一旦您设置了该时间,它就会为整个驱动程序实例设置并应用到所有地方。有了它,当您使用任何命令查找元素时,它会在定义的时间段内轮询 DOM ,而无需定期与 server/sending 另一个请求 交谈如果没有找到,最后抛出异常。
另一方面,显式 等待有一个 default time 500 毫秒的睡眠时间,除非您明确覆盖它。这意味着它在间隔和睡眠之间充当 Thread.sleep();
500 毫秒,然后将请求发送到服务器并定期检查您使用定义的轮询间隔定义的元素和条件并达到超时。
因此,在您的情况下,Thread.Sleep()
正在作为 Explicit 等待。正确的解决方案当然是使用 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;
}
我建议您使用下面给出的显式等待
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
想了解selenium中隐式等待的用法。
driver.manage().timeouts().implicitlyWait(10000, TimeUnit.SECONDS);
它是否仅用于元素搜索或用于页面加载和刷新等任何其他目的?像往常一样,我在驱动程序初始化开始时使用它。
但是在我的应用程序中,我想在输入错误的密码后检查错误消息,但是一旦我输入错误的密码,它就会离开页面,不会等待同一页面上的错误消息。会不会 initialize/load 页面只显示一次?。当我使用 Thread.sleep(3) 时,它会在页面上停留 3 秒,并正确读取错误消息。
但我不想使用 Thread.sleep,因为我已经在使用隐式等待。
谁能告诉我它的用途以及如何解决这个错误?
下面的代码片段:(不工作,返回失败) (没有 Thread.sleep)
setText(WebElements.TEXT_BOX, PASSWORD);
click(WebElements.SUBMIT_BUTTON);
//Thread.sleep(3000);
if (isElementPresent(WebElements.ERROR_MESSAGE)) {
return SUCCESS;
}
else
return FAILURE;
首先点击一下。然后页面发生变化。在调用 isElementPresent() 之前,您如何知道页面是否已经加载?
最好不要使用 implicitlyWait() 而不是 sleep()。使用 FluentWait: https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html
FluentWait 会定期检查您的情况是否 "true"。如果没有(例如,如果页面尚未完全加载),请等待一段时间并再次检查。
隐式和显式等待之间的主要区别是隐式等待轮询DOM 一段定义的时间(比如说 10 秒)并查找元素,而显式等待会定期向服务器发送请求并检查 DOM 中的元素。
隐式等待是固定的并固定到驱动程序实例。因此,一旦您设置了该时间,它就会为整个驱动程序实例设置并应用到所有地方。有了它,当您使用任何命令查找元素时,它会在定义的时间段内轮询 DOM ,而无需定期与 server/sending 另一个请求 交谈如果没有找到,最后抛出异常。
另一方面,显式 等待有一个 default time 500 毫秒的睡眠时间,除非您明确覆盖它。这意味着它在间隔和睡眠之间充当 Thread.sleep();
500 毫秒,然后将请求发送到服务器并定期检查您使用定义的轮询间隔定义的元素和条件并达到超时。
因此,在您的情况下,Thread.Sleep()
正在作为 Explicit 等待。正确的解决方案当然是使用 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;
}
我建议您使用下面给出的显式等待
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