PhantomJs:js函数

时间:2017-02-02 14:03:30

标签: phantomjs

我尝试使用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);

  }
});

有人遇到类似的问题或知道我的解决方案吗?

1 个答案:

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

});