如何知道哪个行或选择器(XPath或byCss)导致错误/异常

时间:2014-07-30 05:21:21

标签: protractor angularjs-e2e e2e-testing

Protractor在出现错误时提供的堆栈跟踪有时并不会显示导致错误的选择器。例如,消息为

ElementNotVisibleError: element not visible

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

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

1 个答案:

答案 0 :(得分:0)

很棒的问题!

目前,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(也是一个好主意来托管其他By,例如ID,XPath等。使用转发/路由功能可以更好地进行调试:

  • 使用错误处理程序(在Angular / ES6 promise lingo: a 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可以由' grep定义'通过庞大的堆栈跟踪并搜索辅助方法的名称,例如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对他/她的需求。