waitForSelector传递,但assertExists对同一个选择器失败

时间:2015-01-08 08:05:07

标签: javascript css-selectors phantomjs casperjs

当我调用以下函数时,waitForSelector为'selector'传递,但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);

Here是使用:nth-child选择器重现问题的完整示例。

1 个答案:

答案 0 :(得分:3)

这是WebKit Qt4 fork中的一个已知错误(请参阅#11632#11737)(自2010年起)。当使用:nth-child():nth-of-type() CSS3选择器时会发生这种情况。第二次运行选择器时,它返回不同的结果(大部分时间null)。唯一已知的解决方法是使用XPath表达式而不是CSS3选择器。这个错误在PhantomJS 2中修复,因为它使用了WebKit的Qt5分支(版本538.1)。

这是在http://example.com上重现问题的最小脚本(已从here修改):

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();

输出:

Expected First selector to equal the Second
Passed

标记是:

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

XPath表达式看起来有点尴尬,因为它直接重现了CSS选择器的预期行为。通常会写//p[2]/a