1

何らかのトリックにより、新しいウィンドウ (window.open、target=blank など) と SlimerJS を使用した iframe の両方でヘッダーを処理することができました。新しいウィンドウのナビゲーター データ (navigator.appVersion など) を変更することもできますが、iframe でこれを行うことに固執しています。onInitialized メソッドは、メイン ウィンドウと新しいウィンドウでのみ正しく機能し、iframe では機能しないようです。

コードの一部を次に示します。

var headers =
{ 
 "Accept-Language" : "test_language",
 "Accept" : "test/accpet",
 "Connection" : "keep-alive",
 "Keep-Alive" : "333",
 "Accept-Charset" : "test-utf",
 "User-Agent" : "test_ua"
}

var webpage = require('webpage').create(
{
 pageSettings:
 {
  javascriptEnabled: true,
  loadImages: true, 
  loadPlugins: true,
 }
});

_onPageCreated = function(childPage) 
{
 console.log('a new window is opened');
 childPage.settings.userAgent = options.useragent["navigator.userAgent"];
 childPage.customHeaders = headers;
 childPage.viewportSize = { width:400, height: 500 };

 childPage.onInitialized = _onInitialized;
 childPage.onNavigationRequested = _onNavigationRequested;
 childPage.onLoadStarted = _onLoadStarted;
 childPage.onLoadFinished = _onLoadFinished;
 childPage.onResourceRequested = _onResourceRequested;
 childPage.onPageCreated = _onPageCreated;
};

_onResourceRequested = function(requestData, networkRequest)
{
 for(var h in headers)
 {
  networkRequest.setHeader(h, headers[h], false);
 }
...
}

var _onInitialized = function() 
{
 this.customHeaders = headers;

 console.log("[webpage.onInitialized]");
 this.evaluate(function(options)
 {
  (function()
  { 
   window.navigator.__defineGetter__('appVersion', function ()
   {
    return options.useragent["navigator.appVersion"];
   });
   ...
  })();
 }, options);
};

...
               
webpage.onInitialized = _onInitialized;
webpage.onNavigationRequested = _onNavigationRequested;
webpage.onLoadFinished = _onLoadFinished;
webpage.onResourceRequested = _onResourceRequested;
webpage.onPageCreated = _onPageCreated;

PhantomJS でやってみましたが、以下の場合は「webpage」ではなく「this」が使えないようです。

var _onInitialized = function() 
{
 console.log("[webpage.onInitialized]");
 this.evaluate(function()  // <<---not working
 {

 });
 console.log("test"); //is not being printed 
};

メイン ページと子ページの両方で onInitialized として定義できるように、この関数を「this」オブジェクトで動作させたいと考えています。

とにかく、主な質問は Phantom のコードではなく、SlimerJS のコードに関するものです。

4

0 に答える 0