我正在使用此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代码没有执行而且没有打印任何错误。
答案 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'); });