PhantomJS に Function.prototype.bind メソッドがないことについては、ここや他の場所で多くの議論があり、多くの有益な慈善家がシム/ポリフィルを作成したり、それらのリソースを他の人に指摘したりしています。Pythonバインディングを使用してSelenium Webdriverを介してPhantomJSを実装しています。このポリフィルを利用する方法をいくつか試しましたが、役に立ちませんでした。現在、webdriver を継承するテスター クラスで次のコードを使用しています。
bindShim = """var script = document.createElement('script');
script.src = '/home/dunkin/scripts/es5-shim.js';***
script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(script);
"""
self.execute_script(bindShim)
新しいページにアクセスするたびに、このコードを実行します。実際、この方法は、jQuery 変数が PhantomJS によって確実に認識されるようにするために機能しました。ただし、PhantomJS ドライバー ログにはまだ次のように表示されます。
[ERROR - 2015-02-10T17:43:44.068Z] Session [fd37e5c0-b14b-11e4-b9e3-5bbebfaf3f9d] - page.onError - msg: TypeError: 'undefined' is not a function (evaluating 'arguments.callee.bind(this,e)')
[ERROR - 2015-02-10T17:43:44.069Z] Session [fd37e5c0-b14b-11e4-b9e3-5bbebfaf3f9d] - page.onError - stack:
(anonymous function) (https://jsta.sh/media/all.js?1459:16)
t (https://jsta.sh/media/all.js?1459:16)
(anonymous function) (https://jsta.sh/media/all.js?1459:17)
(anonymous function) (https://jsta.sh/media/all.js?1459:8)
(anonymous function) (https://jsta.sh/media/all.js?1459:8)
(anonymous function) (https://jsta.sh/media/all.js?1459:8)
I (https://jsta.sh/media/all.js?1459:2)
等
この .bind() の問題に関する他の質問と密接に関連しているにもかかわらず、私の質問が、すぐに使用できる Selenium PhantomJS 実装に機能を追加したいと考えている人にとって役立つことを願っています。アクセスするすべてのページに es5 shim を直接追加するのではなく、Ghostdriver-PhantomJS-Selenium スタックによって実装された JavaScript ライブラリを修正できれば幸いですが、どうすればそれができるか、またはできるかどうかはわかりません。別のフレームワークでフィルタリングするのではなく、ベア PhantomJS でこのテスターを構築した方が、そのようなことはより簡単になると感じ始めています。
私の仕様:
- セレン バージョン 1.43
- PhantomJS 1.98
- パイソン 2.7
- Ubuntu 14.04 LTS (GNU/Linux 3.17.1-エラスティック x86_64)
*** es5-shim は、phantomjs コンソールで使用すると、次の有望な結果を生成します。
phantomjs> console.log(Object.keys)
function keys() {
[native code]
}
undefined
phantomjs> var shim = require("/home/dunkin/scripts/es5-shim.js")
undefined
phantomjs> console.log(Object.keys)
function keys(object) {
if (isArguments(object)) {
return originalKeys(ArrayPrototype.slice.call(object));
} else {
return originalKeys(object);
}
}
undefined
phantomjs>