waitForSelector проходит, но assertExists не удается для того же селектора

Когда я вызываю следующую функцию, waitForSelector проходит за "селектор", но assertExists не удается для того же селектора. Как это возможно?

casper.waitForSelector(selector, function() {
    casper.test.assertExists(selector, sectionName + " opened up successfully.");
}, function() {
    casper.test.fail(sectionName + " did not load in given time");
}, max_timeout);

Вот полный пример, чтобы воспроизвести проблему с :nth-child селектор.

1 ответ

Решение

Это известная ошибка (см. # 11632, # 11737) в развилке Qt4 WebKit (с 2010 года). Бывает когда :nth-child() или же :nth-of-type() CSS3 селекторы используются. При втором запуске селектора он возвращает другой результат (большую часть времени null). Единственный известный обходной путь - использовать выражения XPath вместо селекторов CSS3. Эта ошибка исправлена ​​в PhantomJS 2, так как он использует Qt5-форк WebKit (версия 538.1).

Это минимальный сценарий для воспроизведения проблемы на http://example.com/ (изменен здесь):

var casper = require('casper').create(),
    x = require('casper').selectXPath;

casper.start('http://example.com', function() {
    var selector = 'p:nth-child(3) > a',
        xpSelector = '//*[local-name()="p" and position()=3]/a';
    var first = this.exists(selector);
    var second = this.exists(selector);
    if(first !== second) {
        console.error('Expected First selector to equal the Second');
    } else {
        console.log('Passed');
    }
    first = this.exists(x(xpSelector));
    second = this.exists(x(xpSelector));
    if(first !== second) {
        console.error('Expected First selector to equal the Second');
    } else {
        console.log('Passed');
    }
}).run();

Выход:

Ожидаемый первый селектор равен второму
Прошло

Разметка это:

<div>
    <h1>text</h1>
    <p>text</p>
    <p><a href="url">text</a></p>
</div>

Выражение XPath выглядит немного неловко, потому что оно напрямую воспроизводит предполагаемое поведение селектора CSS. Обычно можно написать //p[2]/a,

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