9

Selenium2 ドライバーで Behat と Mink を使用してい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');

<input type="text" id="questionName">ページに要素があります。フォーカスを正しく受け取りますが、シミュレートされたキーボード入力には応答しません。

このような生のキーボード入力をシミュレートすることは可能ですか?
私は何を間違っていますか?

4

3 に答える 3

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);

または、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

于 2013-07-08T08:01:09.207 に答える