Селен: данные, введенные в форму с несколькими вкладками, иногда исчезают
У меня есть веб-приложение со сложной формой ввода данных, в которой есть несколько вкладок с полями ввода для различных элементов конфигурации. Я пишу тест, который вводит данные в поля на разных вкладках, а затем выполняет сохранение. При вводе каждого элемента я проверяю, что элемент управления вводом данных имеет текст или значение, которое я выбрал, прежде чем перейти к следующему шагу. Я обнаружил, что иногда, но не всегда, когда я перехожу на другую вкладку, поля на предыдущей вкладке теряют введенные мной данные.
Как мне это предотвратить?
Я использую Selenium 2 с WebDriver в Java и запускаю тесты с Firefox.
У меня проблемы с двумя полями:
Первое - это поле для ввода текста. Второе - это поле для ввода текста с функцией автозаполнения.
Оба поля являются последними для ввода данных перед переключением вкладок. Ни одно из других полей, в которые я вводил данные до переключения вкладок, не теряет данные. Только те, с которыми я общаюсь прямо перед переходом на новую вкладку.
Я попытался проверить, что JQuery загружается в конце метода, который отправляет текст в поля ввода, но, похоже, это не помогает. Метод, который проверяет JQuery, возвращает true, а данные все еще иногда стираются.
Это никогда не происходит при вводе данных вручную, и не происходит в другом автоматическом тесте, когда данные вводятся только на одной вкладке.
Вот HTML-код для поля автозаполнения, когда текст был введен, и нет ожидающего ввода, который вызвал автозаполнение:
<div id="s2id_autogen5" class="select2-container select2-container-multi select2">
<ul class="select2-choices" style="">
<li class="select2-search-choice">
<div>
htm
</div>
<a class="select2-search-choice-close" tabindex="-1" onclick="return false;" href="#"></a>
</li>
<li class="select2-search-field">
<input class="select2-input" type="text" autocomplete="off" tabindex="0" style="width: 10px;"></input>
</li>
</ul>
</div>
Вот источник HTML для поля ввода простого текста:
<td class="optionValue option_sr_test_object_url">
<input id="option_d03e6450-5990-4a31-8e84-5b1af89d2c47_sr_test_object_url" type="text" placeholder="e.g. /path/testobject.html" value="/path/test.html">
</input>
</td>
2 ответа
Я наконец нашел то, что надежно предотвратило это:
. Driver.switchTo() окно (driver.getWindowHandle());
Когда я выполняю эту строку перед переключением вкладок, мои ранее введенные данные не были удалены. Я не знаю, почему это работает, и я не помню, как я нашел это как решение. Я не переставал обновлять этот вопрос этим ответом в течение нескольких месяцев, но я все время забывал это сделать.
После нескольких дней борьбы с этим у меня есть частичное решение моей проблемы:
Для простого текстового поля ввода, если я отправляю Keys.TAB для изменения фокуса на следующее поле ввода, тогда данные, как правило, не стираются, когда я переключаюсь на другую вкладку в форме. Должно быть какое-то событие, которое вызывается, когда фокус переключается на другое поле (но не на другую вкладку), которое не срабатывает, когда для ввода текста используется только sendKeys. Однако в некоторых случаях данные по-прежнему иногда исчезают.
Для ввода с функцией автозаполнения мне пришлось отправить Keys.RETURN или Keys.TAB, чтобы успешно ввести текст в поле. С помощью этого поля вы можете либо выбрать опцию из списка автозаполнения, либо просто нажать клавишу ввода или клавишу табуляции, чтобы ввести текст, который не соответствует ни одной из опций автозаполнения. После ввода текста с помощью Keys.RETURN или Keys.TAB мне нужно было изменить фокус на другое поле, отправив Keys.TAB. Опять же, я считаю, что это какое-то событие, которое должно сработать, чтобы данные остались, и это событие сработает только после изменения фокуса на другое поле ввода, но этого не произойдет, если я переключу вкладки.
Проверка того, что JQuery не имеет активных запросов, не помогает, потому что в некоторых случаях, даже если нет активного запроса, данные все равно иногда исчезают из одного или обоих полей.
Мне нужен действительно надежный метод, который устраняет эту проблему в любых ситуациях. Я бы предпочел не иметь жесткий код сна. Может быть, есть лучшая техника для установки хорошего ожидания без кодирования? Я хотел бы иметь полное решение моей проблемы, потому что, учитывая, что это решение не является надежным, я не могу принять это как ответ на вопрос.