Xpath выдаёт не все результаты

Дано:

Есть страница, некоторые части которой заполняются html динамически с помощью ajax.


Проблема:

При попытке получить через XPath все кнопки на странице столкнулся с проблемой, что не находятся кнопки, пришедшие через ajax.



Пример:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }

// кнопка, пришедшая черех ajax
alert(document.getElementById('spareCardEditPageFormId:j_id323')); // находит

// пробуем поискать её через Xpath
var nodesSnapshot = document.evaluate('//input[@type="button"]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
for ( var i=0 ; i < nodesSnapshot.snapshotLength; i++ )
  console.log("value = " + nodesSnapshot.snapshotItem(i).value); // её здесь почему-то нет
 


Я что-то упустил?

1 ответов


Привет.

Сам ранее пользоваля активно XPath, когда тестировал с Selenium.

Поэтому когда встретил подобную задачу, долго в него упирался (в XPath то бишь), но не получалось и один хорoший человек посоветовал использовать jQuery.

Для твоего случая это будет выглядеть так:



<html>
  <head>
   <script type="text/javascript" src="jquery-1.2.6.js"></script>
  </head>

    <input type="button" value="one"/>
    <input type="button" value="two"/>
    <input type="button" value="three"/>
    <input type="button" value="four"/>

   <!-- неискомый инпут -->
      <input type="radio" value="five"/>

<script type="text/javascript">

var $j = jQuery.noConflict();
 $j(document).ready(function() {
 $j('input').each(function(i) {
var child=jQuery(this);
if (child.attr('type').match('button')){
alert('value:' + child.val());
}
 })});

</script>


</html>


 

пояснения:
1. на стр. 4 инпута
2. импортируешь либу jQuery
3. проходишь в цикле по инпутам
4. child - это i-й элемент цикла, ты можешь узнать его св-ва (в данном случае выводятся значения инпутов)

Пример иллюстрирует выполнение скрипта на событие onLoad().

Как говорится, сугубо имхо, мне понравилось использовать либу. Просто и кроссбраузерно.

Вот:


<input type="button" class="icon_close grey_btn TJSOnclickCleanupDeferred toyotaTabIndexed" id="spareCardEditPageFormId:j_id323" name="spareCardEditPageFormId:j_id323" onclick="A4J.AJAX.Submit('modalPanelGroup0Region','spareCardEditPageFormId',event,{'similarityGroupingId':'spareCardEditPageFormId:j_id323','parameters':{'spareCardEditPageFormId:j_id323':'spareCardEditPageFormId:j_id323'} ,'actionUrl':'/main\x2Dweb/pages/layout.jsf'} );return false;" value="Отмена" tabindex="1"/>