我尝试使用PhantomJS通过登录验证自动从网站抓取信息。 要访问页面上的登录表单,用户必须单击一个按钮,该按钮将触发绘制表单的javascript函数。 在我的代码中我简单地调用所述js函数来绘制表单,然后尝试填充字段。 问题是phantomjs没有找到新绘制的元素。 另一方面,如果我在调用函数后截取屏幕截图,我可以看到它上面的元素。 访问页面上的其他表单元素没有问题,所以我认为问题可能是phantomjs在完全绘制之前尝试访问元素。
这是我的代码:
var page = require('webpage').create();
url = "http://websiteURL.bla";
page.open(url, function(status) {
if (status === "success") {
page.evaluate(function() {
netbar_login_signup() //js function to show login form
});
page.evaluate(function() { //wait a few seconds, then fill the fields
document.getElementById("gsnet_login_name").value = "name";
document.getElementById("gsnet_login_passwd").value = "password";
document.getElementById("gsnet_login_submit").click();
},3000);
window.setTimeout(function() { //wait a few more seconds, then take screenshot
page.render("page.png");
},5000);
}
});
有人遇到类似的问题或知道我的解决方案吗?
答案 0 :(得分:0)
你几乎得到了这个,但是在第一个等待期间。
page.evaluate
确实可以在函数之后使用其他参数,但这些不是超时,这些只是传递给page.evaluate内部的参数。所以,等待我们在两种情况下都必须使用setTimeout
。
var page = require('webpage').create();
url = "http://websiteURL.bla";
page.open(url, function(status) {
// This looks a bit cleaner, less nesting
if (status !== "success") {
console.log(status);
phantom.exit(1); // 1 = error exit code
}
page.evaluate(function() {
netbar_login_signup() //js function to show login form
});
// from this moment both setTimeout functions are executed simultaneously
// the difference is that the second is waiting for 2 seconds longer
// wait three seconds, then fill the fields
setTimeout(function() {
page.evaluate(function() {
document.getElementById("gsnet_login_name").value = "name";
document.getElementById("gsnet_login_passwd").value = "password";
document.getElementById("gsnet_login_submit").click();
});
}, 3000);
// wait two more seconds, then take screenshot
setTimeout(function() {
page.render("page.png");
phantom.exit(); // phantom.exit(0) // success exit code
}, 5000);
});