Selenium等待元素的處理方法

在開發腳本的過程中,經常會因爲網絡或者系統性能的問題,導致頁面加載很慢,這種問題經常會導致腳本因爲超時運行失敗,那麼就需要等待元素來解決這個問題。

1. Java sleep實現

Thread.sleep()

這個方法是最不推薦的,是用線程等待的方式來實現,每次元素出現在頁面的時間不一樣,如果設置的時間長了,白白浪費了時間,如果設置的時間短了,腳本依然會報沒有找到元素的錯誤。

2. WebDriver PageLoadTimeOut

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

這個方法實際上跟上面那個是一樣的,也不推薦

3. WebDriver implicitlyWait

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

這個也是WebDriver的一個方法,是每個driver自己去實現設置超時時間,在當前頁面找元素的時候,首先去找web元素,如果沒有找到,判斷時間否超超過設置的時間,如果沒有超過,則再次找這個元素,直到找到元素或者時間超過設置時間。那我們就可以設定一個比較長的超時時間,但同時也不會讓程序白白的等待。
這種方式就相對來說靈活一點了,但是有個問題,這個設置是針對全局的,並不是所有的元素都需要等待,比如頁面上用js來實現的,點一個按鈕或者把鼠標移動到某個區域就會出現期望的元素,這個時候driver也會去執行等待的方法,一兩次的時間浪費可能不多,累積起來就很多了。從另一方面,如果期望某個元素在指定的時間內沒有出現,這個方法就會浪費很多的方法了。(這個解釋不確定對不對,如有異議煩請指正)

4. WebDriverWait

    private boolean waitForElement(final By elementLocator) {

        try {
            WebDriverWait driverWait = (WebDriverWait) new WebDriverWait(driver, 30, 500).ignoring(
                    StaleElementReferenceException.class).withMessage("元素在30秒內沒有出現!");
            return driverWait.until(new ExpectedCondition<Boolean>() {

                public Boolean apply(WebDriver driver) {

                    try {
                        if (driver.findElement(elementLocator).isDisplayed()) {
                            return false;
                        }
                    } catch (IndexOutOfBoundsException e) {
                    } catch (NoSuchElementException e) {
                    }

                    return true;
                }
            });
        } catch (Exception e) {
            return false;
        }

    }

對於這個方法的解釋是,每500毫秒掃描一次頁面,檢查元素是否存在,存在的話返回true,不存在繼續等到,直到等到時間超過30秒報錯。這個方法就完美解決了上面的所有問題,力薦這個方法。

5 waitForCondition

waitForCondition("selenium.browserbot.getUserWindow().$.active == 0;", 30000);

waitForCondition("(selenium.browserbot.getCurrentWindow().document.readyState=='interactive') || "
                            + "(selenium.browserbot.getCurrentWindow().document.readyState=='complete');", 30000);

這個方法是調用JS來實現等待,目前我的框架中用得比較多的是等待整個頁面加載完全,而不是指定的元素,因爲對JS不是很熟悉,相信應該有等待指定元素的方法,有的話可以留言給我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章