【问题标题】:How to know which line or selector (XPath or byCss) caused the error/exception如何知道是哪一行或选择器(XPath 或 byCss)导致了错误/异常
【发布时间】:2014-07-30 05:21:20
【问题描述】:

Protractor 在发生错误时提供的堆栈跟踪有时不会显示导致错误的选择器。例如一条消息阅读

ElementNotVisibleError: element not visible

什么element?如何首先知道导致错误的行是什么?

我将它与buildbot 一起使用,因此无法使用调试功能。

【问题讨论】:

  • 你应该粘贴整个输出。

标签: protractor angularjs-e2e e2e-testing


【解决方案1】:

很好的问题!

目前,Protractor API(甚至在 2.1.0 上)仅显示您提到的平淡无奇的错误消息。这是减轻调试痛苦的一种可能方法:

  • 不要随意使用元素>.click(),而是通过辅助函数路由,例如

    function clickElemByCSS(sel) { return clickElem(element(By.css(sel), sel); }
    function clickElem(elem, sel) { return elem.click().then(..); }
    [...] abr.,见下文了解有关错误处理的更多想法

    注意:为简洁起见,对参数和函数的名称进行了编辑

    然后 require 在你的规范文件中使用你的帮助文件并使用 clickElementByCSS(托管其他 Bys 也是一个好主意,例如通过 ID、XPath 等)。这种转发/路由功能的使用有助于更好地调试:

  • 使用错误处理程序(在 Angular/ES6 承诺术语中:catch() 块):

    function clickElement(element, selector) {
      return element.click().then(null, function errorHandler(error) {
        console.error("Element not found" +
                      "(selector: ') + selector + '): " + 
                      parseStackTrace(error.stack));
    }     
    

    生成的Error ('exception') 对象有一个stack 属性,可以更改,因此在这种情况下非常有用。

    parseStackTrace 可以通过 'grep-ing' 在巨大的堆栈跟踪上定义并搜索您的辅助方法的名称,例如与at clickElement 的行。

    然后,您可以获得许多先前的行(例如,5 行用于上下文)并将它们输出而不是整个堆栈跟踪,遗憾的是其中包含许多内部 Selenium-Protractor 交互噪声。这样可以节省您滚动浏览 100 多行 每个异常 以找到您感兴趣的代码(即导致异常的代码)的工作。

    例如,parseStackTrace 可以使用类似

    stack.match(/at clickElement(.*[\n]){1,5}/i)(虽然不是万无一失)。

    显然,可以改进传递函数的displayName,动态构建RegEx

希望堆栈跟踪可以在更多 Protractor 版本中自动截断。

作为这个问题的一个有趣的交叉授粉,一个名为cucumber-js 的项目也抱怨webdriver 的长堆栈跟踪。人们可以根据自己的需要调整monkeypatching presented in this comment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多