我可以使用Mink和Selenium2发送原始键盘输入吗?

jcs*_*nyi 9 php behat mink selenium-webdriver

我正在使用Behat和Mink与Selenium2驱动程序,我正在尝试直接键入表单字段(模拟原始键盘输入),而不是使用该fillField()函数.

这就是我正在尝试的:

$element = $this->getSession()->getPage()->find('css', '#questionName');
$element->focus();

$element->keyPress('a');

// also tried this, with no success
// $element->keyDown('a');
// $element->keyUp('a');
Run Code Online (Sandbox Code Playgroud)

<input type="text" id="questionName">页面上有一个元素.它正确接收焦点,但不响应任何模拟键盘输入.

是否可以像这样模拟原始键盘输入?
我究竟做错了什么?

Tom*_*Tom 13

似乎有很多帖子抱怨keyPress没有按预期工作,有些驱动程序根本不支持它.例如:

Goutte - Keyboard manipulations are not supported by Behat\Mink\Driver\GoutteDriver

Selenium驱动程序特别使用自定义js库来运行它的命令,但它似乎不起作用.我尝试过使用$this->getSession()->getDriver()->keyPress()$element->getPress()没有运气.

https://github.com/Behat/MinkSelenium2Driver/blob/master/src/Behat/Mink/Driver/Selenium2Driver.php#L815

https://github.com/Behat/MinkSelenium2Driver/blob/master/src/Behat/Mink/Driver/Selenium2/syn.js

有趣的是,Selenium2代码库中的keyPress事件还没有单元测试(所以我假设它目前正处于开发阶段).

所以,目前,一个适当的解决方案是使用关键事件的javascript仿真是否有可能以编程方式模拟按键事件?(如果您不使用jQuery,请参阅此选项)和Behat Mink的evaluateScript函数.

如果你使用直接的PHPUnit来测试:

$key = 'a';
$script = "jQuery.event.trigger({ type : 'keypress', which : '" . $key . "' });";
$this->getSession()->evaluateScript($script);
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是Cucumber,请将此添加到FeatureContext.php文件中,您可以添加此功能:

/**
 * @Given /^(?:|I ) manually press "([^"]*)"$/
 */
public function manuallyPress($key)
{
    $script = "jQuery.event.trigger({ type : 'keypress', which : '" . $key . "' });";
    $this->getSession()->evaluateScript($script);
}
Run Code Online (Sandbox Code Playgroud)

并在您的功能文件中使用它,如下所示:

Given I manually press "a"
Run Code Online (Sandbox Code Playgroud)

至于使用javascript作为解决方案,一些驱动程序使用javascript来执行所需的keyPress.例如:

https://github.com/Behat/MinkZombieDriver/blob/master/src/Behat/Mink/Driver/ZombieDriver.php#L819