zoukankan      html  css  js  c++  java
  • 【slenium专题】Webdriver同步设置

    Webdriver同步设置常用等待类主要如下图所示

     

    注:support.ui包内类主要实现显性等待功能,timeouts()内方法主要实现隐性等待功能

    一.线程休眠 

    Thread.sleep(long millis)

    二.隐形等待

     隐性等待:设置一次,driver整个生命周期中都在使用,不需要针对元素明确设置

    driver.manage().timeouts().implicitlyWait(long outTime, TimeUnit unit);

    全局设置,设置driver执行所有定位元素操作的超时时间

    Parameters:outTime– 超时等待时间;unit– 时间单位.

    Ex. 

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//超时等待时间为10S

    三.显性等待

        显性等待:需要等待的元素定位时需要逐一明确调用该等待方法

    Figure 1 Support.ui包常用类UML

     

    [常用等待模板]

    1. 等待元素加载

        1)WebDriverWait

    new WebDriverWait(WebDriver driver, long timeOutInSeconds).until(ExpectedConditions.presenceOfElementLocated(By by))

    注解

    • Parametersdriver-webdriver; timeOutInSeconds-超时等待时间(s; by-元素locator
    • timeOutInSeconds范围内,等待满足until()方法中的条件,即刻跳出等待。
    • 超出timeOutInSeconds抛出异常.

         2)FluentWait 

    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    
                 .withTimeout(long timeOut, TimeUnit unit)
    
                 .pollingEvery(long duration, TimeUnit unit)
    
                 .ignoring(exceptionType);
    
    wait.until(ExpectedConditions.presenceOfElementLocated(By.by));

    注解

    • Parametersdriver-webdriver;timeOut -超时等待时间(s;unit-时间单位; by-元素locator;

      duration-查找元素时间间隔 ;exceptionType-忽略异常类型,例如 默认NoSuchElementException.class

    • timeOut范围内,driver每隔dration定位一次元素,若遇到exceptionType则继续等待,直到满足until()方法中的条件,即刻跳出等待。
    • 超出timeOutInSeconds未满足until条件抛出异常.

       2.等待并获取元素—仅需要修改until方法体

    WebElement element = wait.until(
      new ExpectedCondition<WebElement>(){
        @Override
        public WebElement apply( WebDriver driver) {
            return driver.findElement( By by);
        }
      }
    );

    注解

    • Parametersdriver-webdriverWebDriverWait|FluentWait实例化方法中获取; by-元素locator
    • Return:若定位到元素,返回webelement;否则报异常

    [案例]

    1. 等待页面元素加载
      • WebDriverWait
    Wait<WebDriver> wait = new WebDriverWait(driver,10);
    
    wait.until(
        ExpectedConditions. presenceOfElementLocated(By.id("myDynamicElement"))
    );

    方法功能:定位id=' myDynamicElement'的元素,超时等待时间为10S

      • FluentWait
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    
                 .withTimeout(60, TimeUnit.SECONDS)
    
                 .pollingEvery(10, TimeUnit.SECONDS)
    
                 .ignoring(NoSuchElementException.class);
    
    wait.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

    方法功能:定位id=' myDynamicElement'的元素,超时等待时间为60S,每隔10S定位一次,遇到NoSuchElementException报错忽略,继续等待直到超过60s

    1. 等待并获取页面元素
      • WebDriverWait
    Wait<WebDriver> wait = new WebDriverWait(driver, 10);
    
    WebElement e = wait.until(
        new ExpectedCondition< WebElement>(){
    
            @Override
            public WebElement apply( WebDriver d) {
                return d.findElement( By.id( " myDynamicElement " ));
            }
        }
    );    

    方法功能:定位id=' myDynamicElement'的元素,超时等待时间为10S,若定位到元素,直接返回元素

      •  FluentWait
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                 .withTimeout(60, TimeUnit.SECONDS)
                 .pollingEvery(10, TimeUnit.SECONDS)
                 .ignoring(NoSuchElementException.class);
     
    WebElement element= wait.until(
            new ExpectedCondition<WebElement>() {
                @Override
                public WebElement apply( WebDriver d) {
                    return d.findElement( By.id( " myDynamicElement " ));
                }
            }
    );

    方法功能:定位id=' myDynamicElement'的元素,超时等待时间为60S,每隔10S定位一次,60s内遇到NoSuchElementException报错忽略,继续等待;若定位到元素,直接返回该页面元素。

    如果只是仅仅想判断页面是不是加载到某个地方了,就可以用第一种方法; 但如果需要得到某个WebElement,两种方式都可以,只是第一种方式还需要再多一步获取的操作.

    四.Wait

    FluentWait类是Wait接口的实现,直接使用wait接口可以更灵活的完成您需要的等待功能,例如

    Wait w = new Wait(){
    
        @Override
    
        public boolean until() {
    
        return webElement.isDisplayed();
    
        }
    };    

    这种等待的方式,据说在加载js代码的时候做判断会比较方便,目前没有调试成功。

     五、其他

    1.等待页面加载

    driver.manage().timeouts().pageLoadTimeout(100, SECONDS);

    注解:

    • pageloadTimeout方法只适用于firefox浏览器,Chrome等其他浏览器并不适用,但我们可以自己实现一个定时器
    • 该方法设置页面加载超时时间为100s
    2.等待异步脚本加载
    driver.manage().timeouts().setScriptTimeout(100,SECONDS);

    尚未调试通过

  • 相关阅读:
    [转]system函数返回值探究
    [转]bat中的特殊字符,以及需要在bat中当做字符如何处理
    [转]null和""以及==与equals的区别
    粘包问题
    并发编程
    GIL锁
    五种IO模型
    css选择器
    并发与串行
    模块(二)
  • 原文地址:https://www.cnblogs.com/sylvia-liu/p/4607050.html
Copyright © 2011-2022 走看看