似乎有很多帖子抱怨 keyPress 没有按预期工作,并且一些驱动程序根本不支持它。例如:
Goutte - Keyboard manipulations are not supported by Behat\Mink\Driver\GoutteDriver
Selenium 驱动程序特别使用自定义 js 库来运行它的命令,但它似乎不起作用。我试过同时使用 the$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 事件的单元测试(所以我假设它目前正在开发中)。
因此,目前,一个适当的解决方案是使用来自Is it possible to simulation key press events 编程的关键事件的 javascript 仿真?(如果您不使用 jQuery,请参阅此替代方案)和 Behat Mink 的 evaluateScript 函数。
如果您使用直接 PHPUnit 进行测试:
$key = 'a';
$script = "jQuery.event.trigger({ type : 'keypress', which : '" . $key . "' });";
$this->getSession()->evaluateScript($script);
或者,如果您使用的是 Cucumber,请将其添加到您的 FeatureContext.php 文件中,您可以添加此函数:
/**
* @Given /^(?:|I ) manually press "([^"]*)"$/
*/
public function manuallyPress($key)
{
$script = "jQuery.event.trigger({ type : 'keypress', which : '" . $key . "' });";
$this->getSession()->evaluateScript($script);
}
并在您的功能文件中使用它,如下所示:
Given I manually press "a"
至于使用 javascript 作为解决方案,一些驱动程序使用 javascript 来执行所需的 keyPress。例如:
https://github.com/Behat/MinkZombieDriver/blob/master/src/Behat/Mink/Driver/ZombieDriver.php#L819