2017-04-20 13 views
1

私はwebdriverIOで遊んでいました。私はすでにこのフレームワークの多くの機能が大好きです。WebdriverIOが使用されていないWeb要素のPOST '要素'要求を行う理由を教えてください。

WebdriverIOは、このテストでロード存在しない要素と怠惰な要素をどのように動作するか私は調査していた:

it('no element, and not used',() => { 
    browser.pause(5000) 
    let non_exist = browser.$('.nonexist') 
}); 

ランナー出力:

``` 
[17:23:25] COMMAND POST  "/wd/hub/session/6b79fd07-5f5d-42ce-b1e5-f99734aae128/element" 
[17:23:25] DATA    {"using":"css selector","value":".nonexist"} 
``` 

webdriverをサーバログ:

``` 
*** Element info: {Using=css selector, value=.nonexist} 
17:23:25.840 INFO - Executing: [delete session: 6b79fd07-5f5d-42ce-b1e5-f99734aae128]) 
``` 

私はWebdriverIOが依然としてSeleniumサーバーにPOSTリクエストを送信し、宣言の要素を見つける。

これで2番目のテストが表示されます。ここで私は要素を宣言しています、それはページ上に存在するが、後でそれを使用しようとしていません。

it('no element, used later in the code',() => { 
    browser.pause(5000) 
    let myElem = browser.$('.nonexist') 
    console.log('AND NOW FAIL!') 
    console.log(myElem.getText()) 
}); 

テストランナーの出力:

``` 
[17:30:35] COMMAND  POST  "/wd/hub/session/05e4115c-ed66-4e47-8a01-c37208d379ab/element" 
[17:30:35] DATA    {"using":"css selector","value":".nonexist"} 
AND NOW FAIL! 
[17:30:36] COMMAND  POST  "/wd/hub/session/05e4115c-ed66-4e47-8a01-c37208d379ab/elements" 
[17:30:36] DATA    {"using":"css selector","value":".nonexist"} 
[17:30:36] RESULT    [] 
``` 

Seleniumサーバーのログ:

``` 
*** Element info: {Using=css selector, value=.nonexist} 
17:30:36.133 INFO - Executing: [find elements: By.cssSelector: .nonexist]) 
17:30:36.155 INFO - Done: [find elements: By.cssSelector: .nonexist] 
``` 

Webdriver IOは2つの要求を送信します。最初は宣言の後、この要素に対して何らかのアクションを適用しようとすると 'elements'要求が送信されます。

WebdriverIOはなぜ私の例で要素を2回見つけようとしているのですか?例外はスローされません、すべてが良いですが、私はちょうどこれがバグか設計によって疑問に思っていますか?

答えて

2

これは仕様です。 Webdriver Specでは、要素が見つからない場合、ドライバはWebdriverIO例外をスローする必要があると述べています。この背後にある理由は、WebdriverIOでは存在しない要素に対してアクションを呼び出すことができるからです。これは構文上の理由によるものです。これは、変数の要素を定義し、同様に、後でそれを使用することができます:あなたは、上述のようにそれが存在しない場合、要素上でアクションを呼び出したい場合は

var myElem = $('#notExisting') 
myElem.waitForExist() // waits for element to exist 
console.log(myElem.getText()) // returns text if elem shows up 

しかしWebdriverIOは失敗するのに十分なスマートです。この設計の

var myElem = $('#notExisting') 
console.log(myElem.getText()) // THROWS EXCEPTION 

一つの欠点は、非既存の要素のクエリが存在するが、長期的に無視される要素よりももう少し時間がかかるということです。明らかに利点はテストコードを読みやすく、時間を節約できます。

+0

あなたの答えをありがとう!私は遅延要素が宣言に例外を投げてはならないことを理解しています。これは本当に良いアプローチです(私の意見では)。しかし、今私はなぜ宣言(最初のテストを参照してください)のPOSTリクエストを送信する必要がありますか? – Xotabu4

+1

平均時間内に要素が現れたかどうかわからないからです。それは基本的にそれをフェッチします – ChristianB

+1

また、要素が最初に存在する場合、私たちはドライバから取得した参照を再利用し、要素を再度フェッチする必要はありません – ChristianB

関連する問題