У меня возникли проблемы с выбором элементов на некоторых страницах со старым HTML.
Если я введу jQuery в консоль javascript Chrome и сам выполню код, он вернет правильное значение. Однако, когда я пытаюсь сделать это в CasperJS, это не работает. Поэтому я сделал небольшой скрипт, чтобы проверить, что происходит:
(casper.start и casper.run опущены)
casper.then(function() {
this.echo("1: Entire Row");
this.echo(this.evaluate(function() {
return $("#table20 > tbody > tr:nth-child(3)").html();
}));
this.echo("2: More specific");
this.echo(this.evaluate(function() {
return $("#table20 > tbody > tr:nth-child(3) > td:nth-child(2)").html();
}));
this.echo("3: More specific");
this.echo(this.evaluate(function() {
return $("#table20 > tbody > tr:nth-child(3) > td:nth-child(2) > p").html();
}));
this.echo("4: Even more specific");
this.echo(this.evaluate(function() {
return $("#table20 > tbody > tr:nth-child(3) > td:nth-child(2) > p > font").html();
}));
this.echo("5: Using jQuery functions");
this.echo(this.evaluate(function() {
return $("#table20 > tbody > tr:nth-child(3)").children("td:nth-child(2)").children("p").children("font").html();
})); //Ugly workaround
});
И когда я запускаю его, это результат:
1: Entire Row
<td height="23" width="226" style="border-style: solid; border-width: 1px" bordercolor="#666666" colspan="2">
<p>
<img width="16px" height="16px" src="upload/imagens/bandeira_eua.gif">
<strong>Dólar americano (USD)</strong>
</p></td>
<td height="23" width="80" style="border-style: solid; border-width: 1px" bordercolor="#666666">
<p><font size="2">2,400</font>
</p></td>
<td height="23" width="81" style="border-style: solid; border-width: 1px" bordercolor="#666666">
<p><font size="2">2,600</font>
</p></td>
2: More specific //Correct so far...
<p><font size="2">2,400</font>
</p>
3: More specific //What? This is from another row!!
<font size="2">3,060</font>
4: Even more specific
null //What??
5: Using jQuery functions
2,400 //Correct result
Однако, если я захожу на веб-сайт с помощью Chrome и добавляю тот же jQuery в консоль, он работает, как и ожидалось:
$("#table20 > tbody > tr:nth-child(3) > td:nth-child(2) > p > font").html();
"2,400"
Что происходит??? Использование нативных методов CasperJS для получения значения тоже не работает.
ps: CasperJS версии 1.1.0-beta3 с PhantomJS версии 1.9.0
ps1: путь CSS был сгенерирован в Chrome Dev Tools, «Копировать путь CSS».
РЕДАКТИРОВАТЬ: Еще более странно: этот скрипт
casper.then(function() {
this.echo(this.evaluate(function() {
return $("#table20 > tbody > tr:nth-child(3) > td:nth-child(2) > p > font").html();
}));
this.echo(this.evaluate(function() {
return $("#table20 > tbody > tr:nth-child(3) > td:nth-child(2) > p > font").html();
}));
});
возвращает:
2,400
null
Стабильно работает только в первый раз, даже если разбить на 2 каспер.потом.
casper.wait(5000);
перед блокомthen
. Что происходит при обновлении до текущей версии PhantomJS 1.9.7. Какие нативные функции casperjs вы пробовалиcasper.getHTML
или, может быть,document.querySelector("...").innerHTML
в контексте страницы? Возможно, разметка страницы каким-то образом искажена, и PhantomJS делает ошибки при разборе/запросе. Вы можете попробовать сравнить версию CasperJS с версиямиgetHTML
и Chrome с исходным кодом. Вы даже можете проверить версию Casper через W3C. - person Artjom B.   schedule 27.09.2014