コードの出力
Selenium IDE は、ブラウザ内での再生という主要なコンポーネントが 2 つあり、これは actions
と events
によって実現されています。
そして、コマンドラインランナーを使用してコマンドラインモードで再生します。
Selenium SIDE Runner 環境
ランナーは Node をベースとしているため、この環境を活用してより良いコードを出力できます。
- npm を使用した Node.js 8 以降
- Jest
- jest-environment-selenium
- selenium-webdriver
コードの出力
コードを出力する際には、プラグインはコードを出力する唯一のものではなく、出力の流れを制御するものでもないため、特定の点に注意する必要があります。
プラグインが互いの実行を妨げないようにするために、特定の予防措置を講じる必要があります。
return を使用しない
キーワード return
は、その後のコードに到達できないことを意味し、他のプラグインの妨げになる可能性があります。
return somePromise();
plugin2Func(); // unreachable
代わりに、Node 8 以降を使用しているため、async 関数を活用できます。
await somePromise();
plugin2Func(); //works
グローバルスコープで変数を定義しない
グローバルスコープで変数を定義すると、プラグインや Selenium IDE 自体が同じ変数を定義した場合、エラーまたは未知の副作用が発生する可能性があり、デバッグが困難になります。
たとえば、このテストケースを考えてみましょう
store
|button
|element
plugin click
|button
assert element present
|css=${element}
変数を定義すると、コードは次のようになります
let element = "button";
let element = await driver.findElement();
await element.click();
expect(element).toBePresent(); // different button!
グローバルスコープで変数を定義しないようにするには、Promise の then
関数を使用します
let element = "button";
await driver.findElement().then(element => {
return element.click();
});
expect(element).toBePresent(); // the store defined button
まとめ
一般的に、グローバルスコープを操作することは避けましょう。定義する必要がある場合は、Promise の then
を使用するか、最悪の場合即時実行関数式を使用できます。