【问题标题】:How to access errors when using WebdriverJS?使用 WebdriverJS 时如何访问错误?
【发布时间】:2014-04-10 00:40:12
【问题描述】:

我们正在使用出色的 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 对象。有什么想法吗?

【问题讨论】:

  • 您通常会在每个命令之后的错误参数中获得整个错误堆栈(例如 .click('#elem',function(err , ...))。这给了你任何信息?你得到了哪些无用的错误?
  • 据我了解,这里运行着两个 JS 引擎/环境——运行 PhantomJS 测试的“主机”和运行网页实际代码的“客户端”。我认为您指的是“主机”错误,我可以轻松访问。相反,我需要的是“客户端”错误......

标签: selenium webdriver phantomjs ghostdriver webdriver-io


【解决方案1】:

您实际上可以在 INFO 级别访问 PhantomJS 标准输出日志中的 JS 错误。

$ phantomjs --webdriver 4444 --webdriver-loglevel=INFO

您甚至可以通过将日志级别设置为DEBUG 来推动事情的发展,并查看 PhantomJS 实际执行您通过 Webdriver / Ghostdriver 发送的命令。

【讨论】:

  • 所以,为了完全清楚,您可以确认即使将 PhantomJS 与 WebdriverJS 一起使用也能正常工作?谢谢!
  • 是的。我们将 PuantomJS 与 webdriver.io 一起使用,它与 WebdriverJS 非常相似。但无论如何,无论您使用哪个驱动程序来引导它,日志都来自 PhantomJS 的输出。
【解决方案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('<', '&lt;').replace('>', '&gt;') + '</span><br/><span class="url">' + errors[i].url + '</span><br/><span class="line">' + errors[i].line + '</span></div>';

    document.body.appendChild(div);
}

【讨论】:

  • 太棒了!但不幸的是,每次加载新页面时都必须注入此代码。我在 webdriverjs 中实现了一个实验功能,它启用了eventhandling on browser side - 所以你不需要一次又一次地注入你的代码。它目前仅适用于 chrome,但我会尝试将其推广到其他浏览器
  • 我最担心的是 PhantomJS - 如果出现 Javascript 级别的错误,大多数浏览器的单元测试都会失败。使用标准浏览器很容易找到该错误(手动)。然而,除非你有我们正在谈论的东西,否则使用 PhantomJS 是不可能的。我很想看看你能否让你的代码在 PhantomJS 中运行!
  • 如果使用firefoxDriver,您可以在启动selenium服务器时通过系统属性webdriver.log.file将javascript错误控制台转储到文件中。见FirefoxDriver
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多