Javascript выполнение для набора текста в текстовом поле не ведет себя как sendKeys - PullRequest
0 голосов
/ 22 января 2020

Я запускаю свои тесты на Linux машине и там со следующим кодом, он не печатает текст правильно -

visibleElement.clear();
visibleElement.sendKeys("I am running on linux machine");

В пользовательском интерфейсе фактически другой текст вводится как - "on linux машина, на которой я работаю "," работающая на linux машина, на которой я работаю "и т. Д. c

, следовательно, чтобы справиться с этим, я использовал javascript like -

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].value='I am running on linux machine';", visibleElement);

This вводит текст в текстовом поле, но после его ввода есть кнопка Save, которая должна быть включена, но не включена.

Но эта кнопка включена, если используется sendKeys.

Не могли бы вы, пожалуйста, сообщить мне, почему этот javascript ведет себя по-разному и предоставить правильный javascript?

Как обе вещи будут работать в одном решении (без нажатия кнопки «Вкл.» Для включения кнопки, потому что это неправильно в моей ситуации)?

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Настройка arguments[0].value = "..." устанавливает значение в текстовом поле, но никакие события не инициируются в этом элементе. Кнопка «Сохранить», вероятно, ожидает события change где-то внутри <form>. Вам нужно будет вручную вызвать событие изменения в текстовом поле, используя JavaScript. См. Как я могу вызвать событие onchange вручную? .

Поведение, которое вы описываете, заставляет меня думать, что JavaScript уже прослушивает событие изменения, а затем шифрует порядок слов как хотя Йода напечатал их. (или набрал их у Yoda?) При ручном запуске события изменения может быть включена кнопка «Сохранить», и вы все равно можете получить тот же текст, что и при использовании sendKeys. Если это так, вы можете захотеть включите кнопку «Сохранить» также с помощью JavaScript:

// Set the input text
jse.executeScript("arguments[0].value='I am running on linux machine';", visibleElement);

// Find the "Save" button
WebElement saveButton = driver.findElement(...);

// Enable the save button
jse.executeScript("arguments[0].disabled = false;", saveButton);

saveButton.click();
0 голосов
/ 22 января 2020

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

Чтобы вызвать sendKeys() внутри нужного элемента, вам нужно вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать следующую Стратегию локатора :

WebElement clickableElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(visibleElement))
clickableElement.click();
clickableElement.clear();
clickableElement.sendKeys("I am running on linux machine");

Соответствующее подробное обсуждение можно найти в Как сохранить последовательность символов, отправленную с помощью метода SendKeys () через Selenium и C#


ТЛ; dr

Селен: Как селен идентифицирует элементы, видимые или нет? Возможно ли, что он загружен в DOM, но не отображается в интерфейсе?

0 голосов
/ 22 января 2020

Попробуйте написать в стиле обещания или в асинхронном / ожидающем стиле.

async clear_elem(elem) {
    // elem.clear(), MAY not work always because of some background JS
    await elem.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, 'a'));
    await elem.sendKeys(protractor.Key.DELETE);
    // Can await here for Application Load
}

reverse_string = as => as.split('').reverse().join();
// intersperse - Places an Item in between elements of an array
// ex: intersperse('k')("abc") => ['a', 'k', 'b', 'k', 'c']
intersperse = x => as => as.split('').reduce((acc, x) => [...acc, a, x], []).slice(0, -1);

(async () => {
    // Assuming you have element - visibleElement
    await browser.wait(protractor.ExpectedConditions.elementToBeClickable(visibleElement), default_timeout);

    await clear_elem(visibleElement);
    const str = reverse_string('I  am running on linux machine');
    const sequence_of_characters = intersperse(protractor.Key.HOME)(str);
    // e, HOME, n, HOME, i, HOME, h, HOME, ...
    await visibleElement.sendKeys(protractor.Key.chord(...sequence_of_characters));
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...