2

私は一般的にcasperjsとjavascriptにはかなり慣れていませんが、他の分野でかなり豊富なコーディング経験があります。現在、実行しようとしているコードは、Web サイトにアクセスしてリンクをクリックするだけです。これは簡単なはずですが、問題が発生しています。

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

現在、これはwaitForでラップせずに5000ミリ秒後にタイムアウトします。同じURLを2回出力するだけです。

4

2 に答える 2

8

これはあなたが探しているものでなければなりません。firstUrlグローバル変数に移動したことに注意してください。このようにしCasper.waitFor()て、 はそれにアクセスできます。

また、this.evaluate()内部で使用することCasper.waitFor()は不要であり、実際にはリモート ページにthisも存在しないため、エラー メッセージの受信が抑制されていました。firstUrlこれは、内部でアクセスしたい変数は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 に答える