我们正在使用精湛的WebdriverJS(使用Selenium)在我们的网络应用上执行验收测试。一切正常,当我们使用Firefox和Safari时,我们的测试成功执行。
然而,当我们使用PhantomJS时,我们的测试失败并且没有任何帮助。它几乎就像...... Javascript甚至不在客户端页面内运行!如果PhantomJS' javascript环境遇到了错误。不幸的是,在将PhantomJS与WebdriverJS一起使用时,我似乎无法找到一种方法来访问Javascript错误。
如果我们直接使用PhantomJS,我们可以简单地(从PhantomJS site开始):
page.onError = function(msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
});
}
不幸的是,在WebdriverJS中使用PhantomJS时,我不知道如何访问这个神秘的page
对象。有什么想法吗?
答案 0 :(得分:3)
您实际上可以在INFO级别的PhantomJS stdout日志中访问JS错误。
$ phantomjs --webdriver 4444 --webdriver-loglevel=INFO
您甚至可以通过将日志级别设置为DEBUG
来推进事情,并查看PhantomJS执行通过Webdriver / Ghostdriver发送的命令的实际操作。
答案 1 :(得分:2)
我找到了一个可行的解决方案!本质上,它涉及使用onerror事件处理程序来拦截(和存储)Javascript错误。然后,一旦DOM准备就绪,我们就会通过隐藏的DOM元素报告错误。这允许Selenium寻找特定的元素(例如" .javascript-errors"),这是它自然相当擅长的东西。感谢无数其他博客文章和SO问题让我达到这一点。
代码:
//For detecting and reporting Javascript errors via Selenium. Note that this should be in its own file to allow this code to reliably detect syntax errors in other files.
var errors = [];
//Handle all errors
window.onerror = function(message, url, line) {
errors.push({"message":message, "url":url, "line":line});
}
//Report errors visually via HTML once the DOM is ready
window.onload = function() {
if(errors.length==0)
return;
var div = document.createElement("div");
div.className = 'javascript-errors';
div.innerHTML = '';
var style = "position:absolute; left:-10000px; top:auto; width:1px; height:1px;"; //CSS to hide the errors; we can't use display:none, or Selenium won't be able to read the error messages. Adapted from http://webaim.org/techniques/css/invisiblecontent/
for(var i=0; i<errors.length; i++)
div.innerHTML += '<div class="javascript-error" style="' + style +'"><span class="message">' + errors[i].message.replace('<', '<').replace('>', '>') + '</span><br/><span class="url">' + errors[i].url + '</span><br/><span class="line">' + errors[i].line + '</span></div>';
document.body.appendChild(div);
}