Отправка ключей для проверки индекса вкладок и закрытия вкладок в Behat (MacOSX, Behat, Chromedriver, Selenium2)

1) Есть ли способ отправить клавишу 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);
}

Ни один из них не будет вести себя так, как ожидалось (похоже, они вообще не работают).

У кого-нибудь есть решение этой проблемы?

2

Решение

Я потратил немало времени на эту проблему, и вот мои результаты:

  1. У Behat нет предопределенного шага, чтобы просто отправить ключи любому элементу на странице. Это имеет pressKey метод (@Given I press the :char key in the :field field), но работает только с полем в качестве цели ключевого события. Вы должны написать свой собственный pressKey отправить ключи на пользовательский элемент CSS

  2. Behat использует Selenium, который в свою очередь использует JS Syn библиотека для симуляции синтетических событий браузера. Эта библиотека вводится на страницу Selenium.

  3. Селен использует Syn.trigger('keydown',...) отправлять символы элементам, но, похоже, не работает должным образом. Вместо этого, используя Syn.key(DOMElement, 'tab') на самом деле отправит tab ключ к DOMElement элемент. Вы должны были бы реализовать это, чтобы сделать ваш pressKey работать как положено.

  4. Behat написан с использованием компонентов Symfony и использует DriverFactory класс для создания драйверов, в том числе селен драйвера. По какой-то причине Selenium2Driver класс жестко закодирован, поэтому нет способа внедрить собственную расширенную реализацию этого класса. Вы должны были бы использовать рефлексию, чтобы прокручивать при выходе из защищенных методов Selenium2Driver класс для включения Syn библиотека и выполнить код JS из предыдущего шага.

  5. Существует специальный случай для клавиши табуляции, запускаемой в окне без целевого элемента — это тот случай, когда вы хотите протестировать что-то вроде Skip to content ссылка доступности. Такая ссылка должна появиться на первом Tab пресса персонажа, но Synможет вкладка только от другого элемента, который может получить фокус.

    Рабочим решением является введение такого элемента в качестве самого первого элемента после открытия. <body> тег. Этот элемент будет визуально скрыт, но совместим с программами чтения с экрана. Затем мы запускаем ключ на этом элементе, чтобы убедиться, что элемент, который должен получить самый первый фокус из индекса табуляции, действительно его получает. Обратите внимание, что введение элемента и нажатие на него клавиши не делает его сфокусированным.

Хорошей новостью является то, что все это выполнимо и работает для меня. Плохая новость заключается в том, что, к сожалению, я не могу поделиться кодом (ну, по крайней мере, не этой версии и не только пока) 🙁

0

Другие решения

Других решений пока нет …