我正在编写一个测试自动化程序,但每个简单的代码行我都在使用“Thread.Sleep”,我知道这是一个不好的做法,每行插入这些命令等待加载我的页面应用程序,我的问题是:如何在我的所有Java项目中设置一段代码,这意味着WAIT FOR LOAD?因为实际上我正在使用Thread.Sleep但实际上效率不高
答案 0 :(得分:0)
似乎Selenium为您提供了合适的解决方案。您应该阅读有关在Selenium中使用waits
的内容,它将等待元素在您想要等待的持续时间内加载,然后继续执行。
您可以在Selenium documentation上阅读此内容。您还可以详细阅读here(它有Java实现)或here(示例代码是Python实现)。
如果需要更多解释,请告诉我。
答案 1 :(得分:0)
以下是您的问题的答案:
Thread.Sleep
:正如您所提到的,I'm using the "Thread.Sleep", i know that is a bad practice
非常正确。 Thread.Sleep()
会降低执行性能。因此,最佳做法建议避免使用Thread.Sleep()
,并使用其他替代方案Implicit Wait
,Explicit Wait
或Fluent Wait
。
Implicit Wait
: Implicit Wait
是一种让测试等待加载网页组件的方法,以便在测试期间可以使用它们。当实现隐式等待时,它告诉WebDriver在尝试查找一个或多个元素(如果它们不是立即可用)时轮询DOM一段时间。默认设置为0.一旦我们设置Implicit Wait
,它就会设置为WebDriver对象实例的生命周期。但是,当应用程序正常响应时,Implicit Wait
可能会减慢我们的测试速度,因为它会等待每个元素出现在DOM中并增加总体执行时间。
一个例子:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Explicit Wait
: Explicit Wait
为我们提供了更大的灵活性,我们可以等待某些预定义或自定义条件,然后继续我们想要的。通过显式等待,我们可以编写自定义代码或条件进行等待,然后再继续执行代码。只有在需要同步且脚本的其余部分正常工作的情况下,才能实现显式等待。 Selenium WebDriver提供了WebDriverWait
和ExpectedCondition
类来实现显式等待。 ExpectedCondition
类提供了一组预定义条件,以便在继续进行代码之前等待。
一个例子:
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("your_xpath")));
Fluent Wait
: Fluent Wait
实例是通过定义等待条件的最大时间量以及检查条件的频率来实现的。用户可以将总等待时间与轮询间隔配置为在等待时忽略特定类型的异常,例如在搜索页面上的元素时NoSuchElementExceptions
。
一个例子:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(250, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
WebElement element = wait.until(new Function<WebDriver, WebElement>()
{
public WebElement apply(WebDriver driver)
{
WebElement ele = driver.findElement(By.id("element_id"));
String value = ele.getAttribute("attribute");
if(value.equalsIgnoreCase("WebDriver"))
{
return ele;
}
else
{
System.out.println("Value is : "+value);
return null;
}
}
});
因此,WAIT FOR LOAD
的解决方案是根据特定元素和具体要素引入 Explicit Wait
和 Fluent Wait
你想要处理的条件。
在这里你会发现更多关于不同等待的documentation。
如果这回答你的问题,请告诉我。