PhantomJs:访问js函数绘制的元素
我正在尝试使用PhantomJS通过登录身份验证自动从网站上抓取信息。 要访问页面上的登录表单,用户必须单击一个按钮,该按钮触发一个javascript函数,用于绘制表单。 在我的代码中,我只是简单地调用said js函数来绘制表单,然后尝试填充字段。 问题是phantomjs找不到新绘制的元素。 另一方面,如果在调用函数后拍摄屏幕截图,我可以看到函数上的元素。 访问页面上的其他表单元素没有问题,因此我认为问题可能是phantomjs试图在元素完全绘制之前访问这些元素 这是我的密码:PhantomJs:访问js函数绘制的元素,phantomjs,Phantomjs,我正在尝试使用PhantomJS通过登录身份验证自动从网站上抓取信息。 要访问页面上的登录表单,用户必须单击一个按钮,该按钮触发一个javascript函数,用于绘制表单。 在我的代码中,我只是简单地调用said js函数来绘制表单,然后尝试填充字段。 问题是phantomjs找不到新绘制的元素。 另一方面,如果在调用函数后拍摄屏幕截图,我可以看到函数上的元素。 访问页面上的其他表单元素没有问题,因此我认为问题可能是phantomjs试图在元素完全绘制之前访问这些元素 这是我的密码: var p
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);
}
});
有没有人遇到过类似的问题,或者知道我的解决方案?你几乎完全正确,但这是第一次等待
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);
});