2016-05-05 9 views
0

私はこの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コードが実行されておらず、エラーが表示されないのでしょうか。

+0

あなたの関数には重要な誤植があります: 'docuement' - >' document'です。 – iurisilvio

+0

修正済みです。ありがとう。タイプミスがこの質問にしかないことが判明しましたが、私のコードにはそのようなことはありません。 – JawguyChooser

+0

さらに、ここに示したようにpage.onError(http://phantomjs.org/troubleshooting.html)を追加したにもかかわらず、意図的にエラー。たとえば、私のウェブコンソールで、「docuent.getElementById( "foo"); "と入力し、 Uncaught ReferenceErrorが生成されますが、ドキュメントタイプのコードをphantomjsコードに入れて実行するとstacktraceは表示されませんが、onErrorコードで印刷されていると思います。私はここでかなり重要なことを逃しているに違いない。 – JawguyChooser

答えて

0

pageは、phantomjsのスコープにのみ存在し、ウェブページのスコープには存在しません。 page.renderpage.evaluateの外部に実行されるように書き換えます。

// first execute the submit 
page.evaluate(function() { 
    document.getElementById("terms_form").submit(); 
}); 
// waitFor run outside the page scope 
waitFor(function(){ 
    return page.evaluate(function() { 
     return document.getElementById("terms_form") == null; 
    }) 
}, function() { page.render('aftersubmit.png'); }); 
+0

ああ、私はこれをテストします。しかし、私は実際にはページ内のif( "成功"の内部)全体を持っています。私はそれを私の質問に入れておくべきです、今私はそれを編集するでしょう – JawguyChooser

+0

したがって、問題は反対です。そこに 'page.render'を実行する' page'がありません。 – iurisilvio

+0

待って、私はpage.evaluate()内にページを持っていないのですか? – JawguyChooser

関連する問題