目標:テーブルインデックス、列ヘッダー、行番号を指定してn番目のテーブルからセルを選択しようとしています。私はFirefoxで動作しますが、Chromeでは動作しません。ChromeとFirefox間のXpath評価の相違点
Firefoxで同じxpathが動作していますが、Chromeでの評価に失敗しています。
xpathは、列ヘッダーを使用してテーブル内のセルを選択しようとしています。
Firefoxでの作業ではなく
(//table)[count((//table)[5]/descendant::th)]
Firefoxのクロム、表5の列数に応じたテーブルを返しますが、Chromeは何も返しません。
((//table)[2]/tbody/tr[1]/td)[count((//table)[2]/descendant::th[.='TextField']/preceding-sibling::th)+1]
Firefoxは 'TextField'列の最初の行にあるセルを返します。何も返されません。
私が扱っているhtmlは、以下に示すように、divスープのビットです。 ChromeとFirefoxのスニペットを実行してみると、結果は異なります(スニペットを実行してスクロールすると見つかります)。 (//table)[count((//table)[5]/descendant::th)]
で問題を再現しようとすると
// Print title
document.body.insertAdjacentHTML('beforeEnd', '<h2>Table Query Results<\/h2>');
// Evaluate the xpath
var resultTable = document.evaluate("(//table)[count((//table)[2]/descendant::th)-3]", document, null, XPathResult.ANY_TYPE, null);
var resultTableVal = null;
// If the xpath returned a result, grab the first result
if (resultTable != null) resultTableVal = resultTable.iterateNext();
// If both the xpath result and first result have values
if (resultTable != null && resultTableVal != null) {
// Create a pre tag
var preTable = document.createElement('pre');
// While there are results
while (resultTableVal) {
// Add them to pre
preTable.textContent += 'Found ' + resultTableVal.outerHTML + '\n';
resultTableVal = resultTable.iterateNext();
}
document.body.appendChild(preTable);
}
else {
document.body.insertAdjacentHTML('beforeEnd', '<p>No node found.<\/p>');
}
document.body.insertAdjacentHTML('beforeEnd', '<h2>Cell Query Results<\/h2>');
var resultCell = document.evaluate("((//table)[2]/tbody/tr[1]/td)[count((//table)[2]/descendant::th[.='TextField']/preceding-sibling::th)+1]", document, null, XPathResult.ANY_TYPE, null);
var resultCellVal = null;
if (resultCell != null) resultCellVal = resultCell.iterateNext();
if (resultCell != null && resultCellVal != null) {
var preCell = document.createElement('pre');
while (resultCellVal) {
preCell.textContent += 'Found ' + resultCellVal.outerHTML + '\n';
resultCellVal = resultCell.iterateNext();
}
document.body.appendChild(preCell);
}
else {
document.body.insertAdjacentHTML('beforeEnd', '<p>No node found.<\/p>');
}
table { border: 1px solid black; }
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<div>
<h3>Grids</h3>
<div></div>
<div></div>
</div>
<div></div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<span>EditableGrid</span><em>*</em>
</div>
<div>
<p></p>
</div>
<div>
<div>
<table>
<colgroup>
<col>
<col>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th>
<div>
<h2>TextField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>ParagraphField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>EncryptedTextField</h2><a><i></i</a>
</div>
</th>
<th>
<div>
<h2>IntegerField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>DecimalField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>DateField</h2><a><i></i></a>
</div>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div>
<div>
<div>
<span><em>*</em>
<label>Label</label></span>
<div>
<div>
Text Input
</div>
</div>
<div>
<p></p>
</div>
<div></div>
<div></div>
</div>
</div>
</div>
</td>
<td>
<div>
<div>
<div>
<span><em>*</em>
<label>Label</label></span>
<div>
<div>
Paragraph input
</div>
</div>
<div>
<p></p>
</div>
<div></div>
<div></div>
</div>
</div>
</div>
</td>
<td>
<div>
<div>
<div>
<span><em>*</em>
<label>Label</label></span>
<div>
<div>
Encrypted Text input
</div>
</div>
<div>
<p></p>
</div>
<div></div>
<div></div>
</div>
</div>
</div>
</td>
<td>
<div>
<div>
<div>
<span><em>*</em>
<label>Label</label></span>
<div>
<div>
Integer Input
</div>
</div>
<div>
<p></p>
</div>
<div></div>
<div></div>
</div>
</div>
</div>
</td>
<td>
<div>
<div>
<div>
<span><em>*</em>
<label>Label</label></span>
<div>
<div>
Decimal input
</div>
</div>
<div>
<p></p>
</div>
<div></div>
<div></div>
</div>
</div>
</div>
</td>
<td>
<div>
<div>
<div>
<span><em>*</em>
<label>Label</label></span>
<div>
<div>
<div>
Date input
</div>
</div>
</div>
<div>
<p></p>
</div>
<div></div>
<div></div>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div></div>
</div>
</div>
</div>
<div>
<div>
<div>
<div>
<span>ReadOnlyGrid</span><em>*</em>
</div>
<div>
<p></p>
</div>
<div>
<div>
<table>
<colgroup>
<col>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th>
<div>
<h2>TextField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>ParagraphField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>EncryptedTextField</h2><a><i></i>/a>
</div>
</th>
<th>
<div>
<h2>IntegerField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>DecimalField</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>DateField</h2><a><i></i></a>
</div>
</th>
</tr>
</thead>
<tfoot></tfoot>
<tbody>
<tr>
<td>Column1</td>
<td>Column2</td>
<td>Column3</td>
<td>Column4</td>
<td>Column5</td>
<td>Column6</td>
</tr>
</tbody>
</table>
</div>
</div>
<div></div>
</div>
</div>
</div>
<div>
<div>
<div>
<span>EditableGrid</span><em>*</em>
</div>
<div>
<p></p>
</div>
<div>
<div>
<table>
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th>
<div>
<h2>PickerField1</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>PickerField2</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>PickerField3</h2><a><i></i></a>
</div>
</th>
<th>
<div>
<h2>PickerField4</h2><a><i></i></a>
</div>
</th>
</tr>
</thead>
<tfoot></tfoot>
<tbody>
<tr>
<td>Userpick data</td>
<td>Grouppicker data</td>
<td>User group picker data</td>
<td>Document picker</td>
</tr>
<tr>
<td>Folder Picker</td>
<td>Document folder picker</td>
<td>Custom picker</td>
<td><span>*</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
さて、私はしばらくして質問をしましたが、テンプレートに続いてスニペットを追加しました。クロムとFirefoxで実行すると、私が参照していた結果が表示されます。 –
私がChromeの結果を 'var resultTable = document.evaluate(" table // [table] [count]/descendant :: th)-3] "で確認していれば、document 、null、XPathResult.ANY_TYPE、null); 'は明らかなバグですので、報告することをお勧めします。私はすべての詳細をチェックしていませんが、EdgeとFirefoxの両方がセルを見つけるので、2番目のバグもバグのようです。もう一度Googleに報告する何か。 –
私はクロムアプリを通じて報告しましたが、ブラウザのすべてで動作する別の回避策があるのかどうか疑問に思っていました。 –