Selenium的延遲等待

Selenium的延遲等待分爲 顯式等待(Explicit Wait) & 隱式等待(Implicit Wait). css

1.顯式等待 java

顯式等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間以內都沒找到,那麼就跳出Exception. web

如: app

new WebDriverWait(driver, 15).until(
    ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator"))
);

這裏,15是要等待的秒數.若是沒有知足until()方法中的條件,就會始終在這裏wait 15秒,依然找不到,就拋出異常. dom

也能夠這樣寫: ide

WebDriver driver = new FirefoxDriver();
driver.get( http://somedomain/url_that_delays_loading);
WebElement e = (new WebDriverWait( driver, 10)) .until(
    new ExpectedCondition< WebElement>(){
        @Override
        public WebElement apply( WebDriver d) {
            return d.findElement( By.id("id locator"));
        }
    }
);

這樣就經過回調函數,直接得到了這個WebElement.也就是頁面元素. 函數

若是隻是僅僅想判斷頁面是否是加載到某個地方了,就能夠用第一種方法; 但若是須要獲得某個WebElement,兩種方式均可以,只是第一種方式還須要再多一步獲取的操做. url

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

另外這種等待的方式,在加載js代碼的時候作判斷會比較方便,反正我只在代碼裏這麼見過,可是沒用過,有興趣的朋友能夠研究一下. spa

2.隱式等待 code

隱式等待,我以爲就是不靠譜的等待,看一段代碼就明白了.

driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);

WebDriver會進行一個隱式等待,但參數只有時間,這就致使我須要什麼元素出現,我不必定能等到它,只是讓driver延遲一段時間再繼續而已. 不過咱們也能夠把它小小的封裝一下,變廢爲寶:

public boolean isByElementDisplayed(By by, int time) {
    boolean status = false;
    if (driver.findElement(by).isDisplayed() == false) {
        driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
    } else {
        status = true;
    }
    return status;
}
得不到某個元素,咱們就延遲一下...

最後還有一個最低效的作法:

Thread.sleep()

額,不建議使用.

第一次發文,你們多提意見.

相關文章
相關標籤/搜索