2013-06-02 32 views
17

Selenium-webdriverjs kullanıyorum. Ben şöyle kendisi için ben açık bir bekleme oluşturduk görüntülenecek belli bir eleman için beklemek istiyorum ve onu Selenium WebDriver JS - Açık Bekleyin

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

Yapabileceğim bu en iyisi bu, gayet güzel çalışıyor ya bunu yapmak için daha iyi bir yol yoktur ? Sormamın nedeni, ilk kez bekletme çağrısının (benim durumumda) çağrılmasıdır, her zaman yanlıştır. Ancak, daha sonra isDisplayed vaadi yürütüldüğünde, görüntülenen değişimin değeri olacaktır.

cevap

25
Kodunuz asenkron geri aramaları ile senkron dönüşü karıştırma

, doğru olanı yapmalıdır Aşağıdaki kodu: iç fonksiyonu driver.wait bekleyecek ve değerini alacağı bir söz dönecektir

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

(true/false) bekleme koşulu olarak.

+0

Haklısın kurucusuyum. Hala vaatlere alışmaya başladım ... –

+0

Merhaba arkadaşlar, bu çözüm bana verdi: Hata: Bu ertelendi zaten çözüldü. Bu sizin için mi çalışıyordu? – haejeong87

+8

yerine, driver.isElementPresent (locator); 'bu çözümü kullanamayanlarınız için bana çalıştı :) – haejeong87

3

webdriver ve js asenkron tatlar karışan şaşkınlığın önlemek için, webdriver-senkronizasyon denemeye olabilir: https://npmjs.org/package/webdriver-sync

webdriver API zaman uyumsuz versiyonları okunması zor hale gelmesi benim deneyim oldu çok iç içe geçmiş geri aramalardan sonra.

Bu, elbette, zaman uyumsuz kalma gereksiniminiz olmadığını varsayar.

Yasal Uyarı: Bu yazılım parçası (webdriver-senkron)

+2

Selenium millet tarafından sağlanan webdriver'ın "resmi" javascript sürümü olan Webdriver Js'yi (https://code.google.com/p/selenium/wiki/WebDriverJs) denemelisiniz. Ayrıca, webdriver js "Kontrol Akışları" (https://code.google.com/p/selenium/wiki) kullanarak kodunuzu senkronize bir şekilde yazmanıza/çalıştırmanıza izin veren bir "vaatler yöneticisi" sağladığından okumak zor değildir./WebDriverJs # Control_Flows). Bunu kullanarak, kodunuz daha da okunabilir olacak! –

+0

@cSn, Webdriver JS ekibinin mümkün olduğunca senkronize olma çabasını çok sevdiğini seviyorum; Ancak, [burada] belirtildiği gibi (http://stackoverflow.com/questions/16882860/selenium-webdriver-js-explicit-wait/18797176?noredirect=1#comment32167323_16882922), genellikle neyin senkron olduğunu bilmek kafa karıştırıcıdır ve ne değil. Söze dayalı bir yaklaşımla bile, iç içe geçmiş geri aramalara düştüğünüz senaryolarla sonuçlanırsınız (bir öğenin metnini aldıktan sonra bir şeyler yapmak gibi). – jsdevel

+0

[Burada] (https://gist.github.com/jsdevel/99a5d736fbdd6c86d455), "webdriver-sync" kullanarak tamamen senkronize bir şekilde yazılmış çözümün bir sürümünü gösteren bir özdür. – jsdevel