0

が実行されるのを待たずに、何かを実行する前にdriver.wait()を使用して要素を待つと、間違って次のエラーが発生する要素:webdriver/node.js:Internet Explorer 11でエレメント

TypeError: Cannot read property 'length' of null 
    at C:\tools\node_modules\selenium-webdriver\lib\webdriver.js:909:22 
    at ManagedPromise.invokeCallback_ (C:\tools\node_modules\selenium-webdriver\lib\promise.js:1343:14) 
    at TaskQueue.execute_ (C:\tools\node_modules\selenium-webdriver\lib\promise.js:2868:14) 
    at TaskQueue.executeNext_ (C:\tools\node_modules\selenium-webdriver\lib\promise.js:2851:21) 
    at C:\tools\node_modules\selenium-webdriver\lib\promise.js:2730:27 
    at C:\tools\node_modules\selenium-webdriver\lib\promise.js:639:7 
    at process._tickCallback (node.js:369:9) 

これは私がコールするコードスニペットです。 return driver.wait(行で失敗しています。

function wait_for_element_and_click(element){ 

    var target_element; 

    return driver.wait(
     function() { return driver.isElementPresent(element) }, 
     10000 
    ) 
    .then(function(){ element.click() }) 
} 

これは私がそれを呼び出す方法です。

function select_and_click_links(){ 

    var make_field = "make_field_id"; 
    var model_field = "model_field_id"; 

    return driver.wait(webdriver.until.elementLocated(webdriver.By.id(make_field))) 
    .then(function() { wait_for_and_click_element(webdriver.By.id(model_field)) }) 

} 

興味深いことに、私はそれが今までまったく同じことをやっているように思われた(直前の行で失敗していません(つまり、私が試してみました物事return driver.wait(webdriver.until.elementLocated(webdriver.By.id(make_field)))


*はfunction(){ return driver.isElementPresent(element) }を交換しますオプションのタイムアウトを除くwebdriver.until.elementLocated(element)
*。* wait_and_click_elementコール(うん、ここではほとんど何をしようとして)の結果を返す。

シンとgs私は試していない:
*別のブラウザ(アプリケーションがIEで正しく動作するように - これはIEの奇妙な場合は、私たちのためのdealbreakerです)。

スクリプトは断続的に失敗します。

答えて

0

代わりに、isDisplayedを使用して要素がページに表示されるようにしてください。 webdriver.until.elementLocatedは、DOM内の要素のみをチェックしている可能性があります。