Столкнулся с интересным моментом: есть поле в проекте под названием «Шаблон проекта». Как видно на скрине - это не просто поле, а оно имеет стрелочку, нажав на которую мы получаем выпадающее меню с ооооогромнейшим списком существующих проектов, из которых нужно выбрать один, созданный заранее. Название - «Автотесты линейный проект».
И первое, что я сделал, это - такой код: WebElement element = driver.findElement(SupportingData.projectTemplateField); if (elenent.isDisplayed() && element.isEnabled()) { element.click(); element.sendKeys(SupportingData.projectName);
Да, поле проверил на кликабельность и затем поставил в него курсор. После этого передал в поле название - «Автотесты линейный проект» методом sendKeys().
Метод передачи не сработал. В режиме дебага я прогнал и понял, что поле не итерабельно… Да как же так? Ведь я имитирую действия пользователя и в режиме пользователя я МОГУ так сделать руками с клавиатуры!
Почему же тогда в режиме имитации пользователя - то есть кодом - так не выходит сделать? Ответа нет…
Ок, не итерабельно? Что ж, есть другой вариант - буду скроллить, открыв список.
Пишу такой код: кликаю на стрелку, чтобы раскрылся список и далее пытаюсь скроллить этот список до нужно элемента в области видимости (поставил для этого - true): WebElement element = driver.findElement(SupportingData.projectTemplateField); ((JavascriptExecutor)driver.).executeScript(«arguments[0].scrollIntoView(true);», name);
Запускаю и - скролла не происходит и снова ошибка, что элемент не итерабельный… Что за факинг булщет?!
Ок, вспоминаю про класс Robot. Когда происходит эмуляция нажатия клавиш (я же ориентируюсь на пользователя, который МОЖЕТ в поле писать слова, значит, и кодом можно писать в поле - логика такая была).
Пишу такое: Robot robot = new Robot(); String str = «ABT»; Достаточно 3-х символов, чтобы в выпадающем меню отобразилось искомое название «Автотесты линейный проект», при этом размер букв не важен. for (char ch : str.toCharArray()) { robot.keyPress(KeyEvent.VK_A); robot.keyRelease(KeyEvent.VK_A); robot.keyPress(KeyEvent.VK_B); robot.keyRelease(KeyEvent.VK_B); robot.keyPress(KeyEvent.VK_T); robot.keyRelease(KeyEvent.VK_T); }
И, о чудо, в поле появились английские буквы «АВТ»! Отлично, эксперимент завершился успехом и осталось вместо латиницы передать русские буквы!
Хер там! Кириллица юникода - постоянная ошибка передачи Invalid key.
Ок, буду кодом переключать раскладку:
robot.keyPress(KeyEvent.VK_SHIFT); robot.keyRelease(KeyEvent.VK_ALT);
Переключил, далее тот же код:
for (char ch : str.toCharArray()) { robot.keyPress(KeyEvent.VK_F); robot.keyRelease(KeyEvent.VK_F); robot.keyPress(KeyEvent.VK_D); robot.keyRelease(KeyEvent.VK_D); robot.keyPress(KeyEvent.VK_N); robot.keyRelease(KeyEvent.VK_N);
«FDN» - (я же перед этим переключил раскладку) соответствует русским буквам «АВТ» (из искомой фразы «Автотесты линейный проект»).
Да, сработало, в поле передаются русские буквы и в выпадающем меню я вижу нужный мне проект, который можно кликнуть отдельным методом и он вставится в поле.
Я возрадовался. Гуд? Ни хера! Тест работает через раз. В первый раз всё ок, на следующий прогон я снова вижу в поле «FDN»!!! Да блять! Почему???
Сварил кофею и тут подумал, а что если передавать не нажатие клавиш, а тупо стрингу из буфера обмена?
Сделал так:
@Step(«Кликаю на поле и передаю данные.») public void projectCreatingFieldClicj() { WebElement element = driver.findElement(SupportingData.projectTemplateField); if (elenent.isDisplayed() || element.isEnabled()) { element.click();
Далее - подключаю буфер обмена: String textToBring = «Автотесты линейный проект»; StringSelection stringSelection = new StringSelection(textToBring); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContent(stringSelection, stringSelection);
А сейчас тупо нажимаю контрл + V :)
robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyRelease(KeyEvent.VK_V);
Иииииии -> фсьо заработало!
Вот такой опыт)) Может, кому-то пригодится :)
коммент удалён
коммент удалён
· 29.06.2024
Это решаемо через переменную, главное было прикрутить норм реализацию вставки из буфера))
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён