PhantomJs:访问js函数绘制的元素

PhantomJs:访问js函数绘制的元素,phantomjs,Phantomjs,我正在尝试使用PhantomJS通过登录身份验证自动从网站上抓取信息。 要访问页面上的登录表单,用户必须单击一个按钮,该按钮触发一个javascript函数,用于绘制表单。 在我的代码中,我只是简单地调用said js函数来绘制表单,然后尝试填充字段。 问题是phantomjs找不到新绘制的元素。 另一方面,如果在调用函数后拍摄屏幕截图,我可以看到函数上的元素。 访问页面上的其他表单元素没有问题,因此我认为问题可能是phantomjs试图在元素完全绘制之前访问这些元素 这是我的密码: var p

我正在尝试使用PhantomJS通过登录身份验证自动从网站上抓取信息。 要访问页面上的登录表单,用户必须单击一个按钮,该按钮触发一个javascript函数,用于绘制表单。 在我的代码中,我只是简单地调用said 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);

  }
});

有没有人遇到过类似的问题,或者知道我的解决方案?

你几乎完全正确,但这是第一次等待

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);

});