【问题标题】: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。