美文网首页
延时等待

延时等待

作者: testerPM | 来源:发表于2020-01-14 15:01 被阅读0次

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

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

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

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

    相关文章

      网友评论

          本文标题:延时等待

          本文链接:https://www.haomeiwen.com/subject/szuoactx.html