延时等待

2020-01-14  本文已影响0人  testerPM

----------------------------------------硬性等待----------------------------------

硬性等待,线程休眠,强制等待
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(),点击报错了,说明设置的等待条件是满足的(条件满足才能往下执行,否则不满足,这里就已经报错了)-----但由于焦点移动到输入框,导致元素虽存在但又被隐藏了,所以点击时就会报错

总结:元素被点击(存在且可见)

三大等待同时存在,以为谁准:
硬性等待如果设置了就一定会执行
隐性等待和显示等待同时设置了,那么先以显示等待为准,显示等待如果未找到,再以隐性等待为准继续找,如果还是找不到,就抛出异常(一般都使用显示等待,不一起混用)

上一篇下一篇

猜你喜欢

热点阅读