для меня это самое приятное в работе - как вишенка на вершине большого торта: если разработчики все поломали - пока они с высунутыми языками бегают и пытаются все починить - тестеры могут с честными мордами сидеть на http://automated-testing.info и общаться с красивыми девушками. на возможные вопросы отмазка железная: а чё? ничего не работает. у меня вот - все тесты готовы, но проверять нечего....
не согласен, syelanin. все можно написать в 3 строки.
(каждую отдельную задачу)
если получается больше 3 строк на каждую задачу, значит одно из двух:
1. или автоматизатор не очень знаком с теорией алгоритмов (твой случай, syelanin. восприми это как конструктивную критику - я не хочу обидеть) 2. или твоя инфраструктура, которую ты построил над селениумом - плохо спланирована
Виталик, не спорю что я косячу и пишу неоптимальный код. Критику твою воспринимаю и не обижаюсь, если не прав признаю.
Если ты хорошо разбираешься в алгоритмах может ты покажешь как бы ты решил такую задачу в 3 строки.
Запускается некий процесинг. Нужно мониторить табличку со статусами выполнения неких джобов. Табличка имеет Id. В табличке во 2-й колонке находится jobId, в 5-й Status. Страничка периодически рефрешится и количество строк меняется, инкрементируется, общее количество джобов заранее неизвестно. Если статусы всех джобов Completed, значит PASS. Если где-то статус Failed или ActionRequired, значит FAIL и надо извлечь Id этих джобов и посчитать сколько джобов с этими статусами.
если длинна этого массива больше нуля: //td[text()='Failed' or text()='ActionRequired']/../td[2], то берешь размер этого массива, а так-же печатаешь (или сохраняешь) все его елементы (плз, не итерируй, а напр так: Arrays.toString(arr) - итерация - враг народа)
1 строчка
давай еще задачки, люблю это дело. буду рад помочь, при наличии свободного времени
и програмерам лучше не показывать свой код с крутыми итерациями - они от этого звонко матюкаются, прям как дети малые
1 строчка не получится т.к. нужно подсчитать статусы по отдельности ) нужно по массиву под каждый статус, это 3 строчки, плюс строчка на вывод и подсчет. но можно считать что в 3 строчки уложился )
а чего плохого в итерациях? за что их не любят програмеры? )
итерация это что-то на подобии НЗ - пользуешься им только если нет выбора. вот хочу привести пример когда без итерации не обойтись.... но не нахожу. Ну может раз в пару лет такая необходимость возникает. Другое дело - рекурсия. Вот это наш друг, но тоже если выбора нет. Если ну очень хочется шаловливыми ручками что-то проитерировать ;-) - ну делай это хотя-бы рекусрией, не позорь гильдию. А вообше, лучше всего стараться чтобы решение всегда было одномерным (шаг1,2,3 - готово). ну ифы да свичи всякие - тут ничего не поделаешь, но не сложее чем это. Представь, что через год у тебя будет 500 тестов и тут какой-то програмер потрогает (если не сказать: поФАПает) код и у тебя половина тестов упадут. вот тогда начнется цирк с акробатами и клоунами.
а чтобы этого избежать, у каждого свои примочки. у меня был один знакомый, который каждый раз в таком случае .... увольнялся, благо работу находил потом за 2 недели.
но это как-то не по-ленински, не наш путь. а мы делаем проще. я, например, беру и все базовые действия в нашей системе обволакиваю своим кодом и выношу в отделные классы (т.н ака BasicActions), т.е. про написании теста никакого селенуима и прочих заклинаний не использую. плюс - конфиг классы где сидят все хпаты и прочие зверушки. в тесте остаётся только играть в Лего: выбирай действия и передавай им конфиг элементы. селениум спрятан.
и тут приходит час Х - програмер своими потными похотливыми ручками потрогал код и у меня упало 100700 тестов
я делаю говноморду и за 1-2 часа прочесываю все мои базовые классы плюс кофиг - всегда конечное число (15-20), независимо сколько тестов я налабал. за исключением случаев когда солнцеподобные архитекторы вообще поменяли дизайн или убили какие-то фичи - этого достаточно.
НО! хоть работы и немного - при этом нужно делать вид - типа - "да пошли вы все на..., я вам что - мальчик? какого хрена перелабали все? ща млин сами будете мне все тесты поднимать!"
но это уже политика и к автоматизации отношения не имеет....
кого тошнит от итераций и xpath-ов отвернитесь и не смотрите )))))
Загадка в том что на 4-х IE 8 это работает, а на 2-х нет.
Так , стоп, вы тестируете на 4-ех Експлорерах ?))
угу ) пришлось потестировать в 4-х чтобы понять почему в 2-х фейлится, но нигде в 4-х не репродюсится. В ФФ все ок. Что может быть такого на 2-х ИЕ из-за чего может не находиться элемент? может настройки какие-то?
уже пробовал менять xpath на css и заворачивать findElement в цикл с try {} catch() чтобы несколько раз подряд ловить.
Т.е. 3 колонки: <ссылка с названием чего-либо><ссылка картинка1><ссылка картинка2>
Требуется: зная текст из первого столбца (названия) нажать на вторую ссылку с картинкой = “картинка2” в этой строчке (с таким текстом)
Пишу в Selenium IDE
Прочтя выше понял как в локаторе добраться до ссылке по названию, через xPath: //a[text()=‘XYZ’]
А как продолжить вот и найти ссылки-картинки в рамках этой одной строки tr?
Действительно сегодня попробовал оба варианта и мой старый и твой. Почему то заработало и без кавычек (//a[text()=${var1}]). Хотя вчера не получалось. Может быть я некорректно указал что-то другое в пути xPath.