Дано:
ChromeDriver 2.25.426923 + junit + maven Задача:
По ходу тестов нужно заполнять поля с автокомплитерами. Проблема:
Запуск в 8 потоков. Случайным образом при заполнении поля может потеряться один два символа.
Пример.
sendKeys("Казань")
Поле заполнено - “Казнь”.
Мой костыль:
public void sendKeysByChars(WebElement we, String charSequence){
char[] charArray = charSequence.toCharArray();
int charNumber = 0;
for (char character : charArray){
while (true) {
we.sendKeys(String.valueOf(character));
String text = we.getAttribute("value");
if(text.charAt(charNumber)==character){
break;
}
}
charNumber++;
}
}
Вопрос:
Встречался ли кто нибудь с такой бякой? Если да, то как вы решили эту проблему?
Ваще не понимаю, есть последовательность символов: charSequence, которая приводится к массиву символов, что впринципе одно и тоже. Зачем символы к символам приводить? - я что-то не понимаю видимо. Плюс мне кажется для такой простой задачи слишком много линеек кода пишеться. Нету этого - ну как его принципа - KISS.
Кстати если не ошибаюсь метод sendKeys() уже вводит имеюющиеся символы, зачем, спрашивается их парсить в символы ?
Единственная бяка - это ваш костыль из приведения строки в массив чар, цикл foreach по char[], с вложенным ещё одним, в котором приведение из чар в стринг и при этом сам sendKeys принимает CharSequence, в итоге ещё одно приведение. И это торжество завершает счётчик в foreach
Как вы 8 потоков запускаете?
Попробуйте убрать ваш костылёк и использовать просто sendKeys, и попробуйте отправлять латинские символы
Я начинающий тестировщик. Мне не очень понятно к чему столько сарказма. Если я что-то не так написал, приношу свои извинения. Но не стоит всех мерить по себе.
По теме, запуск тестов осуществляется с помощью maven.
Первонаперво попробовал бы на самых свежих версиях. Обновил бы драйвер до последнего (кажется 2.27 у хромдрайвера сейчас), обновить Selenium Webdriver, и сам Хром браузер
Если не помогает - можно печатать медленней - это так себе вариант, но можно попробовать спать по 10 миллисекунд например между каждой буквой (цифру подобрать экспериментально). Подойдет как временный солюшн
Просто вставлять текст в поле через executeScript document.getElementById('gadget_url').value = ''; что-то вроде такого. Скорость, быстрота, но теряется эмуляция нажатий, если у поля есть какая то логика при введении текста - скорее всего она не сработает
Спасибо большое за ответы, первый пункт вроде помог (обновил хромдрайвер до 2.27). Погоняю еще тесты и отпишусь. Update. Проблема не решилась.
Соорудил новый костыль, работает быстрее. Позже перепишу тесты с использованием ThreadLocal.
public void sendKeysAndCheck(WebElement we, String charSequence){
for(int i = 0; i < 3; ){
we.clear();
we.sendKeys(charSequence);
if(charSequence.equals(we.getAttribute("value")))
return;
}
throw new AssertionError("Поле заполнено не корректно");
}
Надеюсь специалисты по костылям меня этим костылем бить не будут
Интересный вопрос, на самом деле. Ждем предложений от Aleksej_Berlin, seitar18, rmarinsky, которые блеснули красноречием, но ничего не сказали по сути вопроса.
Мне помогали слипы (как предложил xotabu4), когда такое происходило. SendKeys был обернут в метод, который вводил символ, делал либо слип, либо любое другое лишь бы что, и затем следующий символ. Причем происходило оно не всегда. На некоторых порталах работало в несколько потоков на Хроме без проблем.
Если у вас где-то уже определены методы ввода и получения атрибута, то можно сделать еще компактней и универсальней при помощи библиотеки awaitility + java 8 фич. Выглядеть это будет приблизительно следующим образом:
Где clearAndType -> BiFunction<WebElement, CharSequence, WebElement>.
П.С. Вы же осознаете, что создали бесконечный цикл? И если по какой-то причине (к примеру, бага) атрибут никогда не будет совпадать с переданным текстом, то ваш тест просто повесит поток.
Такая проблема, как у ТС, у меня возникла когда на поле был повешан скрипт проверяющий ввод пользователя на каждый символ и скрипт сам этот символ вводил в поле, в результате символы проскакивали так как селениум быстро вводил, а JS в браузере не успевал. Решилось только тем, что принудительно в нужное место с помощью JS прописывалось значение. Возможно что при большой нагрузке как раз JS в браузере и не успевает обрабатывать.
Огромное спасибо за такое бурное обсуждение. Итак по порядку:
Тесты запускаю командой mvn test. Насколько я понимаю, за запуск тестов и генерацию отчетов в maven отвечает maven-surefire-plugin. Часть pom.xml с настройками этого плагина я прикрепил в комментарии выше. Количество потоков определяется строкой:
<threadCount>8</threadCount>
В каждом потоке выполняется тестовый класс целиком
<parallel>classes</parallel>
Т.е. методы одного тестового класса будут выполнены последовательно. Перед запуском каждого тестового класса вызывается:
public void initBrowser() {
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();
}
После:
public void closeBrowser() {
driver.quit();
}
Создавая первый костыль, я осознавал, что цикл бесконечный. И да, потоки он вешал. На этот случай я приделал еще один костыль . Но потом отказался от использования метода sendKeysByChars.
Возможно у меня схожая ситуация с той, которая была у Vladislav Kulasov.
На поле повешен скрипт:
$("input[name=someName]").die().live('keydown.autocomplete', function () {....});
Пока второй костыль справляется и трех попыток хватает для заполнения поля без потерь символов. Буду пробовать внедрять предложенные вами решения, по мере понимания их работы.
Кажется, если вы обходите таким образом валидацию JS - то вы априори не проверяете кейс “как по-человечески вставить текст и чтобы валидация его не сломала”.
Ну т.е. если таким образом валидация обходится, у меня вопрос: значит, пользователь используя какие-нибудь автокомплитеры или менеджеры паролей - сможет копипастом вставить что-то и обойти проверку?
все зависит от цели теста, если нужно проверить поле поиска с валидатором то я с вами согласен, если же такое поле просто промежуточное звено чтобы добратся до, допустим , страницы которую нужно тестировать то мой метод вполне сойдет