AeyeScanのリモートブラウザの操作編集機能を活用するために必須なXPathの基本知識

## はじめに
こんにちは、株式会社エーアイセキュリティラボ開発部の大桶です。

AeyeScanではリモートブラウザ機能により、ブラウザを手動で操作した内容を記録して、その部分のみを巡回・スキャンすることができます。さらに、[10/14のリリースで、リモートブラウザの操作編集機能を追加しました。](https://www.aeyescan.jp/news/20231014)この機能を活用すれば、通常のリモートブラウザでは操作内容の記録が上手くいかないサイトでも手動で巡回できることがあります。
AeyeScanのリモートブラウザの操作時には、サイトの「どのタグに」「どのような操作を行なったか」が記録されます。この時、「どのタグに」という情報は、XPathという言語で記述されています。そのため、リモートブラウザの操作を手動で編集・追加するには、XPathを使用して操作の対象となるタグを指定する必要があります。

この記事では、リモートブラウザの操作編集機能を活用するために必要なXPathの基本的な知識や、実際にXPathを取得する方法について解説していきます。

## XPathとは
XPathとは、XML Path Languageの略称であり、XML文書中の要素や属性を指定するための言語です。Webページの記述に広く使われるHTMLもXMLの一種と見なすことができるため、HTML文書中の要素(=タグ)もXPathにより指定することができます。

## XPathの文法
### サンプルHTML
[ブラウザからHTMLの特定のタグのXPathをコピーすることは簡単に実行できますが](#xpathの取得方法)、正しく取得できたかを理解するためにはXPathの文法についてある程度の知識が必要となります。
そのため、まずこの章ではXPathの文法について述べます。例として、以下のようなHTMLを使用します。以降、これをサンプルHTMLと呼びます。
```
<html>
  <body>
    <header>
      <span> ヘッダー </span>
    </header>
    <div id="container1">
      <a href="1.html"> リンク1 </a>
    </div>
    <div id="container2">
      <a href="2.html"> リンク2 </a>
    </div>
    <div id="container3">
      <a href="3.html"> リンク3 </a>
    </div>
  </body>
</html>

```
サンプルHTMLのツリー構造は下の図のようになります。
![xpath_sample1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/daf48d04-e5a8-2870-b511-6441a6a93c50.png)

### 基本的な文法
ある要素を指定するXPathは、一番上の要素からその要素までツリー構造を辿っていった時に、通過する要素名を`/`で繋いだものとして表されます。例えば、サンプルHTML内でspanタグ(赤く塗りつぶされたもの)を指定するXPathは`/html/body/header/span`となります。
![xpath_sample2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/48b08f57-6b5d-bd92-7e2e-f8527a2361e4.png)

### 同じ名前の要素が複数存在する時
HTMLでは多くの場合、同じ階層内に同じ名前を持つ要素が複数存在します。サンプルHTMLではbodyの下にある3つのdivタグ(赤く塗りつぶされたもの)がこれに該当します。
このような場合、前節で述べた記法に加えて、`[1]`、`[2]`というように`[]`つきで番号を添えることでこれらを区別します。
![xpath_sample3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/8cb77b63-ceb6-a56b-8a99-2cebdcacbd4d.png)

### ID指定によるパスの省略
前節まではツリー構造のルートである`html`タグから要素を辿っていくことでXPathを記述していましたが、IDを持つ要素については、IDを記述して直接指定することができます。

例として、サンプルHTMLの中のIDが`”container1”`であるタグ(下の図で赤く塗つぶされたもの)を指定するXPathは`//*[@id="container1"]`となります。この例ではタグ名にワイルドカードを表す`*`を使用していますが、`//div[@id="container1"]`と書くこともできます。サンプルHTMLではこの二つはどちらも同じタグを指定します。

この方法で記述したXPathに更に`/`と要素名を繋げて、下の階層の要素を指定することもできます。例として、サンプルHTMLの中のIDが`”container1”`であるdivタグの子であるaタグ(下の図で青く塗りつぶされたもの)を指定するXPathは`//*[@id="container1"]/a`となります。
![xpath_sample4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/0993a352-7cec-02c0-8314-7a6c8667ef9a.png)

## XPathの取得方法
### 手順
以下はChromeでXPathを取得する方法です。
1. XPathを取得したいタグを右クリックします。
2. メニューから「検証」をクリックします。
![スクリーンショット 2023-11-01 16.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/ee6e186b-bec6-9cf6-77c4-58283a3e8216.png)

これにより、下の画像のように開発者ツール(画面右側のパネル)が開きます。
この時、自動的に右クリックしたタグにフォーカスがあっている(水色にハイライトされている)状態になります。
![スクリーンショット 2023-11-01 18.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/80e166dc-62da-50c9-24cc-4e5148114969.png)
3. 開発者ツールでフォーカスが合っているタグを右クリックします。
4. メニューの「Copy」にカーソルを合わせます。
5. 展開したメニューから「Copy XPath」をクリックします。

以上の手順で、XPathをクリップボードにコピーすることができます。

### リンクのXPathを取得する
「手順」で述べた通り、ブラウザ中のタグを右クリックして開発者ツールを開くと、基本的にクリックしたタグにフォーカスがあった状態で開発者ツールが開きます。

しかし、クリック位置やHTMLの構造により、実際にクリックしたいタグとフォーカスされるタグがずれることがあります。例として、aタグの下にspanタグやhタグで文字を記述している場合など、見た目上は複数のタグが重なっている時にこの状態になりやすいです。
サイトによっては、上記の例のような見た目では重なっているタグでも、その中の特定のものをクリックしないとリモートブラウザの操作の再現がうまくいかない場合があります。

このような場合は、開発者ツール内で他のタグをクリックすることでフォーカスをそのタグに移動させることができます。
![スクリーンショット 2023-11-10 14.02.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/c6e5a94c-c73d-5a5d-df8a-d4ef81b12d29.png)

### IDが可変なタグのXPathを取得する
「手順」の節で述べた方法を実行すると、IDでパスが省略できる場合は省略されたパスが取得されます。しかし、サイトによってはIDがアクセスする度に変わることがあります。そのようなサイトでは、XPathを取得した時とAeyeScanが実際にサイトを巡回する時でIDが変わってしまい、正常に巡回できないことがあります。
この場合、「XPathの取得方法」の手順6で選択した「Copy XPath」の代わりに「Copy full XPath」を選択することで、IDで省略せずルート要素から辿ったXPathが取得できます。
![スクリーンショット 2023-11-10 13.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/73eeaed1-edc0-1c4a-ddd0-ddc27f1b76a7.png)

## おわりに
この記事では、XPathの基本的な文法や、XPathを取得する方法について解説しました。AeyeScanのリモートブラウザの操作編集機能を活用するうえでお役に立てましたら幸いです。
また、リモートブラウザの操作編集機能の使い方について、[AeyeScanの公式ヘルプページ](https://help.aeyescan.com/ja-JP/support/solutions/articles/67000724509)も合わせてご参照ください。