xpath axes dynamic xpath selenium webdriver
このチュートリアルでは、使用されるさまざまなXPath軸、例、および構造の説明を使用して、SeleniumWebDriverの動的XPathのXPath軸について説明します。
前のチュートリアルでは、XPath関数と、要素を識別する際のその重要性について学習しました。ただし、複数の要素の方向と命名法が類似しすぎると、要素を一意に識別することができなくなります。
=> ここで完璧なSeleniumトレーニングガイドを確認してください。
学習内容:
XPath軸を理解する
例を用いて、上記のシナリオを理解しましょう。
「編集」テキストの2つのリンクが使用されるシナリオを考えてみてください。このような場合、HTMLのノード構造を理解することが適切になります。
以下のコードをコピーしてメモ帳に貼り付け、.htmファイルとして保存してください。
Edit Edit
UIは次の画面のようになります。
問題文
Q#1)XPath関数でさえ要素を識別できない場合はどうすればよいですか?
回答: このような場合、XPath関数とともにXPath軸を使用します。
この記事の第2部では、階層HTML形式を使用して要素を識別する方法について説明します。 XPath軸に関する少しの情報を取得することから始めます。
広告なしのアンドロイドのための最高のmp3ダウンローダー
Q#2)XPath軸とは何ですか?
回答: XPath軸は、現在の(コンテキスト)ノードを基準にしてノードセットを定義します。これは、そのツリー上のノードに関連するノードを見つけるために使用されます。
Q#3)コンテキストノードとは何ですか?
回答: コンテキストノードは、XPathプロセッサが現在監視しているノードとして定義できます。
Seleniumテストで使用されるさまざまなXPath軸
以下にリストされている13の異なる軸があります。ただし、Seleniumのテスト中にそれらすべてを使用するわけではありません。
- 祖先 :この軸は、コンテキストノードに関連するすべての祖先を示し、ルートノードまで到達します。
- 祖先または自己: これは、コンテキストノードと、コンテキストノードに関連するすべての祖先を示し、ルートノードを含みます。
- 属性: これは、コンテキストノードの属性を示します。 「@」記号で表すことができます。
- 子: これは、コンテキストノードの子を示します。
- 下向き: これは、コンテキストノードの子、および孫とその子(存在する場合)を示します。これは、属性と名前空間を示すものではありません。
- 子孫または自己: これは、コンテキストノードとその子、およびコンテキストノードの孫とその子(存在する場合)を示します。これは、属性と名前空間を示すものではありません。
- 以下: これは、表示されるすべてのノードを示します 後 HTMLDOM構造のコンテキストノード。これは、子孫、属性、および名前空間を示すものではありません。
- 次の兄弟: これは、すべての兄弟ノード(コンテキストノードと同じ親)を示します。 現れる HTMLDOM構造のコンテキストノードの後。これは、子孫、属性、および名前空間を示すものではありません。
- 名前空間: これは、コンテキストノードのすべての名前空間ノードを示します。
- 親: これは、コンテキストノードの親を示します。
- 前: これは、表示されるすべてのノードを示します 前 HTMLDOM構造のコンテキストノード。これは、子孫、属性、および名前空間を示すものではありません。
- 前の兄弟: これは、表示されるすべての兄弟ノード(コンテキストノードと同じ親)を示します 前 HTMLDOM構造のコンテキストノード。これは、子孫、属性、および名前空間を示すものではありません。
- 自己: これはコンテキストノードを示します。
XPath軸の構造
XPath軸がどのように機能するかを理解するには、以下の階層を検討してください。
上記の例については、以下の簡単なHTMLコードを参照してください。以下のコードをコピーしてメモ帳エディタに貼り付け、.htmlファイルとして保存してください。
Animal
Vertebrate
Fish
Mammal
Herbivore
Carnivore
Lion
Tiger
Other
Invertebrate
Insect
Crustacean
ページは以下のようになります。私たちの使命は、XPath軸を利用して要素を一意に見つけることです。上のグラフでマークされている要素を特定してみましょう。コンテキストノードは '哺乳類'
#1)祖先
日記: コンテキストノードから祖先要素を識別するため。
XPath#1: // div (@ class = ’Mammal’) / ancestor :: div
XPath“ // div (@ class = ’Mammal’) / ancestor :: div”は、2つの一致するノードをスローします。
- 脊椎動物は「哺乳類」の親であるため、祖先とも見なされます。
- 「哺乳類」の親の親である動物であるため、祖先と見なされます。
ここで、「動物」クラスである要素を1つだけ識別する必要があります。以下に説明するように、XPathを使用できます。
XPath#2: //div(@class='Mammal')/ancestor::div(@class='Animal')
「動物」というテキストにアクセスしたい場合は、以下のXPathを使用できます。
#2)祖先または自己
日記: コンテキストノードと、コンテキストノードからの祖先要素を識別するため。
XPath#1: // div (@ class = ’Mammal’) / ancestor-or-self :: div
上記のXPath#1は、3つの一致するノードをスローします。
- 動物(祖先)
- 脊椎動物
- 哺乳類(自己)
#3)子供
日記: コンテキストノード「哺乳類」の子を識別するため。
XPath#1: // div (@ class = ’Mammal’) / child :: div
XPath#1 コンテキストノード「哺乳類」のすべての子を識別するのに役立ちます。特定の子要素を取得する場合は、XPath#2を使用してください。
XPath#2: // div (@ class = ’Mammal’) / child :: div (@ class = ’Herbivore’) / h5
#4)子孫
日記: コンテキストノードの子と孫を識別するため(例:「動物」)。
XPath#1: // div (@ class = ’Animal’) / descendant :: div
動物は階層の最上位メンバーであるため、すべての子要素と子孫要素が強調表示されています。参照用にコンテキストノードを変更し、必要な要素をノードとして使用することもできます。
#5)子孫または自己
日記: 要素自体とその子孫を見つけるため。
XPath1: // div (@ class = ’Animal’) / descendant-or-self :: div
子孫と子孫または自己の唯一の違いは、子孫を強調表示することに加えて、それ自体を強調表示することです。
#6)フォロー
日記: コンテキストノードに続くすべてのノードを検索します。ここで、コンテキストノードはMammal要素を含むdivです。
XPath: // div (@ class = ’Mammal’) / follow :: div
次の軸では、子または子孫であるかどうかに関係なく、コンテキストノードに続くすべてのノードが強調表示されます。
Eclipse用のC ++コンパイラ
#7)フォロー兄弟
日記: 同じ親を共有し、コンテキストノードの兄弟であるコンテキストノードの後のすべてのノードを検索します。
XPath: // div (@ class = ’Mammal’) / follow-sibling :: div
次の兄弟と次の兄弟の主な違いは、次の兄弟はコンテキストの後にすべての兄弟ノードを取得しますが、同じ親も共有することです。
#8)前へ
日記: コンテキストノードの前にあるすべてのノードを取ります。親または祖父母ノードの場合があります。
ここで、コンテキストノードは無脊椎動物であり、上の画像で強調表示されている線は、無脊椎動物ノードの前にあるすべてのノードです。
#9)前の兄弟
日記: コンテキストノードと同じ親を共有し、コンテキストノードの前にある兄弟を見つけること。
コンテキストノードは無脊椎動物であるため、強調表示されている要素は脊椎動物のみです。これら2つは兄弟であり、同じ親「動物」を共有しているためです。
#10)親
日記: コンテキストノードの親要素を検索します。コンテキストノード自体が祖先である場合、親ノードはなく、一致するノードをフェッチしません。
コンテキストノード#1:哺乳類
XPath: // div (@ class = ’Mammal’) / parent :: div
コンテキストノードが哺乳類であるため、脊椎動物の要素は哺乳類の親であるため、強調表示されています。
コンテキストノード#2:動物
XPath: // div (@ class = ’Animal’) / parent :: div
動物ノード自体が祖先であるため、ノードは強調表示されません。したがって、一致するノードは見つかりませんでした。
#11)自己
日記: コンテキストノードを見つけるために、selfが使用されます。
コンテキストノード: 哺乳類
XPath: // div (@ class = ’Mammal’) / self :: div
上で見ることができるように、哺乳類のオブジェクトは一意に識別されています。以下のXPathを使用して、「哺乳類」というテキストを選択することもできます。
XPath: // div (@ class = ’Mammal’) / self :: div / h4
前後の軸の使用
ターゲット要素がコンテキストノードの前後のタグの数であることがわかっている場合、すべての要素ではなく、その要素を直接強調表示できます。
例:前(インデックス付き)
ソフトウェアテストにおけるqaとqcとは何ですか
コンテキストノードが「その他」であり、要素「哺乳類」に到達したいとします。そのためには、以下のアプローチを使用します。
最初の一歩: インデックス値を指定せずに、単に先行を使用します。
XPath: // div (@ class = ’Other’) / preceding :: div
これにより、6つの一致するノードが得られ、ターゲットノード「哺乳類」が1つだけ必要になります。
第二段階: インデックス値(5)をdiv要素に与えます(コンテキストノードから上向きにカウントします)。
XPath: // div (@ class = ’Other’) / previous :: div (5)
このようにして、「哺乳類」要素が正常に識別されました。
例:以下(インデックス付き)
コンテキストノードが「哺乳類」であり、要素「甲殻類」に到達したいとします。そのために、以下のアプローチを使用します。
最初の一歩: インデックス値を指定せずに、以下を使用するだけです。
XPath: // div (@ class = ’Mammal’) / follow :: div
これにより、4つの一致するノードが得られ、ターゲットノード「甲殻類」が1つだけ必要になります。
第二段階: インデックス値(4)をdiv要素に与えます(コンテキストノードから数えます)。
XPath: // div (@ class = ’Other’) / follow :: div (4)
このようにして、「甲殻類」の要素が正常に識別されました。
上記のシナリオは、次の方法で再作成することもできます。 前の兄弟 そして 次の兄弟 上記のアプローチを適用することによって。
結論
オブジェクトの識別は、Webサイトの自動化において最も重要なステップです。オブジェクトを正確に学習するスキルを習得できれば、自動化の50%が完了します。要素を識別するために使用できるロケーターはありますが、ロケーターでさえオブジェクトを識別できない場合があります。このような場合、さまざまなアプローチを適用する必要があります。
ここでは、XPath関数とXPath軸を使用して要素を一意に識別しました。
覚えておくべきいくつかのポイントを書き留めて、この記事を締めくくります。
- コンテキストノード自体が祖先であるコンテキストノードに「祖先」軸を適用しないでください。
- コンテキストノード自体が祖先であるコンテキストノードに「親」軸を適用しないでください。
- コンテキストノード自体が子孫であるコンテキストノードに「子」軸を適用しないでください。
- コンテキストノード自体が祖先であるコンテキストノードに「子孫」軸を適用しないでください。
- HTMLドキュメント構造の最後のノードであるコンテキストノードに「次の」軸を適用しないでください。
- HTMLドキュメント構造の最初のノードであるコンテキストノードに「先行」軸を適用しないでください。
ハッピーラーニング!!!
=> 独占的なSeleniumトレーニングチュートリアルシリーズについては、こちらをご覧ください。
推奨読書
- Seleniumの動的XPathのXPath関数
- Cucumber Seleniumチュートリアル:Cucumber Java SeleniumWebDriverの統合
- Seleniumロケーター:SeleniumでXPathを使用してWeb要素を特定する(例)
- Selenium WebDriverの概要– Seleniumチュートリアル#8
- ChromeDriver Seleniumチュートリアル:ChromeでのSeleniumWebdriverテスト
- 最初のWebDriverスクリプトの実装– Selenium WebDriverチュートリアル#10
- 30以上の最高のSeleniumチュートリアル:実際の例でSeleniumを学ぶ
- SeleniumスクリプトでのWebテーブル、フレーム、および動的要素の処理– Seleniumチュートリアル#18