2016-06-22 21 views
0

目標:テーブルインデックス、列ヘッダー、行番号を指定して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>

答えて

0

var result = document.evaluate('(//table)[count((//table)[5]/descendant::th)]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 
 
if (result != null) { 
 
    var pre = document.createElement('pre'); 
 
    pre.textContent = 'Found ' + result.outerHTML; 
 
    document.body.appendChild(pre); 
 
} 
 
else { 
 
    document.body.insertAdjacentHTML('beforeEnd', '<p>No node found.<\/p>'); 
 
}
table { border: 1px solid black; }
<table id="t1"> 
 
    <tbody> 
 
    <tr> 
 
     <td>table 1</td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 

 
<table id="t2"> 
 
    <tbody> 
 
    <tr> 
 
     <td>table 2</td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 

 
<table id="t3"> 
 
    <tbody> 
 
    <tr> 
 
     <td>table 3</td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 

 
<table id="t4"> 
 
    <tbody> 
 
    <tr> 
 
     <td>table 4</td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 

 
<table id="t5"> 
 
    <thead> 
 
    <tr> 
 
     <th>table 5 header </th> 
 
    </tr> 
 
    </thead> 
 
    <tbody> 
 
    <tr> 
 
     <td>table 5</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

私は最初のテーブルがあり、Firefoxの、エッジやChromeで同じ結果を得ます5番目に選択されているのは1つですth要素。質問を編集してコードスニペットを挿入して、問題を再現できるようにしてください。

+0

さて、私はしばらくして質問をしましたが、テンプレートに続いてスニペットを追加しました。クロムとFirefoxで実行すると、私が参照していた結果が表示されます。 –

+0

私がChromeの結果を 'var resultTable = document.evaluate(" table // [table] [count]/descendant :: th)-3] "で確認していれば、document 、null、XPathResult.ANY_TYPE、null); 'は明らかなバグですので、報告することをお勧めします。私はすべての詳細をチェックしていませんが、EdgeとFirefoxの両方がセルを見つけるので、2番目のバグもバグのようです。もう一度Googleに報告する何か。 –

+0

私はクロムアプリを通じて報告しましたが、ブラウザのすべてで動作する別の回避策があるのか​​どうか疑問に思っていました。 –

関連する問題