セレクタ
WebDriver Protocolは、要素を照会するためのいくつかのセレクタ戦略を提供しています。WebdriverIOはこれらを簡素化して、要素の選択を簡単に保ちます。要素を照会するコマンドは$
と$$
と呼ばれていますが、これらはjQueryやSizzle Selector Engineとは関係がないことに注意してください。
多くの異なるセレクタが利用可能ですが、そのうちのいくつかだけが適切な要素を見つけ るための堅牢な方法を提供します。例えば、次のようなボタンがある場合:
<button
id="main"
class="btn btn-large"
name="submission"
role="button"
data-testid="submit"
>
Submit
</button>
以下のセレクタを__推奨__および__推奨しない__:
セレクタ | 推奨 | 注釈 |
---|---|---|
$('button') | 🚨 絶対に使用しない | 最悪 - 一般的すぎて、コンテキストがない。 |
$('.btn.btn-large') | 🚨 絶対に使用しない | 悪い。スタイリングに依存。変更される可能性が高い。 |
$('#main') | ⚠️ 控えめに | より良い。しかしスタイリングやJSイベントリスナーに依存している。 |
$(() => document.queryElement('button')) | ⚠️ 控えめに | 効果的な照会だが、記述が複雑。 |
$('button[name="submission"]') | ⚠️ 控えめに | name 属性に依存しており、HTML的な意味がある。 |
$('button[data-testid="submit"]') | ✅ 良い | 追加の属性が必要だが、アクセシビリティとは接続されていない。 |
$('aria/Submit') または $('button=Submit') | ✅ 常に | 最良。ユーザーがページとどのように相互作用 するかを反映している。フロントエンドの翻訳ファイルを使用して、翻訳が更新されてもテストが失敗しないようにすることをお勧めします |
CSS クエリセレクタ
特に指定がない限り、WebdriverIOはCSSセレクタパターンを使用して要素を照会します。例:
loading...
リンクテキスト
特定のテキストを含むアンカー要素を取得するには、等号(=
)で始まるテキストを照会します。
例えば:
loading...
このように要素を照会できます:
loading...
部分的なリンクテキスト
表示されているテキストが検索値と部分的に一致するアンカー要素を見つけるには、
クエリ文字列の前に *=
を使用して照会します(例:*=driver
)。
上記の例の要素も次のように呼び出すことで照会できます:
loading...
注意: 1つのセレクタ内で複数のセレクタ戦略を混在させることは できません。代わりに、複数の連鎖した要素クエリを使って同じ目標に到達してください。例:
const elem = await $('header h1*=Welcome') // これは動作しません!!!
// 代わりに次のようにしてください
const elem = await $('header').$('*=driver')
特定のテキストを持つ要素
同じ手法を要素にも適用できます。さらに、クエリ内で.=
や.*=
を使用して大文字小文字を区別しないマッチングを行うこともできます。
例えば、「Welcome to my Page」というテキストを持つレベル1の見出しに対するクエリは次のとおりです:
loading...
このように要素を照会できます:
loading...
または部分テキストを使用して照会:
loading...
同様にid
やclass
名でも機能します:
loading...
このように要素を照会できます:
loading...
注意: 1つのセレクタ内で複数のセレクタ戦略を混在させることはできません。代わりに、複数の連鎖した要素クエリを使って同じ目標に到達してください。例:
const elem = await $('header h1*=Welcome') // これは動作しません!!!
// 代わりに次のようにしてください
const elem = await $('header').$('h1*=Welcome')
タグ名
特定のタグ名を持つ要素を照会するには、<tag>
または<tag />
を使用します。
loading...
このように要素を照会できます:
loading...
name属性
特定のname属性を持つ要素を照会するには、通常のCSS3セレクタを使用するか、[name="some-name"]のようなセレクタパラメータを渡すことで、JSONWireProtocolから提供されているname戦略を使用できます:
loading...
loading...
注意: このセレクタ戦略は非推奨であり、JSONWireProtocolプロトコルで実行される古いブラウザやAppiumを使用する場合にのみ機能します。
xPath
xPathを使用して要素を照会することも可能です。
xPathセレクタは//body/div[6]/div[1]/span[1]
のような形式を持ちます。
loading...
次のように2番目の段落を照会できます:
loading...
xPathを使用してDOMツリーを上下に移動することもできます:
loading...
アクセシビリティ名セレクタ
アクセシブルな名前で要素を照会します。アクセシブルな名前とは、その要素がフォーカスを受け取ったときにスクリーンリーダーによって通知されるものです。アクセシブルな名前の値は、視覚的なコンテンツまたは非表示のテキスト代替の両方が可能です。
このセレクタの詳細については、リリースブログ記事をご覧ください
aria-label
による取得
loading...
loading...
aria-labelledby
による取得
loading...
loading...
コンテンツによる取得
loading...
loading...
タイトルによる取得
loading...
loading...
alt
プロパティによる取得
loading...
loading...
ARIA - ロール属性
ARIAロールに基づいて要素を照会するには、セレクタパラメータとして[role=button]
のように要素のロールを直接指定できます:
loading...
loading...
ID属性
「id」のロケーター戦略はWebDriverプロトコルではサポートされていません。IDを使用して要素を見つけるには、CSSまたはxPathセレクタ戦略を使用する必要があります。
ただし、一部のドライバー(例:Appium You.i Engine Driver)では、このセレクタがサポートされている場合があります。
現在サポートされているIDのセレクタ構文は以下のとおりです:
//cssロケーター
const button = await $('#someid')
//xpathロケーター
const button = await $('//*[@id="someid"]')
//id戦略
// 注意:AppiumやIDロケーター戦略をサポートする同様のフレームワークでのみ動作します
const button = await $('id=resource-id/iosname')
JS関数
WebネイティブのAPIを使用してJavaScript関数で要素をフェッチすることもできます。もちろん、これはWebコンテキスト(例:browser
、またはモバイルのWebコンテキスト)内でのみ行うことができます。
次のHTML構造を例にとります:
loading...
次のように#elem
の兄弟要素を照会できます:
loading...
ディープセレクタ
WebdriverIOのv9
以降では、自動的にシャドウDOMを通過するため、この特殊なセレクタは必要ありません。セレクタの前にある>>>
を削除して、このセレクタから移行することをお勧めします。
多くのフロントエンドアプリケーションはシャドウDOMを持つ要素に大きく依存しています。回避策なしにシャドウDOM内の要素を照会することは技術的に不可能です。shadow$
およびshadow$$
はそのような回避策でしたが、制限がありました。ディープセレクタを使用すると、通常のクエリコマンドを使用して、任意のシャドウDOM内のすべての要素を照会できるようになりました。
次のような構造のアプリケーションがあるとします:
このセレクタを使用すると、別のシャドウDOM内にネストされている<button />
要素を照会できます:
loading...
モバイルセレクタ
ハイブリッドモバイルテストでは、自動化サーバーがコマンドを実行する前に正しいコンテキストにあることが重要です。ジェスチャーを自動化するには、ドライバーが理想的にはネイティブコンテキストに設定されている必要があります。しかし、DOMから要素を選択するには、ドライバーをプラットフォームのウェブビューコンテキストに設定する必要があります。その後、上記で述べた方法を使用できます。
ネイティブモバイルテストでは、コンテキスト間の切り替えはなく、モバイル戦略を使用して基礎となるデバイス自動化技術を直接使用する必要があります。これは特に、テストが要素を見つけるための細かい制御を必要とする場合に役立ちます。
Android UiAutomator
AndroidのUI Automatorフレームワークは、要素を見つけるためのいくつかの方法を提供しています。UI Automator API、特にUiSelectorクラスを使用して要素を特定できます。Appiumでは、Javaコードを文字列としてサーバーに送信し、アプリケーションの環境で実行して、要素または要素を返します。
const selector = 'new UiSelector().text("Cancel").className("android.widget.Button")'
const button = await $(`android=${selector}`)
await button.click()