Protractor在出现错误时提供的堆栈跟踪有时并不会显示导致错误的选择器。例如,消息为
ElementNotVisibleError: element not visible
element
是什么?如何知道导致错误的行是什么?
我将其与buildbot
一起使用,因此无法使用调试功能。
答案 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对他/她的需求。