xpath functions dynamic xpath selenium
このチュートリアルでは、例を使用して要素を識別する際のXPath関数の使用法について説明します。
Webサイトを自動化する前に、オブジェクトを正しく識別してから、同じ操作を実行する必要があります。要素を識別する最も簡単な方法は、ID、名前、リンク、クラスなどの属性、または要素が存在するタグで使用できるその他の一意の属性を使用することです。
これは、これらの属性が存在するか、オブジェクトが正しく識別されるように一意である場合にのみ可能です。
=> ここでSeleniumビギナーズガイドをご覧ください。
学習内容:
XPath関数の概要
属性がすぐに利用できないシナリオについて説明しましょう。
問題文
ID、名前、クラス、リンクなどのロケーターが要素タグで使用できない場合、どのように要素を識別しますか?
これは、与えられた例で明確に理解できます。
ログインする ツイッター

上のスクリーンショットでわかるように、ヘッダー「Log intoTwitter」には属性が付加されていません。そうは言っても、ID、クラス、リンク、名前などのロケーターを使用してこの要素を識別することはできません。
オンラインで無料でアニメを見ることができる場所
FirefoxツールのFirepathプラグインは、以下のXPathを生成しました。
// * (@ id = ’page-container’) / div / div (1) / h1
上記のXPathをページ構造またはIDとして使用することは、動的に変更される可能性があるためお勧めしません。この不安定なXPathを使用する場合、XPathをより頻繁に変更する必要があり、保守に時間がかかります。これは、id、class、name、linkなどのロケーターで汎用XPath式を使用できない1つのケースです。
解決
テキストによるXPath関数を使用した要素の識別
「Twitterにログイン」というテキストが表示されているので、以下を利用します。 XPath関数 要素を一意に識別します。
- contains()(テキストによる)
- 開始-with()(テキストによる)
- テキスト()
「Twitterにログイン」というテキストを使用してcontains()、starts-with()、text()などのXPath関数を使用すると、要素を正しく識別でき、同じ要素に対してさらに操作を実行できます。
#1)Contains()メソッド:
構文: 「Twitterにログイン」Web要素を見つけるには、contains()メソッドを含む次のXPath式のいずれかを使用します。
テキストで
- // h1 (contains(text()、 ’Log in to’))
- // h1 (contains(text()、 ’in to Twitter’))


注:1つの一致するノードは、Web要素が正常に識別されたことを示します。
上記の例から、contains()メソッドが要素を正しく識別するためにabsolute(full)テキストを必要としないことは明らかです。部分的なテキストはそれを正しく識別するのに十分です。ただし、選択するテキストの一部は一意である必要があります。 contains()メソッドを使用してページの向きを変更した場合でも、ユーザーは要素を簡単に識別できます。
contains()メソッドで絶対テキスト「Login to Twitter」を使用しても、要素は正しく識別されることに注意してください。
#2)Starts-with()メソッド:
構文: 「Twitterにログイン」Web要素を見つけるには、starts-with()メソッドを持つ次のサンプルXPath式を使用します。
テキストで
- // h1 (starts-with(text()、 ’Log in’))
- // h1 (starts-with(text()、 ’Log in to’))


上記の例から、XPath関数のstarts-with()メソッドでは、要素を一意に識別するために、表示されるテキストの少なくとも最初の単語( 'Log')が必要であることは明らかです。また、部分的なテキストでも機能し、部分的に表示されるテキストの最初の単語を含めないと失敗します。
start-with()メソッドで絶対テキスト「Loginto Twitter」を使用しても、要素は正しく識別されることに注意してください。
start-with()のXPathが無効です: // h1 (starts-with(text()、 'in to Twitter'))

注意: 一致するノードがない場合は、Web要素が識別されていないことを示しています。
#3)Text()メソッド:
構文: 「Twitterにログイン」Web要素を見つけるには、text()メソッドを持つ次のXPath式を使用します。

この式では、開始タグの間に存在する絶対テキストを使用します。 contains()やstarts-with()のように部分的なXpathでtext()関数を使用すると、要素を見つけることができません。

text()のXpathが無効です:


XPath関数を使用した要素の属性による識別
コンテナタグで使用可能な一意に識別された属性値がある場合、属性とともにXPath関数(containsまたはstarts-with)を使用します。属性には、「@」記号を使用してアクセスします。
これは与えられたもので明確に理解することができます 例:
ログインする グーグル
#1)Contains()メソッド:
構文: XPath関数contains()を使用して「I’m Feeling Lucky」ボタン要素を一意に識別するには、属性を使用します。
(i)値属性別:
- // input (contains(@ value、 ’Feeling’))
- // input (contains(@ value、 ’Lucky’))


