Codeception:如何检查元素是否具有焦点?

3

这实际上是一个有趣的问题,也许你可以使用 $I->grabAttributeFrom('#element', ':focus') 来做些什么,如果找不到该属性,则应该失败。 - sunomad
好主意,但是:focus不是HTML属性,它是CSS伪类。 - Thomas Landauer
是的,没错,但还是值得一试的 :). 我下一步尝试将会是在 $I->seeElement() 中使用 :focus 作为 css 或 xpath 选择器的一部分来定位元素。接下来,我会在 $I->executeJS() 中尝试使用 jQuery 的 is() 函数,并作出调整。最后,如果万不得已,我会尝试在 $I->executeInSelenium() 中使用 Selenium 的 activeElement() 方法。 - sunomad
$I->executeJS('return $("#element").is(":focus")'); 已经成功了! :-) 请将其作为答案发布,以便我可以接受它! - Thomas Landauer
很高兴听到它对你有用!答案已在下面发布,谢谢! - sunomad
3个回答

4
一位可靠的消息来源告诉我这个可行:
$I->executeJS('return $("#element").is(":focus")');

祝您进行愉快的测试!


1
在用户验收测试中调用页面中存在的库是一种不好的做法。这会破坏测试的目的,即尽可能地复制用户的行为。通过调用页面的代码,您将忽略一些步骤,这将使测试暴露于错误的结果和额外的维护。测试能够正常工作并不意味着您正在验证该功能。 - Florent B.
请随意在这里发布您对类似问题的答案,其他人可能会错过它。 - sunomad

2

对 @sunomad 的回答有更多细节。

在你的 acceptance.suite.yml 中启用 Codeception 的 Asserts Module

modules:
    enabled:
        # ...
        - Asserts

然后在验收测试中使用这个。
$focus = $I->executeJS('return $("#element").is(":focus")');
$I->assertEquals(true, $focus);

可以翻译为:“(通过Selenium)适用于Firefox和Chrome。但是,它与PhantomJS不兼容-请参见此问题:https://github.com/ariya/phantomjs/issues/10427”。

你知道吗,我有一种感觉你可能需要在这里使用断言。干得好! - sunomad

0
为了补充@sunomad的回答。 如果您使用以下代码行:
$I->executeJS('return $("#element").is(":focus")');

你遇到了这个错误:

[Facebook\WebDriver\Exception\UnknownServerException] 未知错误:$ 不是一个函数

$ 替换为 jQuery

$I->executeJS('return jQuery("#element").is(":focus")');

然后它就可以工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接