4247


CasperJS で、クリック後の Request URL の取得方法を教えて下さい。 タグの `href` や `src` の属性を確認せず、
Request URL を取得する方法です。

[code]

    casper.on('resource.requested', function(resource){
      this.echo(resource.url);
    });
    
[/code]

で全ての Request URL は取得できるのですが、クリック後に発生したリクエストのURLのみを取得したいのです。

環境は以下になります。

  * CentOS 6.6
  * PhantomJS 1.9.7
  * CasperJS 1.1.0-beta3

よろしくお願いします。


CC BY-SA 3.0
2015-01-07T06:44:35.327
4227
2015-01-07T12:41:45.527
2015-01-07T12:41:45.527
30
7158
question
javascript casperjs
CasperJS でクリック後の Request URL の取得方法


["click"](http://casperjs.readthedocs.org/en/latest/events-
filters.html#click)イベントを利用すると、全てのクリックについてイベントハンドラを登録できます。ただし、現時点のリリースバージョンである
[1.1.0-beta3
には入っていない](https://groups.google.com/d/msg/casperjs/pdirBhfLUE4/ZyrK7Su6V7QJ)機能なので、masterからインストールする必要があります。

クリックによって発生したページ遷移の宛先URLを取得するには、"click"イベントハンドラ内で `casper.requestUrl`
を見るか、`.then()` で実行ステップをその場で追加し、そのコールバック内で遷移後のURLを取得する方法が考えられます。ただし前者では、
[`casper.click()`](https://github.com/n1k0/casperjs/blob/bed988a8e9bb758a590a8333f42c8cbd62718c4d/modules/casper.js#L457)
によるクリック操作で即時にページ遷移が始まること、つまり非同期にページ遷移が発生しないことが前提になると思います
(非同期にページ遷移が発生する場合の動作は未確認)。

[code]

    var casper = require('casper').create();
    casper.on('click', function() {
      // クリックで発生したナビゲーションリクエストのURL
      this.echo('on click event: request url:\n\t' + this.requestUrl);
      this.then(function(response) {
        // クリック後に行きついたページのURL
        console.log('on click event -> then: current url:\n\t' + this.getCurrentUrl());
      });
    });
    casper.on('navigation.requested', function(url) {
      // 動作確認用のログ出力
      this.echo('navigation.requested url:\n\t' + url);
    });
    
    casper.start('http://www.google.co.jp/search?q=CasperJS');
    casper.then(function() {
      this.echo('clicking the first result');
      this.click('h3.r a');
    });
    casper.thenOpen('http://example.com', function() {
      // clickハンドラ内で追加した実行ステップの後に実行されることを確認するログ出力
      this.echo('Hi from example.com');
    });
    casper.run();
    
[/code]

出力:

[code]

    navigation.requested url:
        http://www.google.co.jp/search?q=CasperJS
    clicking the first result
    navigation.requested url:
        http://www.google.co.jp/url?q=http://casperjs.org/&sa=U&ei=LCitVMbdN8f98QXY44CADg&ved=0CBQQFjAA&usg=AFQjCNExI2_qte04muyxvqQ9Ks2VII8hNQ
    on click event: request url:
        http://www.google.co.jp/url?q=http://casperjs.org/&sa=U&ei=LCitVMbdN8f98QXY44CADg&ved=0CBQQFjAA&usg=AFQjCNExI2_qte04muyxvqQ9Ks2VII8hNQ
    navigation.requested url:
        http://casperjs.org/
    on click event -> then: current url:
        http://casperjs.org/
    navigation.requested url:
        http://example.com/
    Hi from example.com
    
[/code]


CC BY-SA 3.0
2015-01-07T12:40:43.793
4247
2015-01-07T12:40:43.793
30
4227
answer