上記の画像から、contains()メソッドで「Feeling」または「Lucky」のいずれかで属性値を使用すると、要素が一意に識別されることがわかります。ただし、Value属性の完全なコンテンツを使用する場合でも、要素を正しく識別することに注意することが重要です。
(ii)名前属性別:
//input(contains(@name=’btnI’)) 
次の属性を持つXPath関数の無効なケース:
contains()メソッドとstarts-with()メソッドで使用する属性の選択には十分注意する必要があります。属性値が一意でない場合、要素を一意に識別することはできません。
「I’m Feeling Lucky」ボタンを識別するときに「type」属性を使用すると、XPathが機能しないとします。

2つの一致するノードは、要素が正しく識別されていないことを示します。ここで、type属性値は一意ではありません。
#2)Starts-with()メソッド:
属性を持つstarts-with()メソッドは、属性の前の部分が固定されたままで、後の部分が変化し続ける要素を見つける必要がある場合に非常に役立ちます。このアプローチは、オブジェクトがその属性の値を動的に変更している場合に非常に役立ちます。これは、同様の種類の要素をキャプチャする場合にも使用できます。
に移動 フェイスブックログイン
サインアップフォームの最初のテキストボックス「FirstName」と2番目のテキストボックス「Surname」を調べます。

最初のテキストボックス「名」が識別されます。

2番目のテキストボックス「Surname」が識別されます。
Facebookにサインアップするために識別される両方のテキストボックスで、id属性の開始部分は変更されません。
名ID =“ u_0_2”
姓id = ’u_0_4”
これは、starts-with()属性を使用して、そのようなタイプのid属性の下にあるすべての要素を取得できるシナリオです。参考までに、これら2つのフィールドのみを使用していることに注意してください。ただし、「u_0_」で始まるIDを持つフィールドが画面上にさらに存在する可能性があります。
Starts-with()(属性ID別)
//input(starts-with(@id,”u_0_”))重要な注意点: ここでは、一重引用符の代わりに二重引用符を使用しています。ただし、一重引用符は、starts-withメソッドでも機能します。

11個の一致するノードは、このXPathが、これらのIDが「u_0_」で始まるすべての要素を識別したことを示しています。 IDの後半部分(名の場合は2、名前の場合は4など)によって、要素を一意に識別する方法が決まります。
リスト内の同様のタイプの要素を収集する必要がある場合は、starts-with関数属性を使用し、一般的なメソッドの引数をバイパスして要素の1つを動的に選択し、要素を一意に識別できます。
以下の例に従って、starts-with関数を活用してください。
サンプルコード:
/* Generic Method */ public void xpathLoc(String identifier){ //The below step identifies the element “First Name” uniquely when the argument is “2” WebElement E1=d1.findElement(By.xpath('//input(starts-with(@id,”u_0_”+identifier ))')); E1.sendKeys(“Test1”); /* This step enters the value of First Name as “Test 1” */ } /* Main Method */ public static void main(String() args) { xpathLoc(“2”); --- This step calls the xpathLoc() method to identify the first name. } 注意: Eclipseでは二重引用符の使用が許可されていない場合があります。動的XPathを作成するには、別のコードに頼らなければならない場合があります。
サンプルコードは参照用に提供されています。コードをより用途の広いものにするために、実行するすべての要素と操作、および入力する値(テキストフィールドの場合)に合うように拡張することができます。
結論
この記事では、XPath関数contains()、starts-with()、text()を属性とテキストとともに使用して、HTMLDOM構造上の要素を一意に識別する方法について説明しました。
以下は、XPath関数に対して描画できるいくつかの観察結果です。
- 部分定数の表示可能なテキストまたは属性がわかっている場合は、XPathの「contains()」メソッドを使用してください。
- 最初の部分定数の表示テキストまたは属性がわかっている場合は、XPathの「starts-with()」メソッドを使用してください。
- 絶対テキストまたは属性を指定してcontains()およびstarts-with()メソッドを使用することもできます。
- 絶対に表示されるテキストを知っている場合は、XPathの「text()」メソッドを使用してください。
- 部分的なテキストでtext()メソッドを使用することはできません。
- XPathで最初のテキストが使用されていない場合、または最初のテキストが絶えず変化している場合は、starts-with()メソッドを使用できません。
次のチュートリアルでは、XPath関数でXPath軸を使用して、使用可能なWebページ上の要素の場所をさらに拡張する方法を学習します。
=> EasySeleniumトレーニングシリーズをお読みください。
推奨読書
- Seleniumロケーター:SeleniumでXPathを使用してWeb要素を特定する(例)
- SeleniumスクリプトでのWebテーブル、フレーム、および動的要素の処理– Seleniumチュートリアル#18
- Python文字列関数
- JMeterのXpathExtractorポストプロセッサー
- Seleniumは例を含むテキストチュートリアルで要素を検索します
- Cucumber Seleniumチュートリアル:Cucumber Java SeleniumWebDriverの統合
- 包括的なXPathチュートリアル-XMLパス言語
- Selenium WebDriverの概要– Seleniumチュートリアル#8