2013-06-02 153 views
17

我使用的是selenium-webdriverjs。我想等待某個元素要顯示我已經創建了一個明確的等待如下,它工作得很好,Selenium WebDriver JS - 顯式等待

var displayed = false; 
driver.wait(function(){ 
    driver.findElement(locator).isDisplayed().then(function(value){ 
     displayed = value; 
    }); 
    return displayed; 
}, timeout); 

這是我能做的最好的還是有更好的方式來做到這一點?我問的原因是有史以來第一次等待回調(在我的情況下),它總是會返回false。只有隨後執行isDisplayed承諾時,纔會顯示所顯示更改的值。

回答

25

您的代碼混合異步回調同步回報,下面的代碼應該做正確的事:

return driver.wait(function() { 
    return driver.findElement(locator).isDisplayed(); 
}, timeout); 

的內部函數會返回一個承諾,driver.wait將等待並會採取它的值(真/ false)作爲等待條件。

+0

沒錯的創造者。我仍然習慣於承諾... –

+0

你好,這個解決方案給了我'錯誤:這個延期已經解決了。'這是否爲你工作? – haejeong87

+8

而不是'driver.isElementPresent(locator);'爲我工作,對於那些不能使用此解決方案的人:) – haejeong87

3

爲了避免太多參與的webdriver和js的異步口味的混亂,你可以給webdriver的同步一試:https://npmjs.org/package/webdriver-sync

這是我的經驗是,webdriver的API的異步版本變得難以閱讀經過太多嵌套的回調。

這當然假定您沒有要求保持異步。

免責聲明:我是這個軟件(webdriver的同步)

+2

您應該嘗試Webdriver Js(https://code.google.com/p/selenium/wiki/WebDriverJs),它是Selenium人員提供的webdriver的「官方」javascript版本。此外,讀取並不困難,因爲webdriver js提供了一個「承諾管理器」,可讓您使用「控制流」(https://code.google.com/p/selenium/wiki)以同步方式編寫/執行代碼/ WebDriverJs#Control_Flows)。通過使用這個,你的代碼將更具可讀性! –

+0

@cSn,我真的很喜歡Webdriver JS團隊儘可能讓同步看起來像同步一樣;然而,正如[這裏]提到的(http://stackoverflow.com/questions/16882860/selenium-webdriver-js-explicit-wait/18797176?noredirect=1#comment32167323_16882922),它常常令人困惑,知道什麼是同步的什麼不是。即使採用基於承諾的方法,您仍然會遇到陷入嵌套回調的場景(比如在獲取元素文本後執行某些操作)。 – jsdevel

+0

[這裏](https://gist.github.com/jsdevel/99a5d736fbdd6c86d455)是一個顯示使用'webdriver-sync'以純同步方式編寫的解決方案版本的要點。 – jsdevel

相關問題