2

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

ElementNotVisibleError: element not visible

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

我正在使用它,buildbot因此无法使用调试功能。

4

1 回答 1

0

好问题!

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

  • 不要随意使用 < element >.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(“异常”)对象具有stack可以更改的属性,因此在这种情况下非常有用。

    parseStackTrace可以通过在巨大的堆栈跟踪上“ -ing grep”并搜索您的辅助方法的名称来定义,例如带有at clickElement.

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

    例如,parseStackTrace可以使用类似的东西

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

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

这是希望堆栈跟踪可以在进一步的量角器版本中自动截断。

作为这个问题的一个有趣的交叉授粉,一个名为的项目cucumber-js也有其对webdriver长堆栈跟踪的抱怨。可以根据他/她的需要调整此评论中提出的猴子补丁。

于 2015-06-09T08:35:30.070 回答