Protractor 在发生错误时提供的堆栈跟踪有时不会显示导致错误的选择器。例如,一条消息读取
ElementNotVisibleError: element not visible
什么element
?如何首先知道导致错误的行是什么?
我正在使用它,buildbot
因此无法使用调试功能。
Protractor 在发生错误时提供的堆栈跟踪有时不会显示导致错误的选择器。例如,一条消息读取
ElementNotVisibleError: element not visible
什么element
?如何首先知道导致错误的行是什么?
我正在使用它,buildbot
因此无法使用调试功能。
好问题!
目前,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
(也是一个好主意来托管其他By
s,例如通过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
长堆栈跟踪的抱怨。可以根据他/她的需要调整此评论中提出的猴子补丁。