1. 程式人生 > >Selenium等待元素的處理方法

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不是很熟悉,相信應該有等待指定元素的方法,有的話可以留言給我。