延时等待
----------------------------------------硬性等待----------------------------------
硬性等待,线程休眠,强制等待
Thread.sleep(long mills);
不推荐使用,容易造成时间浪费
使用场景:页面切换时
示例:
openBrowser("chrome");
driver.get("http://www.baidu.com");
// input框输入关键字
// 如何找到input元素
// 1.根据元素属性id查找元素--一般老说页面元素的id是唯一的
WebElement Element = driver.findElement(By.id("kw"));
// 2.输入搜索关键字
Element.sendKeys("腾讯课堂");
//3.点击 百度一下
driver.findElement(By.id("su")).click();
//Element.sendKeys(Keys.ENTER);//不点击 百度一下,通过回车
//4.硬性等待5秒,5秒之后才会执行下面的代码
Thread.sleep(5000);
//点击 腾讯课堂_百度百科
driver.findElement(By.xpath("//a[text()=\"_百度百科\"]")).click();
硬性等待,无法判断元素什么时候被加载出来,如果设置的时间过长,元素已加载出来,就会造成时间浪费(因为只有待时间到了)才能执行下面的操作
加时间等待的原因:代码执行很快,但元素需要时间加载出来,代码和元素显示时间不同步
网速决定元素加载快慢
-----------------------------------隐式等待------------------------------------------
在设置的超时时间范围内不断查找元素,直到找到元素或者超时
如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
设置方式
driver.manage.timeouts().implicitlyWait(long time,TimeUnit unit);
优点:相对灵活
缺点:设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待
示例:
openBrowser("chrome");
//隐式等待:一直不断的在设置的时间内不断的寻找元素,一旦找到就执行,如果超出设置时间,未找到元素,就会报错--no such element
driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);
driver.get("http://www.baidu.com");
// input框输入关键字
// 如何找到input元素
// 1.根据元素属性id查找元素--一般老说页面元素的id是唯一的
WebElement Element = driver.findElement(By.id("kw"));
// 2.输入搜索关键字
Element.sendKeys("腾讯课堂");
driver.findElement(By.id("su")).click();
//Element.sendKeys(Keys.ENTER);
//点击 腾讯课堂_百度百科
driver.findElement(By.xpath("//a[text()=\"_百度百科\"]")).click();
注意:
(1)
driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);这句代码什么时候开始生效,调用findElement()API时开始倒计时,所有隐式等待要设置在找元素之前----针对全局的元素
(2)如果隐式等待设置在 driver.findElement(By.id("su")).click();之后,那么只对后面的元素定位生效,前面需要查找的元素就不生效了,所以在开始调用findElement()之前就要把隐式等待加载进来-----这样就全局生效了
(3)隐式等待只能用来查找元素存不存在,但是并不知道元素是否可见
存在/可见:比如打开百度首页,当前html没有高级搜索元素,但当点击设置,高级搜索存在html当中,但是不 可见(肉眼不可见),只有鼠标悬停在设置上,高级搜索可见(肉眼看得见)
(4)元素存在但不可见,隐式等待可以定位到元素吗?------待自验证(以百度-设置-高级搜索)
------------------------------------------显示等待-------------------------------
显示等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续代码
如找到元素,元素可点击,元素已显示)
使用方式:
WebDriverWait wait=new WebDriverWait();
WebElement element-wait.unit(expectCondition)
优点:每隔一段时间扫描一次,检查元素是否满足等待条件,比如查找元素,则检查元素是否存在,不存在则继续等
待,直到找到或超时
该方式不是全局设置,因此特定需要等待的元素可以这样处理,推荐优先使用这一种方式
方法: 等待条件
presenceOfElementLocated 页面元素在页面中存在
visibilityOfElementLocated 页面元素在页面存在并且可见
elementToBeClickable 页面元素是否在页面上可用和可被单击
textToBeAvailableAndSwitchTolt 在页面元素中是否包含特定的文本
frameToBeAvailableAndSwitchTolt 切换到iframe中,返回值为boolean类型
textToBePresentInElement 在页面元素中是否包含特定的文本
一个元素能被点击的必要条件
页面上(DOM)存在这个元素
元素可见
示例1:elementToBeClickable----元素可点击
openBrowser("chrome");
driver.get("http://www.baidu.com");
// input框输入关键字
// 如何找到input元素
// 1.根据元素属性id查找元素--一般老说页面元素的id是唯一的
WebElement Element = driver.findElement(By.id("kw"));
// 2.输入搜索关键字
Element.sendKeys("腾讯课堂");
driver.findElement(By.id("su")).click();
// 3.设置显示等待10秒,单位是秒
WebDriverWait wait = new WebDriverWait(driver, 10);
// 4.设置显示等待条件:until直到元素可被点击(可点击说明存在并可见)
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()=\"_百度百科\"]")));
// 5.点击 腾讯课堂_百度百科
driver.findElement(By.xpath("//a[text()=\"_百度百科\"]")).click();
// driver.quit();
示例2:presenceOfElementLocated-----元素存在
//1.打开浏览器
openBrowser("chrome");
//2.访问百度首页
driver.get("http://www.baidu.com");
//3.获取 设置元素并点击
driver.findElement(By.xpath("//div[@id='u1']//a[text()='设置']")).click();
//4.设置显示等待,5秒
WebDriverWait wait = new WebDriverWait(driver, 5);
//5.设置显示等待条件---元素在html中存在
WebElement element= wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//a[text()='高级搜索']")));
//6.点击高级搜索
element.click();
示例3:presenceOfElementLocated-----元素存在
//1.打开浏览器
openBrowser("chrome");
//2.访问百度首页
driver.get("http://www.baidu.com");
//3.获取 设置元素并点击
driver.findElement(By.xpath("//div[@id='u1']//a[text()='设置']")).click();
Thread.sleep(2000);
//4.焦点移动到输入框
driver.findElement(By.xpath("//input[@id='kw']")).sendKeys("腾讯课堂");
Thread.sleep(2000);
//4.设置显示等待,5秒
WebDriverWait wait = new WebDriverWait(driver, 5);
//5.设置显示等待条件---元素在html中存在
WebElement element= wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//a[text()='高级搜索']")));
//6.点击高级搜索
element.click();
上面代码执行报错:
xception in thread "main" org.openqa.selenium.ElementNotInteractableException: element not interactable
at com.lemon.elementapi.visiableWait.main(visiableWait.java:54)
提示元素不可交互(元素不可见),且报错的代码在54行,我这里54行是element.click(),点击报错了,说明设置的等待条件是满足的(条件满足才能往下执行,否则不满足,这里就已经报错了)-----但由于焦点移动到输入框,导致元素虽存在但又被隐藏了,所以点击时就会报错
总结:元素被点击(存在且可见)
三大等待同时存在,以为谁准:
硬性等待如果设置了就一定会执行
隐性等待和显示等待同时设置了,那么先以显示等待为准,显示等待如果未找到,再以隐性等待为准继续找,如果还是找不到,就抛出异常(一般都使用显示等待,不一起混用)