私はこのwaitFor関数(https://github.com/ariya/phantomjs/blob/master/examples/waitfor.js)を使用して、続行する前にフォームを送信しようとしています。私がロードしているWebページにはモーダルボックスがあり、それを行う前にクッキーポリシーを受け入れる必要があります。モーダルボックスは、フォーム要素であると私は私のブラウザで次の手順を実行する際、箱が離れて行くと、私は、ページを使用することができます。phantomjs waitForコードが動作しない
document.getElementById("terms_form").submit();
したがって、私はphantomjsでこれを行うことができるはずと思いました。
page.open('http://thiswebpage.com/', function(status){
if(status === "success"){
page.evaluate(function(){
document.getElementById("terms_form").submit();
waitFor(function(){
return document.getElementById("terms_form") == null; },
function() { page.render('aftersubmit.png'); });
});
} else { console.log ("status: "+status) }
phantom.exit();
}
だから、何私には奇妙なのは、aftersumbit.pngが作成されないことです。だから私のコードに根本的に間違っていることがあります。また、waitForからのコンソールログメッセージも表示されません。
私は明らかに何かを見逃しているに違いないが、私はかなり長い間それに固執していたので、私は助けを求めると思った。百万円前払いありがとうございます。
document.getElementById( "terms_form")。submit()を実行した後、Webブラウザでは、モーダルボックスがなくなり、テスト 'document.getElementById( "terms_form")== nullが実行されます。 'は真を返します。また、私は私のファイルの先頭に(便宜上ここで貼り付け、リンク、で与えられる)のwaitForの定義を持っている:
"use strict";
function waitFor(testFx, onReady, timeOutMillis) {
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s
start = new Date().getTime(),
condition = false,
interval = setInterval(function() {
if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
// If not time-out yet and condition not yet fulfilled
condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
} else {
if(!condition) {
// If condition still not fulfilled (timeout but condition is 'false')
console.log("'waitFor()' timeout");
phantom.exit(1);
} else {
// Condition fulfilled (timeout and/or condition is 'true')
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
clearInterval(interval); //< Stop this interval
}
}
}, 250); //< repeat check every 250ms
};
EDIT:
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item){
console.log(' ', item.file, ':', item.line);
});
}
:私はまた、以下のようpage.onErrorを持っています
まだ印刷中のエラーは表示されません。私はまだこれで少し失われています。私はそれを実行しようとすると、私は
$ phantomjs onerror.js
ReferenceError: Can't find variable: referenceErrorGenerator
を参照してください
"use strict";
var page = require('webpage').create();
page.onConsoleMessage = function(msg){
console.log(msg);
}
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item){
console.log(' ', item.file, ':', item.line);
});
}
page.open('https://google.com/', function(status){
page.evaluate(function(){
referenceErrorGenerator.getElementById("foo");
});
phantom.exit();
});
そして、それが正常に動作するようです:私はこのようなのonErrorハンドラの小さなテストを作成しました。
なぜ私のwaitForコードが実行されておらず、エラーが表示されないのでしょうか。
あなたの関数には重要な誤植があります: 'docuement' - >' document'です。 – iurisilvio
修正済みです。ありがとう。タイプミスがこの質問にしかないことが判明しましたが、私のコードにはそのようなことはありません。 – JawguyChooser
さらに、ここに示したようにpage.onError(http://phantomjs.org/troubleshooting.html)を追加したにもかかわらず、意図的にエラー。たとえば、私のウェブコンソールで、「docuent.getElementById( "foo"); "と入力し、 Uncaught ReferenceErrorが生成されますが、ドキュメントタイプのコードをphantomjsコードに入れて実行するとstacktraceは表示されませんが、onErrorコードで印刷されていると思います。私はここでかなり重要なことを逃しているに違いない。 – JawguyChooser