Codeception 无法点击它之前看到的元素
Posted
技术标签:
【中文标题】Codeception 无法点击它之前看到的元素【英文标题】:Codeception can't click on element it has seen just before 【发布时间】:2017-11-03 10:52:27 【问题描述】:你好,*** 的亲爱的人们,
目前我正在使用 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) 处不可点击。其他元素会收到点击。
【参考方案1】:
我不明白为什么在某些情况下会发生这种情况而在其他情况下不会,但我找到了一个适合我的解决方案:仅使用 CSS 选择器。
基本上在某些情况下(我认为这与单击 div/span 而不是 a/button 有关)->see()
将使用模糊文本字符串作为第一个参数,但 ->click()
需要显式 CSS 选择器。
所以这会有“我能看到但不能点击”的问题:
// BROKEN
$I->see("All topics", ".header-taxonomy .taxonomy-list-title");
$I->click("All topics", ".header-taxonomy .taxonomy-list-title");
但这会起作用:
// WORKS
$I->see("All topics", ".header-taxonomy .taxonomy-list-title");
$I->click(".header-taxonomy .taxonomy-list-title");
显然它根本不理想,部分原因是它需要一个独特的选择器,但对我来说主要是因为它使测试和测试输出不太一致且更难阅读。
无论哪种方式,我只是想完成这个测试脚本,现在它可以工作了,而且因为我仍在使用带有模糊文本定位器的 ->see()
,所以我仍然确信在我点击之前文本会显示.
值得注意的是,这个问题不会在使用 phpBrowser
模块时发生,这让我很头疼。我“升级”到WebDriver
,发现由于->click()
的不同行为,我的脚本在所有这些地方都被破坏了(除了预期需要在使用它们之前打开菜单,这在PHPBrowser 中不需要)
【讨论】:
以上是关于Codeception 无法点击它之前看到的元素的主要内容,如果未能解决你的问题,请参考以下文章
seeInField 找到元素,而 fillField 没有 - CodeCeption