发送密钥以测试Behat中的Tab索引和关闭标签(MacOSX,Behat,Chromedriver,Selenium2)

时间:2016-03-18 14:13:57

标签: php jquery cucumber selenium-chromedriver behat

1)有没有办法将Tab键发送到浏览器来测试页面的选项卡索引?

2)有没有办法将W键发送到浏览器,同时还模拟按住cmd键以关闭chrome中的标签?

我们尝试过使用keyPress()函数,并且还在jQuery中使用了以下函数:

{{1}}

它们都不会按预期运行(它们似乎根本不起作用)。

有没有人能解决这个问题?

1 个答案:

答案 0 :(得分:0)

我在这个问题上花了很多时间,这是我的结果:

  1. Behat没有预先定义的步骤来将密钥发送到页面上的任何元素。它确实有pressKey方法(@Given I press the :char key in the :field field),但它只适用于字段作为键事件的目标。 您必须编写自己的pressKey以将密钥发送到自定义CSS元素

  2. Behat使用Selenium,而Selenium又使用JS Syn库来模拟合成浏览器事件。这个库由Selenium注入页面。

  3. Selenium使用Syn.trigger('keydown',...)向元素发送字符,但它似乎没有按预期工作。相反,使用Syn.key(DOMElement, 'tab')实际上会将tab密钥发送到DOMElement元素。 您也必须实施此功能,以使pressKey按预期工作。

  4. Behat是使用Symfony组件编写的,并使用DriverFactory类来创建驱动程序,包括selenium驱动程序。出于某种原因,Selenium2Driver类是硬编码的,因此无法注入自己的此类扩展实现。 您必须使用反射来退出Selenium2Driver类的受保护方法以包含Syn库并执行上一步中的JS代码。

  5. 在没有关注目标元素的窗口中触发了Tab键的特殊情况 - 当您想要测试类似Skip to content辅助功能链接的情况时就是这种情况。此类链接应出现在第一个Tab字符按下,但Syn只能从另一个可以获得焦点的元素中进行选项卡。

    一个有效的解决方案是在打开<body>标签后将这样的元素作为第一个元素注入。此元素将在视觉上隐藏,但与屏幕阅读器兼容。然后我们触发这个元素的键,以确保一个应该从tab索引得到第一个焦点的元素实际上得到它。请注意,注入元素和按下触发键不会使其自身聚焦。

  6. 好消息是,这一切都是可行的并且正在为我工​​作。坏消息是,不幸的是,我不能分享代码(好吧,至少不是这个版本而不仅仅是):(