Php 发送键以测试选项卡索引并关闭Behat中的选项卡(MacOSX、Behat、Chromedriver、Selenium2)

Php 发送键以测试选项卡索引并关闭Behat中的选项卡(MacOSX、Behat、Chromedriver、Selenium2),php,jquery,cucumber,selenium-chromedriver,behat,Php,Jquery,Cucumber,Selenium Chromedriver,Behat,1) 是否有方法将Tab键发送到浏览器以测试页面的Tab索引 2) 有没有一种方法可以将W键发送到浏览器,同时模拟按住cmd键关闭chrome中的选项卡 我们已经尝试过使用keyPress()函数,并在jQuery中使用了以下函数: /** * @Given /^(?:|I )manually press "([^"]*)"$/ */ public function manuallyPress($key) { $script = "jQuery.event.trigger({ typ

1) 是否有方法将Tab键发送到浏览器以测试页面的Tab索引

2) 有没有一种方法可以将W键发送到浏览器,同时模拟按住cmd键关闭chrome中的选项卡

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

/**
 * @Given /^(?:|I )manually press "([^"]*)"$/
 */
public function manuallyPress($key)
{
    $script = "jQuery.event.trigger({ type : 'keypress', which : '" . $key . "' });";
    $this->getSession()->evaluateScript($script);
}
他们两人的行为都不会像预期的那样(他们似乎根本没有工作)


有人找到了这个问题的解决方案吗?

我在这个问题上花了不少时间,下面是我的结果:

  • Behat没有预定义的步骤,只需将键发送到页面上的任何元素。它确实有
    pressKey
    方法(
    @如果我在:field字段中按:char键,则该方法有效),但它仅在字段作为键事件的目标时起作用您必须编写自己的
    按键
    才能将按键发送到自定义CSS元素

  • Behat使用Selenium,而Selenium又使用JS
    Syn
    库对合成浏览器事件进行符号化。该库由Selenium注入页面

  • Selenium使用
    Syn.trigger('keydown',…)
    向元素发送字符,但它似乎没有按预期工作。相反,使用
    Syn.key(DOMElement,'tab')
    实际上会将
    tab
    键发送到
    DOMElement
    元素您还必须实现这一点,才能使您的
    按键按预期工作。

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

  • 对于在窗口中触发tab键而不聚焦目标元素,有一种特殊情况-当您想要测试类似于
    跳到内容
    辅助功能链接的内容时,就是这种情况。这样的链接应该出现在第一个
    选项卡
    字符按键上,但是
    Syn
    选项卡只能从另一个可以接收焦点的元素

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

  • 好消息是,这一切都是可行的,并且正在为我工作。坏消息是,不幸的是,我无法共享代码(好吧,至少不是这个版本,也不是现在):(