在PhantomJS中找不到变量:页面

时间:2015-10-05 17:51:17

标签: javascript phantomjs

我是初学者,在单元测试和UI测试中都是测试

我正在尝试使用以下代码为我的登录页面创建UI测试:

console.log("Teste de Login");

var page = require('webpage').create();
page.open('http://localhost/login', function(status) {
    console.log("Page loadeed");

    if(status === "success") {
        page.render('example1.png');
    }

    page.evaluate(function() {
        // $("#numeroUsuario").val("99734167");
        document.getElementById('numeroUsuario').value = "99734167";
        page.render('exampl2.png');

        // $("#formLogin").submit();
        page.render('example3.png');
    });

    phantom.exit();
});

但是此代码返回以下错误:

> phantomjs.exe ./testLogin.js
Teste de Login
Page loadeed
ReferenceError: Can't find variable: page

  phantomjs://webpage.evaluate():4
  phantomjs://webpage.evaluate():8

元素$("#numeroUsuario")存在的位置。我做错了什么?

2 个答案:

答案 0 :(得分:11)

documentation对页面上下文(强调我的)说了以下内容:

  

执行沙盒,网页无法访问phantom对象,无法探测自己的设置

这意味着在page.evaluate()回调函数之外定义的变量无法在其中访问。这也意味着this引用window对象。

您当然可以将page.evaluate()来电分成多个来电,并将page.evaluate()来电之间使用外部变量的来电移至Platinum Azure showed,但这并不是如果你想从page.evaluate()回调内部的回调内部调用一些PhantomJS函数,那就行了。

解决方案是使用window.callPhantom and page.onCallback pair。这非常适合异步函数:

var renderId = 0;
page.onCallback = function(data){
    console.log("Callback: " + data.type);
    if (data.type === "exit") {
        phantom.exit();
    } else if (data.type === "render") {
        page.render(data.fname || ("screenshot_" + (renderId++) + ".png"));
    }
};

page.onConsoleMessage = function(msg){
    console.log("remote> " + msg);
};

var getUrl = "http://example.com";
page.open(url, function(){
    page.evaluate(function(getUrl){
        $.get(getUrl, "", function(data){
            console.log(JSON.stringify(data));
            window.callPhantom({ type: "render" });
            window.callPhantom({ type: "exit" });
        });
    }, getUrl);
});

退出可能会干扰先前触发的渲染操作。在这种情况下,肯定可以延迟退出一段固定的时间,例如半秒:

if (data.type === "exit") {
    setTimeout(function(){
        phantom.exit();
    }, 500);
}

此外,将page对象传递给页面上下文是不可能的,因为只能传入可序列化的对象:

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等将工作!

答案 1 :(得分:3)

非常确定在page.evaluate环境中,您无法从Phantom脚本中引用任何内容。

在您的情况下,您实际上可以有多个评估调用:

console.log("Teste de Login");

var page = require('webpage').create();
page.open('http://localhost/login', function(status) {
    console.log("Page loadeed");

    if(status === "success") {
        page.render('example1.png');
    }

    page.evaluate(function() {
        // $("#numeroUsuario").val("99734167");
        document.getElementById('numeroUsuario').value = "99734167";
    });

    page.render('exampl2.png');

    page.evaluate(function() {
        // $("#formLogin").submit();
    });

    page.render('example3.png');

    phantom.exit();
});