NoSuchElementException
异常。您认为您的选择器正在运行,但无法找到该元素。我应该采取什么策略来分析可能是这种情况的不同原因?
我应该研究什么以及如何研究?好的答案将包含示例情况以及如何解决它们。 (例如,验证选择器,帧,等待等)
#1 楼
1.信任您的代码,并怀疑SUT(被测软件):如果一切正常,并且测试突然开始失败。从检查实际产品开始,而不是调试代码中的问题。进行一些视觉检查,查看开发团队是否已修改元素或该元素不再显示。
2。相信您的代码并怀疑环境:
如果在本地一切正常,并且在集成到CI / CD后立即失败了。然后在测试服务器中调查产品行为。主要是由于操作系统和配置的差异,产品无法像在本地那样工作(引发错误)
3。现在怀疑您的脚本(使用绝对XPATH):
您可能正在使用绝对XPATH,这会在DOM结构更改时导致不稳定的测试。
使用相对XPATH(建议使用CSS)。如果您具有唯一的ID /名称来标识元素,请不要使用xpath /。
4。现在怀疑您的脚本(不使用显式等待):
有时脚本缺少显式等待并尝试与动态元素进行交互,这会导致测试失败,因为它会尝试在甚至未与元素进行交互之前就进行交互在DOM中可用。
5。现在怀疑您的脚本(处理微调器):
有时微调器需要时间才能显示。因此,如果您只是检查隐身条件,那么它将返回true并尝试在实际微调器事件完成之前与下一个元素进行交互
因此,首先,请检查微调器的可见性,然后检查与其他动态元素进行交互之前不可见。
6。现在怀疑您的脚本(不处理iFrame):
有时元素会在iframe中,并且脚本在与这些元素进行交互之前不会在框架之间切换。
检查是否存在父元素包含标签框架或iframe,以确定该元素是否在iframe中
*********************添加在*************************** ***************
7。现在怀疑您的脚本(不禁用等待角度的脚本):
有时产品使用微调器等待异步操作在后台完成。例如,您单击登录,然后微调框会出现,并且不会消失,直到后台任务未完成。
在这种情况下,请确保您不等待异步操作完成(例如,waitforangular标志)在与临时叠加层中的元素进行交互之前,在量角器中将其设置为true)。
这是因为,如果将waitforangular设置为true,则脚本将等待直到所有任务完成,然后,临时覆盖(例如微调器)将从DOM中删除。
#2 楼
通常,PDHide的答案很好,但是由于您特别询问验证选择器的问题,因此我想补充一下,您可以在浏览器控制台中对其进行测试。对于CSS选择器,可以使用document.querySelector(selector);
对于XPath,可以使用
document.evaluate(selector, document).iterateNext();
进行测试其中一个将返回第一个匹配元素,如果不存在则返回
null
。如果您的选择器不是合法的CSS / XPath,它们也会帮助抛出SyntaxError
。#3 楼
首先,我们需要了解异常的根本原因。如Selenium文档中所写,它是由FindElement / FindElements方法抛出的。
这可能是导致作者:
无效的定位器。在这种情况下,您必须在页面上手动验证其有效性。
在FindElement调用时,DOM中没有元素。换句话说,您的代码尝试在尚未加载时查找元素。
页面上DOM中没有元素。您想在页面上找到实际上不存在的元素。根据业务逻辑/应用程序更改来更新代码。
第二点可能会更加棘手,为了证明这是真正的根本原因,请尝试设置一个断点,使其恰好在在您想要访问(查找)元素之前。这样,您将能够查看页面在浏览器中的加载方式,并添加可以帮助您的特定条件等待。
#4 楼
除了其他答案外,对我来说,最有效的方法是在测试失败时进行屏幕截图并附加到报告中。 (使用黄瓜时,可通过After
钩轻松完成)这样,我可以转到配置项,查看报告并快速了解发生了什么。
评论
我认为这是测试自动化的一个好习惯,但是我不确定这是否有助于分析NoSuchElementException。也许截图显示了元素,现在呢?屏幕截图是在失败之后拍摄的,这至少需要几毫秒,因此可以在之后绘制元素。
– Niels van Reijmersdal
19/12/16在15:45
当然,在某些情况下该元素在屏幕上可见,但测试未能找到它(定位器已更改,错误的等待条件等)。但是在我看来,它通常可以帮助发现问题(测试已转到另一页,或者我要单击的元素上方有某些内容)。
–AndréRoggeri Campos
19/12/16在18:33
@NielsvanReijmersdal这样可以节省时间,避免手动进行视觉检查
– PDHide
19/12/17在8:36
评论
为什么不能只在Chrome中使用inspect元素
– PDHide
19/12/12在18:52
这种方法还能提供什么其他优势?
– PDHide
19年12月12日在21:21
@PDHide,因为代码中可能包含xpath。是的,您可以检查元素,将其复制到代码中并进行比较,但是只需将选择器如上所述拖放到控制台中,就可以看到它正在尝试选择的内容,而不必比较长的xpath。
–马克·梅奥(Mark Mayo)
19/12/12在21:23
我会尝试从未尝试过的
– PDHide
19/12/12在21:35
这正是我测试定位器的方式,只需添加一件事-如果定位器指向元素列表,querySelector将返回一个元素。为了避免这种情况,请使用querySelectorAll并检查定位符是否唯一(指向单个WebElement)。
–莫罗
19/12/17在15:32