JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

XPathでn番目の子要素を特定する方法|インデックス指定とposition()関数の実践例

Seleniumによる自動テストでは、同じタグや属性を持つ要素がページ内に複数存在するケースはよくあります。テーブルの特定の行、リストの特定の項目、同種の入力欄のうち何番目か——そうした場面で必要になるのが、XPathで「n番目の子要素」を正確に指定するテクニックです。

XPathでn番目の子要素を識別するには、主に次の2つの方法があります。

  • 角括弧 [] の中にインデックス番号を記述する
  • 組み込み関数 position() を使用する

方法1:角括弧 [] にインデックスを指定する

XPathでは、ロケータの末尾に [番号] を付けることで、その位置の要素を取得できます。インデックスは1から始まる点に注意してください。多くのプログラミング言語のような0始まりではないため、混同しやすいポイントです。

例えば、テーブルの2行目にあるセルをすべて取得したい場合は、次のように書きます。

//table/tbody/tr[2]/td

このXPathをSelenium(Java)で使用した実際のコード例がこちらです。

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class RowCount {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "https://www.tutorialspoint.com/plsql/plsql_basic_syntax.htm";
        driver.get(url);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // インデックス[2]を指定して、テーブルの2行目のデータを取得
        List<WebElement> rows =
        driver.findElements(By.xpath("//table/tbody/tr[2]/td"));
        System.out.println("2行目のデータ数は " + rows.size());
        driver.close();
    }
}

実行すると、コンソールに2行目に含まれるセルの個数が出力されます。

方法2:position() 関数を使用する

XPathの組み込み関数である position() を使うと、述語の中で位置を明示的に指定できます。書式は [position()=n] です。角括弧への直接指定と結果は変わりませんが、コードの意図がより明確になるという利点があります。

次の例では、「type属性がtextであるinput要素のうち1番目」をクリックしています。

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;

public class SubElement {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "https://www.tutorialspoint.com/index.htm";
        driver.get(url);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // position()を使って、type=textの最初のinput要素をクリック
        driver.findElement(By.xpath("//input[@type='text'][position()=1]"))
        .click();
        driver.close();
    }
}

補足:ドキュメント全体でn番目を指定する場合

//input[@type='text'][1] のような書き方は、親要素ごとに最初の一致を返すことがあります。ページ全体を通して1番目の一致要素を取得したい場合は、次のように括弧で囲みましょう。

(//input[@type='text'])[1]

この違いを理解しておくと、意図しない要素が選択されるトラブルを防げます。

補足:last() 関数との組み合わせ

position() は last() と組み合わせるとさらに便利になります。[last()] で最後の要素を、[last()-1] で最後から2番目の要素を取得できます。要素数が動的に変わるページでも安定したテストを書くのに役立ちます。

まとめ

  • n番目の要素の指定は、[n](インデックス指定)または [position()=n](position()関数)のいずれでも可能
  • XPathのインデックスは1始まり
  • ページ全体でn番目を指定する場合は (ロケータ)[n] と括弧で囲む
  • last() との組み合わせで、末尾からの相対指定も可能

これらのテクニックを使い分けることで、動的なWebページに対しても堅牢なロケータを作成できます。

  1. JavaScriptで親要素の子要素を取得する方法【サンプルコード付き】

    JavaScriptでは、親要素が持つchildrenプロパティを参照することで、その直下にある子要素をまとめて取得できます。本記事では、実際に動作するサンプルコードを使いながら、具体的な手順をわかりやすく解説します。 サンプルコード 以下は、JavaScriptを使って親要素(parent1)の子要素を取得し、ボタンのクリックで一括表示させる例です。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta nam

  2. C++のSTLを使って配列の最大要素を見つける方法

    この記事では、C++のSTL(標準テンプレートライブラリ)を使用して、配列の中から最大要素を見つける方法を解説します。例えば、配列が [12, 45, 74, 32, 66, 96, 21, 32, 27] の場合、最大要素は 96 となります。C++では、<algorithm> ヘッダーに用意されている max_element() 関数を使うことで、自分でループを書かずに最大要素を簡単に取得できます。この関数は、指定した範囲内の最大要素を指すイテレータを返すため、間接参照演算子(*)を使って実際の値を取り出します。サンプルコード#include<iostream> #