Могу ли я отправлять необработанный ввод с клавиатуры, используя Mink и Selenium2?

Я использую 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');

На странице есть элемент <input type="text" id="questionName">. Он правильно получает фокус, но не реагирует ни на какой смоделированный ввод с клавиатуры.

Можно ли имитировать необработанный ввод с клавиатуры таким образом?
Что я делаю неправильно?


person jcsanyi    schedule 27.06.2013    source источник


Ответы (3)


Кажется, есть много сообщений, жалующихся на то, что 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's AssessmentScript.

Если вы используете прямой 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 для выполнения требуемого нажатия клавиши. Например.:

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

person Tom    schedule 08.07.2013

Я использую Mink с Zombie.js, и, поскольку он изначально не перехватывает события клавиатуры, я прослушиваю события focusout и keyup jQuery.

$('form[name="order"]').find('input[id$="quantity"],input[id$="price"]').bind('keyup focusout', function(){
// [...] update order price
});

Я решил проблему для себя, но я не пробовал с Selenium2.

person Jeremy Jumeau    schedule 04.05.2016

Самый простой ответ, который я нашел, - это вызвать ключевое событие в javascript и написать определенный шаг поведения, чтобы отправить js в браузер и запустить его.

Мы использовали YUI, поэтому мы используем симуляцию события YUI, но jquery или нативный js обрабатывают его. Концепция — вот что важно. Это лучшее решение, которое я нашел, пока не будет встроенной поддержки поведения.

надеюсь это поможет.

public function press_key_in_the_ousupsub_editor($keys, $fieldlocator) {
        // NodeElement.keyPress simply doesn't work.
        if (!$this->running_javascript()) {
            throw new coding_exception('Selecting text requires javascript.');
        }
        // We delegate to behat_form_field class, it will
        // guess the type properly.
        $field = behat_field_manager::get_form_field_from_label($fieldlocator, $this);

        if (!method_exists($field, 'get_value')) {
            throw new coding_exception('Field does not support the get_value function.');
        }

        $editorid = $this->find_field($fieldlocator)->getAttribute('id');

        // Get query values for the range.
        $js = '
    function TriggerKeyPressBehat() {
    // http://www.wfimc.org/public/js/yui/3.4.1/docs/event/simulate.html
    YUI().use(\'node-event-simulate\', function(Y) {
        var id = "'.$editorid.'";
        var node = Y.one("#" + id + "editable");

        node.focus();
        var keyEvent = "keypress";
        if (Y.UA.webkit || Y.UA.ie) {
            keyEvent = "keydown";
        }
        // Key code (up arrow) for the keyboard shortcut which triggers this button:
        var keys =  ['.$keys.'];
        for(var i=0; i<keys.length;i++) {
            node.simulate(keyEvent, { charCode: keys[i] });
        }
    });
    }
    TriggerKeyPressBehat();';
        $this->getSession()->executeScript($js);
    }
person Colin Chambers    schedule 16.07.2015