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
,