Codeception不能单击它之前看到的元素

时间:2017-11-03 10:52:28

标签: html selenium codeception acceptance-testing

您好亲爱的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。

我尝试点击子导航中的其他元素并获得相同的结果,而 - 更奇怪的是 - 点击主导航中的链接似乎工作得很好。

我不知道为什么这不起作用,但非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我不明白为什么它在某些情况下会发生,而在其他情况下不会发生,但我找到了一个适合我的解决方案:仅使用 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() 的不同行为,我的脚本在所有这些地方都被破坏了(除了在使用它们之前需要打开菜单,这是不需要的)在 PHP 浏览器中)