【发布时间】:2017-11-03 10:52:27
【问题描述】:
你好,Stackoverflow 的亲爱的人们,
目前我正在使用 Selenium 作为 WebDriver 模块使用 Codeception 编写验收测试。在我的测试中,检查我们的子导航是否存在、是否完整并且有效,我在以下代码中遇到了困难:
$I->see('Partners');
$I->click('Partners');
所有see 调用都运行良好,但click 调用失败,ElementNotVisibleException 指出要单击的元素不可见,因为see 调用有效,我不明白这一点。
为了确保我们没有在页面上看到任何旧的“合作伙伴”字符串,但它确实是我想要单击的链接,我通过添加 a 选择器更改了调用。
$I->see('Partners', 'a');
$I->click('Partners');
不过,我还是收到了以前的 ElementNotVisibleException。在下一步中,我在 click 调用中添加了一个上下文:
$I->click('Partners', 'a');
这使异常消失了。尽管如此,点击永远不会发生,测试只是失败并显示消息:
Link or Button or CSS or XPath element with 'Partner' was not found.
我什至像这样在点击调用中使用 XPath://a[text()='Partners'] 并得到相同的消息。
对此最困扰我的是see 调用似乎看到了我试图点击的链接,而且,即使是失败后 Codeception 提供的页面源和屏幕截图也包含这个链接,可见且在有效的 HTML。
我尝试单击子导航中的其他一些元素,结果相同,而更奇怪的是,单击主导航中的链接似乎工作得很好。
我不知道为什么这不起作用,但非常感谢任何帮助。
【问题讨论】:
-
不熟悉 codeception,但可能发生的是您发现的元素具有
hidden可见性样式或其显示样式为none。检查这些值。 Selenium 在尝试单击元素之前会检查这些值。这就是为什么您会收到该元素不可见的消息。你发现元素没问题,否则 Selenium 会抱怨 that。 -
谢谢,但不幸的是,据我所知,在将 Codeception 与 WebDriver 和 Selenium 一起使用时,
see调用遵循相同的规则,对于将visibility设置为 @987654338 的元素失败@ 或他们的display设置为none。因为它没有失败,所以元素应该是可见的。此外,屏幕截图证明该链接确实是可见的。无论如何,非常感谢你的想法 -
另一个想法是元素可以滚动到视图之外。如果 Selenium 尝试单击不在视口中的可见和显示元素(单击时滚动出视图),您也会得到
ElementNotVisibleException。这里的技巧是滚动页面以使元素位于视口中。不知道这是否有帮助。 -
我已经检查过了,子导航就在主导航的正下方,两者都在页面顶部可见,因此不需要滚动,因为
see看到元素低于导航。但是,您对可见性有另一种想法。在屏幕截图中,我注意到导航和子导航都“紧缩”在一起。导航中“覆盖”子导航元素的元素可能是硒看不到该元素的原因吗? -
是的,但是当存在重叠情况时,现代浏览器会以相当明显的错误响应。我尝试了 Edge 和 Chrome,分别得到了这两个错误:Element is obscured,并且 在点 (103, 210) 处不可点击。其他元素会收到点击。
标签: html selenium codeception acceptance-testing