我是初学者,在单元测试和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")
存在的位置。我做错了什么?
答案 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();
});