waitForSelector passes, but assertExists fails for the same selector

前端 未结 1 1261
我寻月下人不归
我寻月下人不归 2020-12-11 23:06

When I call the following function, waitForSelector passes for \'selector\', but assertExists fails for the same selector. How is it possible?

相关标签:
1条回答
  • 2020-12-11 23:42

    This is a known bug (see #11632, #11737) in the Qt4 fork of WebKit (from 2010). It happens when :nth-child() or :nth-of-type() CSS3 selectors are used. The second time the selector is run, it returns a different result (most of the time null). The only known workaround is to use XPath expressions instead of CSS3 selectors. This bug is fixed in PhantomJS 2 as it uses a Qt5 fork of WebKit (version 538.1).

    This is a minimal script to reproduce the issue on http://example.com (modified from 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();
    

    Output:

    Expected First selector to equal the Second
    Passed
    

    Markup is:

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

    The XPath expression looks a little awkward, because it directly reproduces the intended behavior of the CSS selector. Normally one would write //p[2]/a.

    0 讨论(0)
提交回复
热议问题