2

一般来说,我对 casperjs 和 javascript 还是很陌生,但我在其他领域拥有相当丰富的编码经验。目前我试图运行的代码只是去一个网站并点击一个链接,这应该很简单,但我遇到了麻烦。

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

casper.start('http://www.guru.com/emp/search.aspx?keyword=#&&page=1&sort=Earnings');

casper.then(function() {
    this.test.assertExists({
        type: 'xpath',
        path: '//*[@class="paddingLeft5 txt11px txt666"]/a[text()="Next"]'
    }, "Got Here");
});

casper.then(function() {
    var firstUrl = this.getCurrentUrl()
});

casper.thenClick(x('//*[@class="paddingLeft5 txt11px txt666"]/a[text()="Next"]'), function() {
    console.log("Woop!");
});

casper.waitFor(function check() {
    return this.evaluate(function() {
        return this.getCurrentUrl() != firstUrl;
    });
}, function then() {
    console.log(this.getCurrentUrl());
});


casper.run();

目前这在 5000 毫秒后超时而没有包裹在 waitFor 中,它只是打印相同的 url 两次。

4

2 回答 2

8

这应该是您正在寻找的。请注意,我firstUrl变成了一个全局变量;这样,Casper.waitFor()就可以访问它了。

此外,使用this.evaluate()insideCasper.waitFor()是不必要的,实际上禁止接收错误消息,因为远程页面上既不this也不firstUrl存在。这是因为您希望在 an 内部访问的任何变量都Casper.evaluate()必须在函数之后作为参数传递。

var casper = require('casper').create();
var x = require('casper').selectXPath;
var firstUrl;
casper.start('http://www.guru.com/emp/search.aspx?keyword=#&&page=1&sort=Earnings');

casper.then(function() {
    this.test.assertExists({
        type: 'xpath',
        path: '//*[@class="paddingLeft5 txt11px txt666"]/a[text()="Next"]'
    }, "Got Here");
});

casper.then(function() {
    firstUrl = this.getCurrentUrl()
});

casper.thenClick(x('//*[@class="paddingLeft5 txt11px txt666"]/a[text()="Next"]'), function() {
    console.log("Woop!");
});

casper.waitFor(function check() {
    return this.getCurrentUrl() != firstUrl;
}, function then() {
    console.log(this.getCurrentUrl());
});


casper.run();

这是我在运行上面的代码时得到的结果:

Woop!
http://www.guru.com/emp/search.aspx?keyword=#&&sort=Earnings&page=2
于 2013-04-02T15:36:22.980 回答
0

看起来像是一个严重依赖 JavaScript 进行导航的网站……

在处理下一步之前,您可能应该尝试等待URL 更改。

于 2013-04-02T07:19:21.247 回答