問題: DOM には<tbody/>
タグが必要
Firebug、Chrome の開発者ツール、JavaScript の XPath 関数などは、基本的なHTML ソース コードではなく、 DOM上で動作します。
<thead/>
HTML 用の DOM では、フッターのテーブル ヘッダー ( , ) に含まれていないすべてのテーブル行が<tfoot/>
、テーブル ボディ タグに含まれている必要があります<tbody/>
。したがって、(X)HTML の解析中にこのタグが見つからない場合、ブラウザーはこのタグを追加します。たとえば、Microsoft の DOM ドキュメントには次のように書かれています
テーブルで要素が明示的に定義されていない場合でも、tbody
要素はすべてのテーブルで公開されますtbody
。
stackoverflow の別の回答に詳細な説明があります。
一方、HTML では必ずしもそのタグを使用する必要はありません。
TBODY
テーブルにテーブル本体が 1 つだけ含まれていて、テーブルのヘッドまたはフッター セクションがない場合を除き、開始タグは常に必要です。
ほとんどの XPath プロセッサは生の XML で動作します
JavaScript を除いて、ほとんどの XPath プロセッサは DOM ではなく生の XML で動作するため、<tbody/>
タグを追加しません。また、 tag-soupやhtmltidyなどの HTML パーサー ライブラリは、「DOM-HTML」ではなく、XHTML のみを出力します。
これは、PHP、Ruby、Python、Java、C#、Google ドキュメント (スプレッドシート) などの Stackoverflow に投稿される一般的な問題です。Selenium はブラウザー内で実行され、DOM で動作します。つまり、影響を受けません。
問題の再現
Firebug (または Chrome の開発ツール) によって表示されるソースを、右クリックして [ページ ソースを表示] を選択する (またはブラウザーで呼び出されるもの) かcurl http://your.example.org
、コマンド ラインで使用することによって得られるソースと比較します。後者はおそらく要素を含まず<tbody/>
(めったに使用されません)、Firebug は常にそれらを表示します。
/tbody
解決策 1:軸ステップを削除する
立ち往生しているテーブルに本当に要素が含まれていないかどうかを確認してください<tbody/>
(最後の段落を参照)。もしそうなら、おそらく別の種類の問題があります。
軸ステップを削除する/tbody
と、クエリは次のようになります
//table[@id="example"]/tr[2]/td[1]
<tbody/>
解決策 2:タグをスキップする
これはかなり汚い解決策であり、ネストされたテーブルでは失敗する可能性があります (内部テーブルにジャンプする可能性があります)。非常にまれなケースでのみこれをお勧めします。
/tbody
軸ステップを子孫または自己ステップに置き換えます。
//table[@id="example"]//tr[2]/td[1]
<tbody/>
解決策 3: タグ付きとタグなしの両方の入力を許可する
テーブルまたはクエリを「HTML ソース」と DOM コンテキストの両方で使用するかどうかが事前にわからない場合。ソリューション 2 のハックを使用したくない/使用できない、代替クエリを提供する (XPath 1.0 の場合)、または「オプションの」軸ステップ (XPath 2.0 以降) を使用する。
- XPath 1.0 :
//table[@id="example"]/tr[2]/td[1] | //table[@id="example"]/tbody/tr[2]/td[1]
- XPath 2.0 :
//table[@id="example"]/(tbody, .)/tr[2]/td[1]