2014-10-08 2 views
0

Все, что я хочу сделать, это вернуть строку из xpath, которую я определил, но у меня возникли проблемы с использованием функции getElementsByXPath в CasperJS.Элементы печати из XPath имеют более чем элементы

var casper = require('casper').create({ 
verbose: false, 
logLevel: 'debug' 
}); 
casper.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)  Chrome/28.0.1500.72 Safari/537.36"); 
casper.start(); 
casper.thenOpen('http://www.uky.edu', function(){ 
    content = casper.evaluate(function() { 
     return __utils__.getElementsByXPath('//div[@id=\'container\']/section[@id=\'content\']/aside[@class=\'socialTab clearfix\']/div[@id=\'usual2\']/div[@id=\'tabs1\']/figure[@class=\'youTube\']/h4/a'); 
    }); 
}); 

casper.run(function() { 
    this.echo(JSON.stringify(content)); 
    this.echo('completed').exit(); 
}); 

Не прекращает возвращать данные. И это определенно не возвращает ту определенную строку, которую я ищу, похоже, что она возвращает данные для всей веб-страницы.

Я в конечном итоге попробовать это с практически пустой веб-страницы с помощью только одного DIV и получил тот же вопрос я использовал // DIV для XPath и получил следующий

[{"align":"","attributes":{"length":0},"baseURI":"http://download2012.ad.uky.edu/caspertest.php","childElementCount":0,"childNodes":{"0":null,"length":1},"child 
ren":{"length":0},"classList":{"length":0},"className":"","clientHeight":20,"cli 
entLeft":0,"clientTop":0,"clientWidth":384,"contentEditable":"inherit","dataset" 
:{},"dir":"","draggable":false,"firstChild":null,"firstElementChild":"","hidden" 
:false,"id":"","innerHTML":"Test2","innerText":"Test2","isContentEditable":false 
,"lang":"","lastChild":{"attributes":"","baseURI":"http://download2012.ad.uky.ed 
u/caspertest.php","childNodes":{"length":0},"data":"Test2","firstChild":"","last 
Child":"","length":5,"localName":"","namespaceURI":"","nextSibling":"","nodeName 
":"#text","nodeType":3,"nodeValue":"Test2","ownerDocument":null,"parentElement": 
null,"parentNode":null,"prefix":"","previousSibling":"","textContent":"Test2","w 
holeText":"Test2"},"lastElementChild":"","localName":"div","namespaceURI":"http: 
//www.w3.org/1999/xhtml","nextElementSibling":"","nextSibling":null,"nodeName":" 
DIV","nodeType":1,"nodeValue":"","offsetHeight":20,"offsetLeft":8,"offsetParent" 
:{"aLink":"","attributes":{"length":0},"background":"","baseURI":"http://downloa 
d2012.ad.uky.edu/caspertest.php","bgColor":"","childElementCount":1,"childNodes" 
:{"0":null,"1":null,"2":null,"length":3},"children":{"0":null,"length":1},"class 
List":{"length":0},"className":"","clientHeight":300,"clientLeft":0,"clientTop": 
0,"clientWidth":400,"contentEditable":"inherit","dataset":{},"dir":"","draggable 
":false,"firstChild":{"attributes":"","baseURI":"http://download2012.ad.uky.edu/ 
caspertest.php","childNodes":{"length":0},"data":"Test\n","firstChild":"","lastC 
hild":"","length":5,"localName":"","namespaceURI":"","nextSibling":null,"nodeNam 
e": 

И так далее.

+1

Относительное примечание: выражение XPath довольно жесткое. Почему бы не использовать '// div [@ id = 'tabs1']/figure [@ class = 'youTube']/h4/a'? –

+0

Я добавил более полный пример. Я также изменил его, чтобы он был менее жестким. У него не было причин быть таким жестким. Я все еще изучаю работу XPaths. – Matt

ответ

1

Вы не можете вернуть элементы DOM из контекста страницы в CasperJS. Если используется document.querySelectorAll вместо __utils__.getElementsByXPath (с настроенным селектором CSS), результатом будет массив значений undefined. Это не относится к __utils__.getElementsByXPath. Возвращаются моментальные снимки элементов DOM, которые на самом деле частично сериализуемы. Проблема в том, что они содержат круглые ссылки на документ и будут расти непрерывно.

Из docs:

Примечание: Аргументы и возвращаемое значение функции оценки должна быть простой примитивный объект. Эмпирическое правило: если оно может быть сериализовано через JSON, тогда это нормально.

Закрытие, функции, узлы DOM и т. Д. Не сработают!

Вам необходимо сделать все, что вы хотите сделать в контексте страницы. Например, элемент как строка:

content = casper.evaluate(function() { 
    return __utils__.getElementByXPath(someSelector).outerHTML; 
}); 
+0

Он возвращает нуль по какой-то причине – Matt

+1

Обратите внимание на недостаток '' 'в' getElementByXPath'. Если вы используете 'getElementsByXPath', вам нужно сопоставить элементы или перебрать их. –

+0

Вот и все. Спасибо огромное! – Matt

Смежные вопросы