Первый символ непостоянно отсутствует при отправке строки на ввод ExtJS через sendKeys ()

Я случайно сталкиваюсь с проблемой отсутствия первого символа в поле ввода ExtJS5 при отправке строки с помощью метода sendKeys.

Информация о системе: Ubuntu 14.04 -> контейнеры докеров с сеткой селена (2.48.2) Браузер Firefox

Код прост. Я просто получаю входной веб-элемент, жду, если он доступен для щелчка (т.е. isEnabled и isDisplayed), очищаю и отправляю строку:

wait.until(ExpectedConditions.elementToBeClickable(input)).clear();
input.sendKeys(value);

элемент ввода тоже прост:

<input id="textfield-1455-inputEl" data-ref="inputEl" type="text" role="textbox" size="1" name="name" class="x-form-field x-form-required-field x-form-text x-form-text-default x-form-focus x-field-form-focus x-field-default-form-focus" autocomplete="off" componentid="textfield-1455"/>

Я заметил, что проблема возникает только при первом запуске sendKeys () на странице:

  • Зайдите на страницу, дождитесь загрузки страницы, работайте с первым вводом
  • Войдите на страницу, дождитесь загрузки страницы, выберите Включить в соответствующем поле выбора, чтобы включить поле ввода, работать с полем ввода (изображение с этим примером прилагается)
  • Войдите на страницу, дождитесь загрузки страницы, нажмите кнопку добавить, чтобы добавить необходимое поле ввода, работайте с полем ввода

Другие вхождения sendKeys на странице стабильны.

Я искал похожие вопросы. Не похоже, что проблема со специальными символами (пример отсутствующих символов: 46-> 6; coverTest -> overTest; 1 -> ничего);

Кроме того, я не думаю, что это проблема с отсутствующими символами из-за инфраструктуры удаленного веб-драйвера. Тесты терпят неудачу случайно, но в определенных местах.

Я знаю, что могу использовать sendKeys (), затем проверить значение ввода и повторить действие отправки. Однако это последний вариант.

Требуется ли дополнительная проверка для ввода ExtJS (любого атрибута в DOM), чтобы убедиться, что поле ввода готово?

Ценю вашу помощь.


person Mike    schedule 29.01.2016    source источник
comment
Вы убедились, что это не ошибка в Ext framework? Я помню, что мое поле даты не принимало первый символ, набранный после перехода в него, потому что событие фокуса поля было запущено только после того, как я начал печатать. Все было хорошо, если пользоваться мышью. Я не могу найти ветку форума sencha, но я думаю, что это было исправлено в 4.2.1 или 4.2.2 (которые были выпущены ПОСЛЕ первых версий Ext5).   -  person Alexander    schedule 29.01.2016
comment
Спасибо за реальный пример. Однако, если это так, я думаю, что эта проблема не возникнет случайно. По крайней мере, с моим STR появлялся бы чаще и во всех возможных случаях. Моя версия ExtJS - 5.1.2.748, и проблема возникает в нескольких выпусках.   -  person Mike    schedule 01.02.2016


Ответы (2)


Иногда такое случается со мной. Попробуйте сначала щелкнуть по полю, но это дикая догадка, предполагающая, что могут быть какие-то проблемы, связанные с фокусом. Ваша последовательность может быть примерно такой:

wait.until(ExpectedConditions.elementToBeClickable(input)).click();
input.clear();
input.sendKeys(value);

Странно то, что я действительно столкнулся с ситуацией, когда я дважды щелкнул по нему перед отправкой значений, и это как-то сработало: P

Еще можно попробовать использовать неродной исполнитель javascript.

JavascriptExecutor myExecutor = ((JavascriptExecutor) driver);
myExecutor.executeScript("arguments[0].value='6';", input);

Извини, чувак, если бы система была передо мной, я бы попробовал гораздо больше.

person Prateek    schedule 30.01.2016
comment
Спасибо. Я уже мысленно представил вам варианты =) Я пытался найти корень проблемы, но поле ввода мысли не готово. Странно то, что проблема возникает случайно. - person Mike; 01.02.2016

Я боролся с ошибкой sendKeys, но следующее работает довольно стабильно. Метод findVisibleElement - это настраиваемая оболочка для driver.until....

protected static boolean sendKeysByChar(By by, String input)
{
        WebElement field = driver.findVisibleElement(by).base();

    field.click();
    field.clear();

    for (int i = 0; i < input.length(); i++) {
        String current = driver.findElement(by).getAttribute("value");
        String nextChar = String.valueOf(input.charAt(i));
        while (current.length() <= i || !current.endsWith(nextChar)) {
            field.sendKeys(nextChar);
            current = driver.findElement(by).getAttribute("value");
        }
    }

    field = driver.findElement(by); // Refresh element
    if (field.getAttribute("value").equals(input)) { return true; }

    log.warn("Send keys by char failed.");
    return false;
}
person Austin    schedule 07.09.2017