htmlにも対応しているので
ウェブサイトの要素(見出し、画像、リンクなど)を表すことができる。
・簡単なhtmlの構造について
htmlは <タグ名></タグ名> で囲まれた様々なタグの入れ子構造になっている。下記が基本構造(<!doctype html>は決まり文句)。
<!doctype html> <html> <head> ... </head> <body> ... </body> </html><body></body> の中に記載されたものがブラウザで表示される部分。
要素を追加する。
<!doctype html> <html> <head> ... </head> <body> <div> </div> <div> <div> <p> </p> </div> <div> </div> </div> <h1> </h1> <a> </a> </body> </html>body の中にdivを2つ、h1、aを1つ 追加。
さらに 2つ目のdiv の中に divを2つ 追加。
さらに 1つ目のdiv の中に pを1つ 追加。
これをもとにXPathの表記を見てみる。
・XPathの絶対パス表記
XPathは / で区切りながらタグ名を記載していく。・ h1 の絶対パス表記
/html/body/h1
・ a の絶対パス表記
/html/body/a
同じ段落に同じタグ名がある場合は [ ] に番号を書いて指定する。
番号は上から1始まり。
・ p の絶対パス表記
/html/body/div[2]/div[1]/p
・XPathの相対パス表記
// を使って間のタグを省略できる。ワイルドカードのような使い方。
・ h1 の相対パス表記
//h1
・ p の相対パス表記
//p
今回の例のhtmlにはdivが複数あるため、相対パスで1つを特定できない。
//div (この場合4つのdivが該当)
・タグの属性を使った表記
htmlのタグには class や id などの属性が指定されている場合がある。その属性をもとにXPathを表記できる。
htmlの例を変更する。
<!doctype html> <html> <head> ... </head> <body> <div class="sample1"> <div id="index1"> </div> <div id="index2"> </div> </div> <div class="sample2"> <h1 id="index3"> </h1> <h1 id="index4"> </h1> </div> </body> </html>
属性を指定するときは タグ名[@属性名=""] で指定する。
・classがsample1のdiv
//div[@class="sample1"]
・idがindex3のh1
//h1[@id="index3"]
* をワイルドカードとしてタグ名を指定できる。
・classがsample2のタグ
//*[@class="sample2"]
contains を使って属性の値の一部だけでの指定もできる。
・idにindexを含むh1
//h1[contains(@id,"index")] (この場合<h1 id="index3">と<h1 id="index4">が該当)
・タグ内のテキストを使った表記
タグの中に記載されているテキストを指定できる。htmlの例を変更する。
<!doctype html> <html> <head> ... </head> <body> <div id="野菜"> <ul> <li>人参</li> <li>ジャガイモ</li> <li>大根</li> <li>白菜</li> </ul> </div> <div id="果物"> <ul> <li>リンゴ</li> <li>ブドウ</li> <li>梨</li> <li>いちご</li> </ul> </div> </body> </html>
属性を指定したときの@属性名の代わりに text() と記載。
・テキストがジャガイモのli
//li[text()="ジャガイモ"]
・テキストが梨のタグ
//*[text()="梨"]
contains も同様に使える。
・テキストに根が含まれるタグ
//*[contains(text(),"根")]
・特定のタグからの相対表記
あるタグを基準にして1つ上の階層のタグ、同じ階層の1つ下のタグなど、相対的な表記もできる。
一つ上の階層のタグ場合は parent を使い /parent::タグ名 のように表記。
・テキストがジャガイモのliの1つ上のタグ
//li[text()="ジャガイモ"]/parent::* (この場合<div id="野菜">の中の<ul>が該当)
・テキストが梨のタグと同じ階層の1つ上のli
//*[text()="梨"]/preceding-sibling::li (この場合<li>ブドウ</li>が該当)
相対表記(一部)
parent - 1つ上の階層
child - 1つ下の階層
preceding-sibling - 同じ階層の1つ上
following-sibling - 同じ階層の1つ下
preceding - 同じ階層の上にある全て
following - 同じ階層の下にある全て
0 件のコメント:
コメントを投稿