Селектор 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.

Другие вопросы по тегам