phantomjs waitFor代码不工作

时间:2016-05-05 16:25:30

标签: javascript phantomjs

我正在使用此waitFor函数(https://github.com/ariya/phantomjs/blob/master/examples/waitfor.js)尝试在继续之前提交表单。我加载的网页有一个模式框,要求我在开始之前接受cookie政策。模态框是一个表单元素,当我在浏览器中执行以下操作时,框会消失,然后我可以使用该页面:

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()之后的网络浏览器中,模态框已经消失并运行测试' document.getElementById( " terms_form")== null'返回True。另外,我在我的文件顶部有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
};

编辑:我也有page.onError如下:

page.onError = function (msg, trace) {
  console.log(msg); 
  trace.forEach(function(item){
    console.log('  ', item.file, ':', item.line);
  });
}

但我没有看到任何错误被打印出来。我还是有点失落。我创建了一个onError处理程序的小测试,如下所示:

"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();
});

这似乎工作正常,我看到

$ phantomjs onerror.js
ReferenceError: Can't find variable: referenceErrorGenerator

当我尝试运行它时。

我想知道为什么我的waitFor代码没有执行而且没有打印任何错误。

1 个答案:

答案 0 :(得分:0)

page仅存在于phantomjs范围内,而不存在于网页范围内。重写它以在page.render之外执行page.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'); });