Selenium Webdriver 4.1 APIを使用してスクリプト化ブラウザ監視を実行するには、スクリプトの構文で変数 $selenium
と $webDriver
を使用していることを確認してください。SeleniumウェブドライバAPI 3.6.0にアクセスするには、0.5.0 以降のブラウザリファレンスドキュメントに記載されているように、変数$driver
と$browser
を使用します。
特に:
$selenium
selenium-webdriver
モジュールからのすべてのエクスポートを提供します(ActionSequence
、Button
、By
、WebElement
など)。これは古いランタイムでの$driver
使用にマッピングされます。$webDriver
はselenium-webdriver.WebDriver()
の合成モニタリングインスタンスです。WebDriver
やget()
といった主な基本findElement()
APIのほか、一部のSyntheticsカスタムAPIを公開します。これは古いランタイムでの$browser
使用にマッピングされます。$headers
リクエストヘッダーを変更することができます。この機能は、複数の$browser
方法で古いランタイムで利用可能でした$urlFilter
許可リストと拒否リストを作成して、リクエストを特定のドメインに制限できます。この機能は、複数の$browser
方法で古いランタイムで利用可能でした
旧バージョンのモニターを使用している場合は、モニターバージョン0.5.0および0.6.0のマニュアルまたはモニターバージョン0.4.0以前のマニュアルを参照してください。
モニターのバージョンおよびランタイムの違いについては、「ランタイム環境」をご覧ください。
重要
Selenium WebDriverのPromise Manager/強制フローにより、Promise/非同期機能を手動で管理することなく、一部の機能を順番に実行できるようになりました。これはSelenium WebDriver 4.0では削除されたため、ランタイムでは使用できません。すべての非同期機能およびプロミスは、await
または.then
のプロミスチェーンを使用して管理する必要があります。これにより、スクリプト機能が予期された順序で実行されるようになります。
一般的な使用例については、スクリプト化ブラウザモニターの概要を参照してください。
最上位関数:スクリプトの作成
New Relicは、$webDriver
インスタンスから最上位関数を直接呼び出します。これらは、多数の基本的なスクリプト可能なアクションに対応する幅広い機能を提供します。
waitForAndFindElement(locator, timeout)
およびwaitForPendingRequests(timeout)
メソッドはランタイムから削除されており、$webDriver
からは使用できません。下位互換性は利用できますが、非推奨と見なされ、今後のランタイムから削除される可能性があります。次のコードスニペットを使用して、関数を置き換えます。
機能 | 説明 |
---|---|
| このドライバを使用して、新しいアクションシーケンスを作成します。使用可能なアクションのリストについては、「ActionSequence」をご覧ください。 戻り値:void |
| 値 戻り値:void |
| ランタイムに複数のヘッダーを追加します。 戻り値:void |
| 現在設定されているヘッダのマップを返します。 戻り値:promise |
| 現在設定されているヘッダのマップを返します。 戻り値:map |
| 現在設定されているヘッダーキーの配列を返します。 戻り値:配列 |
| このヘッダーが存在するかどうかを示すブール値を返します。 戻り値:ブール値 |
| 特定のヘッダをランタイムから削除します。 戻り値:void |
| 引数のすべてのヘッダをランタイムから削除します。 戻り値:void |
| すべてのヘッダーをランタイムから削除します。 戻り値:void |
| 引数の配列のすべてのホスト名を拒否リストに追加します。wildcardsの使用が許可されます。 戻り値:promise |
| 引数の配列のすべてのホスト名を許可リストに追加します。wildcardsの使用が許可されます。 戻り値:promise |
| 引数のすべてのホスト名を拒否リストから削除します。 戻り値:promise |
| 引数のすべてのホスト名を許可リストから削除します。 戻り値:promise |
| 現在選択されているフレームまたはウィンドウのコンテキストで、非同期JavaScriptを実行するコマンドをスケジュールします。 戻り値:promise |
| 現在選択されているフレームまたはウィンドウのコンテキストで、JavaScriptを実行するコマンドをスケジュールします。 戻り値:promise |
| ページ上の要素を検索するコマンドをスケジュールします。見つからなかった場合、Syntheticsモニタリングはエラーを返します。 戻り値:WebElementPromise |
| ページ上の複数の要素を検索するコマンドをスケジュールします。 戻り値:promise |
| Syntheticsブラウザでウェブページをロードします。 戻り値:promise |
| 使用可能なウィンドウハンドルの最新リストを取得するコマンドをスケジュールします。 戻り値:promise |
| インスタンスの機能を使って解決するpromise。 戻り値:promise |
| 現在のページのURLを取得するコマンドをスケジュールします。 戻り値:promise |
| 現在のページソースを取得するコマンドをスケジュールします。返されるページソースは、基盤となるDOMの表現です。Webサーバーから応答が返される場合と同様に書式化またはエスケープされることを期待しないでください。 戻り値:promise |
| このクライアントのセッションのpromise。 戻り値:promise |
| 現在のページのタイトルを取得するコマンドをスケジュールします。 戻り値:promise |
| 現在のウィンドウハンドルを取得するコマンドをスケジュールします。 戻り値:promise |
| このインスタンスのオプションのインタフェース。クッキー、タイムアウト、その他のウィンドウオプションを管理できます。 戻り値:void |
| このインスタンスのナビゲーションインタフェース(ブラウザ関数の履歴)。 戻り値:void |
| 指定された期間、ドライバをスリープ状態にするコマンドをスケジュールします。 戻り値:promise |
| このインスタンスのターゲットロケーターのインタフェース。 戻り値:void |
| スクリーンショットを撮るコマンドをスケジュールします。 戻り値:promise |
| ユーザー提供の関数の定義どおりに、条件が保持されるまで待機するコマンドをスケジュールします。 戻り値:WebElement |
| 開始されたリクエストがタイムアウトまでに戻るまでスクリプトを待機させます。ノンブロッキングリソースの追跡に役立ちます。 戻り値:promise |
拒否リスト:ワイルドカードの使用
ドメインをブラウザインスタンスの拒否リストに追加したい場合、ブロックされるURLのURL構文にワイルドカードが一致しなければなりません。
包括的な.com
拒否リストには以下の関数が含まれなければなりません。
機能 | ブロッキングアクション |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
オプション:ブラウザインスタンスを管理する
以下の関数は、クッキー、タイムアウト、ウィンドウサイズなどのブラウザインスタンスのオプションを管理します。$webDriver.manage()
関数を使用してこれらのオプションにアクセスします。
機能 | 説明 |
---|---|
| クッキーを追加するコマンドをスケジュールします。
戻り値:promise |
| 現在のページに表示されているすべてのクッキーを削除するコマンドをスケジュールします。 戻り値:promise |
| 指定された名前のクッキーを削除するコマンドをスケジュールします。指定された名前のクッキーが現在のページに表示されていない場合、このコマンドはno-opです。 戻り値:promise |
| 指定された名前のクッキーを取得するコマンドをスケジュールします。そのようなクッキーがない場合は、nullを返します。クッキーは、WebDriverワイヤプロトコルによって記述されているように、JSONオブジェクトとして返されます。 戻り値:promise |
| 現在のページに表示されているすべてのクッキーを取得するコマンドをスケジュールします。New Relic Syntheticcsは、WebDriverワイヤプロトコルによって記述されているように、各クッキーをJSONオブジェクトとして返します。 戻り値:promise |
| 現在のスクリプト、pageLoad、および暗黙的タイムアウトを返します。 戻り値:promise |
| 要素を検索する際に、その時点でその要素が存在しない場合、ドライバが待機する必要がある時間を指定します。待機タイムアウトを 特にXPathのような時間を要するロケーション戦略では、テストランタイムが長くなるため、待機タイムアウトを増加する際は注意してください。デフォルトは10秒です。 戻り値:promise |
| エラーを返す前に、ページロードが完了するまで待機する時間を設定します。タイムアウト値が負の場合、ページロードは最大180秒継続する可能性があります。デフォルトは60秒です。 戻り値:promise |
| エラーを返す前に、非同期スクリプトの実行が完了するまで待機する時間をミリ秒単位で設定します。デフォルトは30秒です。 戻り値:promise |
| 画面の左上隅とウィンドウのサイズ(幅と高さ)を基準にしたウィンドウの現在の位置(xとy)を取得します。 戻り値:promise |
| 現在のウィンドウを最大化します。 戻り値:promise |
| 画面の左上隅とウィンドウのサイズ(幅と高さ)を基準にしたウィンドウの現在の位置(xとy)を設定します。 戻り値:promise |
ロケーター: ページ要素の検索
ロケーターは、locator
インスタンスを作成するためのファクトリ関数の集合です。ロケーターは、$webDriver.findElement
などの関数に渡すことができるDOM要素を検索します。$selenium.By
からそれらを呼び出します。
機能 | 説明 |
---|---|
| 特定のクラス名を持つ要素を特定します。返されるロケーターは、CSSセレクタ 戻り値:ロケーター |
| CSSセレクタを使って、要素を特定します。 戻り値:ロケーター |
| IDで要素を特定します。 戻り値:ロケーター |
| 表示されているテキストが指定された文字列と一致するリンク要素を特定します。 戻り値:ロケーター |
| JavaScript式を評価して要素を特定します。 戻り値:ロケーター |
| name属性に指定された値が含まれている要素を特定します。 戻り値:ロケーター |
| 表示されているgetTextに指定された部分文字列が含まれているリンク要素を特定します。 戻り値:ロケーター |
| 指定されたタグ名を持つ要素を特定します。返されるロケーターは、 戻り値:ロケーター |
| XPathセレクタに一致する要素を特定します。 戻り値:ロケーター |
WebElement:ページ要素とのインタラクション
WebElementリファレンスが返された場合は、$webDriver.findElement
の関数を使って、その要素を操作できます。たとえば、ボタンをクリックし、テキストを送信して入力を書式設定し、テストする要素の属性を取得します。
機能 | 説明 |
---|---|
| この要素をクリックします。 戻り値:自己参照 |
| このインスタンスで表されるDOM要素のシーケンスを入力するコマンドをスケジュールします。 戻り値:WebElement |
| この要素のタグ/ノード名をクエリするコマンドをスケジュールします。 戻り値:WebElement |
| このインスタンスで表される要素の計算されたスタイルをクエリするコマンドをスケジュールします。要素が指定されたスタイルをその親から継承する場合、その値のクエリはその親に対して実行されます。可能な場合、色の値は16進数表現に変換されます(例: 戻り値:promise |
| 要素の指定された属性の値をクエリするコマンドをスケジュールします。 戻り値:promise |
| 先頭と末尾の空白を除いて、部分要素を含め、この要素の表示されている(CSSで非表示にされていない) 戻り値:promise |
| このインスタンスで表されるDOM要素が、無効な属性によって決定されたとおりに有効化されているかどうかをクエリするコマンドをスケジュールします。 戻り値:promise |
| この要素が選択されているかどうかをクエリするコマンドをスケジュールします。 戻り値:promise |
| この要素(または、 戻り値:promise |
| この要素の値をクリアするコマンドをスケジュールします。 戻り値:promise |
| この要素が現在表示されているかどうかをテストするコマンドをスケジュールします。 戻り値:promise |
ActionSequence:複数のアクションをリンク
アクションシーケンスを使用すると、Webサイトとの複雑なユーザーインタラクションを作成できます。
- 新しいアクションシーケンスを作成するには、
$webDriver.actions()
を使用します。 - 複数のアクションを1つのシーケンスにリンクするには、それぞれのアクションの後に
perform()
を含めます。これにより、シングルアクションのシーケンスを含む個々のシーケンスが実行された後、終了されます。
以下の表は、利用可能なアクションのリストを示しています。詳細については、GitHubのWebDriver ActionSequenceに関するドキュメントをご覧ください。
機能 | 説明 |
---|---|
| マウスボタンをクリックします。要素が指定されている場合、マウスは最初にその要素の中央に移動します。これは 戻り値:actionsequence |
| マウスボタンをダブルクリックします。要素が指定されている場合、マウスは最初にその要素の中央に移動します。 戻り値:actionsequence |
| 「ドラッグ&ドロップ」操作を実行する便利な関数。ターゲット要素は、別の要素の位置に移動するか、オフセット(ピクセル単位)で移動することができます。この位置は、2つのプロパティ 戻り値:actionsequence |
| 修飾キーを押します。 戻り値:actionsequence |
| 修飾キーをリリースします。リリースは、現在フォーカスされている要素をターゲットにします。 戻り値:actionsequence |
| マウスボタンを押します。マウスボタンは、 戻り値:actionsequence |
| マウスボタンをリリースします。この関数の呼び出しに対する動作は、 戻り値:actionsequence |
| マウスを移動します。移動する位置は、マウスの現在の位置、要素の左上隅に相対的なオフセット、または要素(この場合は要素の中央が使用される) の観点から指定できます。 戻り値:actionsequence |
| このアクションシーケンスを実行します。 戻り値:promise |
| 複数のキーの入力をシミュレートします。このシーケンス中に修飾キーがあった場合、それぞれ、その修飾キーが再度現れるまでリリースされません。すべてのキーイベントは、現在フォーカスされている要素をターゲットにします。サポートされている英数字以外のキーの全リストについては、GitHubのWebDriver enumキーのドキュメントをご覧ください。 戻り値:actionsequence |
Promise:アクションをシーケンスにリンクする
関数をpromiseで直接実行することもできます。Syntheticsモニタリングは、ネイティブのNode.js環境であり、標準的なNode.jsのpromiseを使用します。
これらの関数は、promiseのステータスの評価やpromiseのキャンセルなどを行います。具体的には、then()
関数とその兄弟関数finally()
とcatch()
を使用して、アクションシーケンスを作成できます。とのアクションのシーケンスを作成できます。詳細については、「シーケンスアクション」をご覧ください。
ヒント
.then構文を使用してPromiseチェーンをサポートすることに加えて、このランタイムは、非同期待機構文もサポートします。
機能 | 説明 |
---|---|
| このpromiseの値がまだ計算中であるかどうか。 戻り値:ブール値 |
| このインスタンスが解決されたときのためのリスナーを登録します。これは、スクリプトで同期アクションをリンクするために使用される基本的な関数です。 戻り値:promise |
| このpromiseが解決されたときに呼び出すリスナーを登録します。promiseの値が正常に計算されたかどうかは関係ありません。 戻り値:promise |
| このpromiseが拒否されたときのためのリスナーを登録します。 戻り値:promise |
Navigate:ブラウザの履歴を移動する
$webDriver.navigate()
関数は、ブラウザの履歴を前後に移動したり、ページを更新したり、新しいページに移動したりするためのさまざまな関数を提供します。
機能 | 説明 |
---|---|
| ブラウザの履歴を1つ前に戻します。 戻り値:void |
| ブラウザの履歴を1つ先に進めます。 戻り値:void |
| 現在のページを更新します。 戻り値:void |
| 現在のブラウザウィンドウで新しいウェブページを読み込みます。 戻り値:void |
Conditions:一時停止と条件待ち
ヒント
Seleniumでの待機時間の詳細については、公式文書をご覧ください。
$webDriver.wait
と使用すると、until
は条件が一致するまで、スクリプトの実行を一時停止します。詳細については、SeleniumのWebDriver until
のドキュメントを参照してください。
$selenium.until.Condition
に対して利用可能な関数:
機能 | 説明 |
---|---|
| 入力ドライバが指定されたフレームに切り替えることができるまで待機する条件を作成します。ターゲットフレームは、次のように指定できます。
|
| アラートがオープンされるのを待機する条件を作成します。処理が正常に完了したら、返されるpromiseはオープンされたアラートのハンドルで実行されます。 戻り値:条件 |
| 指定された要素が無効になるまで待機する条件を作成します。 戻り値:条件 |
| 指定された要素が有効になるまで待機する条件を作成します。 戻り値:条件 |
| 指定された要素がユーザーには表示されないが、DOMに現れるまで待機する条件を作成します。 戻り値:条件 |
| 指定された要素が表示されるまで待機する条件を作成します。 戻り値:条件 |
| 指定された要素が選択されるまで待機する条件を作成します。 戻り値:条件 |
| 要素が指定されたロケーターで見つかるまでループする条件を作成します。 戻り値:条件 |
| 少なくとも1つの要素が指定されたロケーターで見つかるまでループする条件を作成します。 戻り値:条件 n |
| 指定された要素の表示されているテキストに指定された部分文字列が含まれるまで待機する条件を作成します。 戻り値:条件 |
| 大文字と小文字が区別されます。指定された要素の表示されているテキストが指定されたテキストに正確に一致するまで待機する条件を作成します。 戻り値:条件 n |
| 指定された要素の表示されているテキストが正規表現に一致するまで待機する条件を作成します。 戻り値:条件 |
| 指定された要素が古くなるまで待機する条件を作成します。要素はDOMから削除された時点で、または新しいページがロードされた時点で、古くなったとみなされます。 戻り値:条件 |
| 現在のページのタイトルに指定された部分文字列が含まれるまで待機する条件を作成します。 戻り値:条件 |
| 現在のページのタイトルが指定された値に一致するまで待機する条件を作成します。 戻り値:条件 |
| 現在のページのタイトルが指定された正規表現と一致するまで待機する条件を作成します。 戻り値:条件 |
高度な例
次の例では、コードを定数、依存関係、設定、ページ要素、関数、スクリプトの開始という機能セクションに分割します。以下に方法を説明します。
- タイムアウトを設定して障害時間を最小限に抑え、パフォーマンスを向上させる
- CSSまたはIDで要素を検索する
waitForAndFindElement
を定義します。console.log()
を使用してスクリプトログを整理し、アサートの失敗やタイムアウトに関する問題を特定する- try/catchブロックを使用してエラーを処理し、失敗したステップを特定する有用なエラーメッセージをスローする
/** * Script Name: Advanced Example * Author: New Relic * Version: 1.6 */
// -------------------- CONSTANTSconst SCRIPT_NAME = "Best Practices - Chrome 100" // name to record in script logconst IMPLICIT_TIMEOUT = 3000 // default implicit timeout is 10 secondsconst PAGE_LOAD_TIMEOUT = 60000 // default page load timeout is 60 seconds, fail early to prevent long duration timeoutsconst SCRIPT_TIMEOUT = 20000 // default script timeout is 30 secondsconst USER_AGENT = "default" // set the user agent for Chromeconst PROTOCOL = "https://" // set the protocolconst USERNAME = "" // username:const PASSWORD = "" // password@const DOMAIN = "docs.newrelic.com" // your domainconst PATH = "/docs/new-relic-solutions/get-started/intro-new-relic/" // path to main pageconst CHECK = "Get started with New Relic" // text to match on pageconst AUTH = USERNAME + PASSWORD // could be stored as secure credentialsconst MAIN_URL = PROTOCOL + AUTH + DOMAIN + PATH
// -------------------- DEPENDENCIESconst assert = require("assert")
// -------------------- CONFIGURATIONawait $webDriver.manage().setTimeouts({ implicit: IMPLICIT_TIMEOUT, // sets element load timeout pageLoad: PAGE_LOAD_TIMEOUT, // sets page load timeout script: SCRIPT_TIMEOUT // sets script timeout})
// -------------------- ELEMENTSconst By = $selenium.Byconst loc = { title: By.css("#gatsby-focus-wrapper > div.css-1uz5ayg > div > main > div > h1"), start: [ { step: 'signup', selector: By.id("sign-up-for-new-relic-if-you-havent-already") }, { step: 'add', selector: By.id("add-your-data") }, { step: 'explore', selector: By.id("explore-your-data") }, { step: 'query', selector: By.id("query-your-data") }, { step: 'dashboard', selector: By.id("set-up-a-dashboard") }, { step: 'alerts', selector: By.id("configure-alerts") } ]}
// -------------------- FUNCTIONS// for backwards compatibility with legacy runtimesasync function waitForAndFindElement(locator, timeout) { const element = await $webDriver.wait( $selenium.until.elementLocated(locator), timeout, "Timed-out waiting for element to be located using: " + locator ) await $webDriver.wait( $selenium.until.elementIsVisible(element), timeout, "Timed-out waiting for element to be visible using ${element}" ) return await $webDriver.findElement(locator)}
// -------------------- START OF SCRIPT// Start loggingconst start_time = new Date()console.log("Starting synthetics script: " + SCRIPT_NAME)
// confirm timeouts are setconst {implicit, pageLoad, script} = await $webDriver.manage().getTimeouts()console.log("Timeouts are set to:")console.log(" IMPLICIT: " + implicit / 1000 + "s")console.log(" PAGE LOAD: " + pageLoad / 1000 + "s")console.log(" SCRIPT: " + script / 1000 + "s")
// Setting User Agent is not then-able, so we do this first (if defined and not default)if (USER_AGENT && 0 !== USER_AGENT.trim().length && USER_AGENT != "default") { $headers.add("User-Agent", USER_AGENT) console.log("Setting User-Agent to " + USER_AGENT)}
// if an error happens at any step, script execution is halted and a failed result is returnedconsole.log("1. get: " + MAIN_URL)await $webDriver.get(MAIN_URL)
console.log("2. waitForAndFindElement: " + loc.title)const textBlock = await waitForAndFindElement(loc.title, IMPLICIT_TIMEOUT)
console.log("3. getText: " + CHECK)const text1 = await textBlock.getText()
console.log("4. assert.equal: " + text1)assert.equal(text1, CHECK, "title validation text not found")
console.log("5. takeScreenshot")await $webDriver.takeScreenshot()
console.log("6. findElement")loc.start.forEach(async function (nr, i) { let n = i + 1 try{ // verify each asset has loaded console.log(" " + n + ". " + nr.step + ": " + nr.selector) await $webDriver.findElement(nr.selector) }catch(exception){ console.error("Failure in Step 6." + n) throw exception }})
// End loggingconst end_time = new Date()
// Calculate the durationconst script_duration = (end_time - start_time) / 1000
// Log the timesconsole.log("Start time: " + start_time)console.log("End time: " + end_time)console.log("Duration: " + script_duration + "s")
Shadow DOM:要素の検索
このランタイムでは、新しいSelenium WebDriverメソッドgetShadowRoot()
を使用してのShadow DOM要素へのアクセスがサポートされました。
- シャドウホストを見つけるには、
findElement
または同様の最上位関数を使用します。これは、シャドウルートがマウントされる要素です。 - 手順1で見つかった要素の
getShadowRoot()
メソッドを使用して、シャドウルートを取得します。 - シャドウルートを使用して、findElementまたは同様の関数を使用して、シャドウルート内の要素を検索できるようになりました。複数レベルのShadow DOMを使用する場合、操作に必要な要素を含むシャドウルートオブジェクトにアクセスするまで、これらの手順を繰り返す必要があります。
ヒント
Chromeはシャドールートオブジェクト内のXPathロケーターの使用をサポートしていません。別のロケーターオプションを使用して、シャドールートオブジェクト内の要素を検索してください。
例:
// Find the shadow hostlet myShadowHost = await $webDriver.findElement($selenium.By.id('exampleShadowHost'));// Get the shadow rootlet myShadowRoot = await myShadowHost.getShadowRoot();// Interact with an element inside the shadow rootlet el = await myShadowRoot.findElement($selenium.By.id('myButton'));await el.click();