Селектор CasperJS/SpookyJS css существует и не существует
У меня странная проблема во время очистки экрана с spookyjs / capserjs.
Я хочу получить информацию со следующего веб-сайта: " https://www.rwe-smarthome.de/is-bin/INTERSHOP.enfinity/WFS/RWEEffizienz-SmartHome-Site/de_DE/-/EUR/ViewApplication-DisplayWelcomePage".
Поскольку сайт содержит более одной страницы продуктов, я хочу открыть и другие сайты.
Обычно можно использовать
this.click(selector, function() {});
для достижения этой цели.
По некоторым странным причинам это не работает здесь.
Пожалуйста, посмотрите на следующий код:
var selector1 = "div#workingTemplate div:first-of-type ul.linkList li:nth-child(2) a";
spooky.waitUntilVisible(selector1);
spooky.thenClick(selector1);
spooky.wait(500);
spooky.then(function() {
this.capture("RWETest-02.jpg");
});
Я получаю ошибку
CasperError: Cannot dispatch mousedown event on nonexistent selector: div#workingTemplate div:first-of-type ul.linkList li:nth-child(2) a
Что странно, потому что если объект селектора / DOM не существует, он должен потерпеть неудачу в waitUntilVisible()
,
Также, когда я пытаюсь проверить, существует ли селектор, ответ, кажется, да, потому что я также получаю ошибку с несуществующим селектором:
Код:
spooky.then([{sel: selector1},function() {
if(this.exists(sel)) {
this.click(sel);
this.wait(500);
this.then(function() {
this.capture("RWETest-02.jpg");
});
}
else {
this.emit("logMessage", "Selector does not exists...");
}
}]);
Ошибка:
CasperError: Cannot dispatch mousedown event on nonexistent selector: div#workingTemplate div:first-of-type ul.linkList li:nth-child(2) a
Из-за SpookyJS я использую PhantomJS 1.9.7 и CasperJS 1.1.0-beta3.
У кого-нибудь есть идеи по этому поводу?
1 ответ
Скорее всего, это связано с ошибкой в PhantomJS 1.x, которая некорректно находит элементы, основанные на селекторах CSS, которые используют :nth-child()
, Смотрите этот вопрос для получения дополнительной информации.
Поскольку CasperJS поддерживает выражения XPath почти для всех своих функций, вы можете перевести селектор CSS в выражение XPath:
var xpathExpr1 = "//div[@id='workingTemplate']//div[1]//ul[contains(@class,'linkList')]//li[2]//a";
Затем вы можете использовать его так:
var selectXPath = 'xPath = function(expression) {
return {
type: "xpath",
path: expression,
toString: function() {
return this.type + " selector: " + this.path;
}
};
};'
...
spooky.then([{x: selectXPath}, function() {
eval(x);
this.waitUntilVisible(xPath(xpathExpr1));
this.thenClick(xPath(xpathExpr1));
...
]);
Проблема в том, что SpookyJS не предоставляет утилиту XPath, поэтому вам нужно сделать небольшой обходной путь, который описан в GitHub isse # 109.