【slenium專題】Webdriver同步設置

Webdriver同步設置經常使用等待類主要以下圖所示

 

注:support.ui包內類主要實現顯性等待功能,timeouts()內方法主要實現隱性等待功能

一.線程休眠 

Thread.sleep(long millis)

 

二.隱形等待

 隱性等待:設置一次,driver整個生命週期中都在使用,不須要針對元素明確設置web

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

全局設置,設置driver執行全部定位元素操做的超時時間 瀏覽器

Parameters:outTime– 超時等待時間;unit– 時間單位.app

Ex. 異步

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//超時等待時間爲10S

 

 

 

三.顯性等待

 

    顯性等待:須要等待的元素定位時須要逐一明確調用該等待方法 ide

Figure 1 Support.ui包經常使用類UMLui

 

[經常使用等待模板] spa

  1. 等待元素加載

    1)WebDriverWait firefox

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

註解線程

  • Parameters driver-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));

註解

  • Parameters driver-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代碼的時候作判斷會比較方便,目前沒有調試成功。

 5、其餘

1.等待頁面加載

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

註解:

  • pageloadTimeout方法只適用於firefox瀏覽器,Chrome等其餘瀏覽器並不適用,但咱們能夠本身實現一個定時器
  • 該方法設置頁面加載超時時間爲100s

 

2.等待異步腳本加載

 

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

還沒有調試經過

相關文章
相關標籤/搜索