Explicit wait(显式等待)
【场景1:登录一个网站,输入用户名和密码后,点击登录,需要加载好几秒钟才能进入用户中心。例如你登录你网银,用户名和密码验证通过后,它需要等几秒,才能显示你账户信息,这几秒,它需要去数据库查询数据并显示在前端。
场景2:你登录一个旅行网站,填好了出发起点和目的地,点击搜索,需要查询等待几秒,然后给你显示车票信息。】
webdriver的针对某个元素的明确等待
public class ExplicitWait {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.gecko.driver", ".\\Tools\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("https://www.icloud.com/");
//创建一个WebDriverWait类的一个对象wait,设置5秒
WebDriverWait wait=new WebDriverWait(driver,15);
driver.switchTo().frame("auth-frame");
WebElement ele=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div/apple-auth/div/div[1]/logo/div/img")));
boolean status=ele.isDisplayed();
if(status) {
System.out.println("可见");
}else {
System.out.println("不可见");
}
}
Sleep(强制等待)
强制当前正在执行的线程休眠
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)
每一个元素可能需要加载的地方都需要设置sleep等待时间
ImplicitlyWait(隐式等待)
是指对整个页面的加载
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
使用implicitlyWait或者明确等待(explicitly wait),方法参数是等待的最大时长。
也就是只要一找到元素,就会立刻执行下一行代码,不会强制等待参数里设置的时间。
如果implicitlyWait和explicitly wait都在用在代码里,那么最大等待时间不是两个时间的叠加,而是取最大值(可以观察到,页面显示出来,但是服务器还在运行中)。
隐式等待在driver的整个生命周期内都有效。也就是说,driver在没有被close()之前,定位每个元素时,都会有隐式等待的10s,也就是说,只需要设置一次,所有的元素都可有最多10s的等待加载的时间
隐式等待使得WebDriver在查找一个Element或者Element数组时,每隔一段特定的时间就会轮询一次DOM,如果Element或数组没有马上被发现的话。
FluentWait(流畅等待)
FluentWait的定义
简单来说,FluentWait就是一个普通的类,我们使用这个类能支持一直等待直到特定的条件出现。
1)是一个类而且是包org.openqa.selenium.support.ui的一部分
2)是Wait接口的一种实现
3)每个Fluent wait,我们可以设置等待最大时间,而且可以做设置等待的频率去检查一些特定的条件。
FluentWait 和 Explicit Wait的区别:简单来说就是Explicit Wait里有一些设定好了的前置条件的等待方式,而Fluent wait你可以设置自己的方法去处理各种等待的问题。
public class HandlePopup {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("www.test.com");
driver.manage().window().maximize();
//创建了一个FlentWait类的一个对象wait
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
//最大等待时间是60秒
.withTimeout(60, TimeUnit.SECONDS)
//每隔两秒去找一次元素ele1是否在页面显示
.pollingEvery(2, TimeUnit.SECONDS)
//并且忽略NoSuchElement异常
.ignoring(NoSuchElementException.class);
//ele1定位过程使用了对象wait
WebElement ele1 = wait.until(new Function<WebDriver, WebElement>() {
//一个等待的条件
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("xxxxxxx"));
}
});
}
}
整理来自:感谢
https://blog.csdn.net/chencong_5555/article/details/79376229