2013-11-22 7 views
7

をセレン/ javascriptの/ノード-jsの私は、この行を実行する前に、要素が存在するかどうかを確認しようとしている:チェック -

driver.findElement(webdriver.By.id('test'));

これはエラー「いいえ、そのような要素を」スロー文書内にid testが存在しない場合は、try -blockでも可能です。 サイズが0であることを確認できるJavaの回答が見つかりましたが、ノード-jsでサイズを確認する前にエラーがスローされます。

throw error; ^ NoSuchElementError: no such element

+0

あなたはこれを使うことはできません:if(webdriver.By.id( 'test')){driver.findElement(webdriver.By.id( 'test')); }。 – JeffreyZ

+0

findElements()とsize() – epascarello

+0

@ user2389688 webdriver.by.id( "anything")は常にtrueになるようです。 –

答えて

24

あなたはthen()のオプションのエラーハンドラの引数を活用することができます。

driver.findElement(webdriver.By.id('test')).then(function(webElement) { 
     console.log('Element exists'); 
    }, function(err) { 
     if (err.state && err.state === 'no such element') { 
      console.log('Element not found'); 
     } else { 
      webdriver.promise.rejected(err); 
     } 
    }); 

私はそれが明示的にドキュメントに記載されているが、selenium-webdriverモジュールのソースでwebdriver/promise.jsで関数定義からこれを決定見つけることができませんでした:

/** 
    * Registers a callback on this Deferred. 
    * @param {Function=} opt_callback The callback. 
    * @param {Function=} opt_errback The errback. 
    * @return {!webdriver.promise.Promise} A new promise representing the result 
    *  of the callback. 
    * @see webdriver.promise.Promise#then 
    */ 
    function then(opt_callback, opt_errback) { 
+3

これは、NodeJS Webドライバを使用して存在する要素を判断する方法を示す唯一の方法なので、これが受け入れられる回答になるはずです。 – mcranston18

+2

opがjavascript以外のpythonを使っていると誤解されていない限り、これは正解でなければなりません。アップ投票!私の場合、 – mekdev

+0

の場合、 'err'オブジェクトには「状態」の小道具がありません。 '{NoSuchElementError:no such element:要素を見つけることができません:{" method ":" css selector "、" selector ":" img "}'。 2番目の条件は 'TypeError:プロパティを読み取れません 'と約束しています。未定義です。 – RZKY

-2

あなたはあなたの特性が存在する場合、最初にチェックしたいような音:

if (webdriver.By.id) { 
    driver.findElement(webdriver.By.id('test')); 
} else { 
    console.error("Whoa, webdriver.By.id is not actually a function!"); 
} 
1

選択答えは(err.stateundefinedだったとNoSuchElementErrorは常にスローされた)動作しませんでした - オプションのコールバックを使用しての概念はまだ動作しますけれども。

OPが参照しているのと同じエラーが発生していたので、NoSuchElementErrorは、対象となる要素が存在するかどうかを判断する際に参照する必要があります。名前が意味するように、要素が存在しないときにスローされるエラーです。だから、errorCallbackでの条件は次のようになります。

err instanceof webdriver.error.NoSuchElementError

(私もその構文を利用してそれらのためのasync/awaitを使用しています)、次のように完全なコードブロックは次のようになります。

var existed = await driver.findElement(webdriver.By.id('test')).then(function() { 
    return true;//it existed 
}, function(err) { 
    if (err instanceof webdriver.error.NoSuchElementError) { 
     return false;//it was not found 
    } else { 
     webdriver.promise.rejected(err); 
    } 
}); 
//handle value of existed appropriately here