2013-06-02 2 views
17

셀레늄 - webdriverjs를 사용하고 있습니다. 나는 다음과 같이하는 내가 명시 적으로 대기를 만든 표시 할 특정 요소에 대한 대기 할 그것은 셀레늄 WebDriver JS - 명시 적 대기

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

내가 할 수있는이 최고입니다, 잘 작동 또는이 할 수있는 더 나은 방법이있다 ? 내가 묻는 이유는 wait 콜백이 처음으로 호출 된 경우 (내 경우) 항상 false를 반환한다는 것입니다. 이후에 isDisplayed 약속이 실행될 때만 표시되는 값이 변경됩니다.

답변

25
당신의 코드가 비동기 콜백과 동기 수익을 혼합되어

, 옳은 일을해야 다음 코드 내부 기능 driver.wait이 기다리는 그 값을 것이라는 약속을 반환합니다

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

을 (사실/false)를 대기 조건으로 사용합니다.

+0

당신이 옳아 요의 창조자이다. 나는 약속을 지키는 데 여전히 익숙해 져있다 ... –

+0

안녕하세요,이 해결책은 저에게'오류 :이 지연은 이미 해결되었습니다 .'이 것이 당신에게 효과가 있었습니까? – haejeong87

+8

대신에,'driver.isElementPresent (locator);'는이 솔루션을 사용할 수없는 사람들을 위해 저에게 도움이되었습니다 :) – haejeong87

3

webdriver와 JS의 비동기 맛에 관련된 혼란의 대부분을 방지하기 위해, 당신은 webdriver 동기화 시도를 줄 수있는 것은 : https://npmjs.org/package/webdriver-sync

webdriver API의 비동기 버전을 읽기 어려운이 될 것을 내 경험이었다 너무 많은 중첩 콜백 후에.

물론 이것은 비동기로 유지할 필요가 없다고 가정합니다.

면책 조항 : 나는 소프트웨어의이 조각 (webdriver 동기화)

+2

Selenium에서 제공하는 webdriver의 "공식적인"자바 스크립트 버전 인 Webdriver Js (https://code.google.com/p/selenium/wiki/WebDriverJs)를 사용해보십시오. 또한 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

관련 문제