Поиск элемента в таблице

для меня это самое приятное в работе - как вишенка на вершине большого торта: если разработчики все поломали - пока они с высунутыми языками бегают и пытаются все починить - тестеры могут с честными мордами сидеть на http://automated-testing.info и общаться с красивыми девушками. на возможные вопросы отмазка железная: а чё? ничего не работает. у меня вот - все тесты готовы, но проверять нечего....

 

самое сложное - при этом делать честную морду

 
 

чего так категорично? ) что тут катастрофического? это ж пример просто )

естественно что хпас не оптимальный, просто для примера написан.

если не нужна конкретная строка можно //table[something]//td[2]

если одна таблица то //td[2]

но принципиально смысл не меняется.

))))))))))))))))))))))))))

Кто знает из-за чего ИЕ может не находить элементы через xpath и css? На 4-х ИЕ находятся, на 2-х что-то каждый раз не находится. Что может влиять?

не согласен, 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, если он содержит img то тогда можно попробовать решить ))

Так , стоп, вы тестируете на 4-ех Експлорерах ?))

xpath-ы такие как я приводил ранее (за что меня раскритиковали), ничем не особенные и img не содержащие.

в одном ИЕ выдает "Cannot click on element" на этот запрос:

WebElement link1 = driver.findElement(By.linkText("Data Import Module"));

в другом "Unable to get element text" и "Element is no longer valid" на Element.getText() при запросах после рефреша

driver.findElement(By.name("refresh")).click();

//statusList = driver.findElements(By.xpath("//table[@id='tableModel']/tbody/tr/td[5]/span[1]"));
statusList = driver.findElements(By.cssSelector("table#tableModel tbody tr td:nth-child(5) span:nth-child(1)"));

for (int i = 0; i < statusList.size(); i++) {
               
      WebElement statusElement = statusList.get(i);
                    
      if ( statusElement.getText()

кого тошнит от итераций и xpath-ов отвернитесь и не смотрите )))))

Загадка в том что на 4-х IE 8 это работает, а на 2-х нет.

Так , стоп, вы тестируете на 4-ех Експлорерах ?))

угу ) пришлось потестировать в 4-х чтобы понять почему в 2-х фейлится, но нигде в 4-х не репродюсится. В ФФ все ок. Что может быть такого на 2-х ИЕ из-за чего может не находиться элемент? может настройки какие-то?

уже пробовал менять xpath на css и заворачивать findElement в цикл с try {} catch() чтобы несколько раз подряд ловить.

Подниму темку, потому что похожая задача стоит. Сразу извиняюсь, если вопрос нубский - я только начинающий.
Есть табличка вида:

<tr>
 <td><a>ABC</a></td>
 <td><a><img src="file1.png"></a></td>
 <td><a><img src="file2.png"></a></td>
</tr>
<tr>
 <td><a>XYZ</a></td>
 <td><a><img src="file1.png"></a></td>
 <td><a><img src="file2.png"></a></td>
</tr>
<tr>
 <td><a>QWERTY</a></td>
 <td><a><img src="file1.png"></a></td>
 <td><a><img src="file2.png"></a></td>
</tr>

Т.е. 3 колонки: <ссылка с названием чего-либо><ссылка картинка1><ссылка картинка2>
Требуется: зная текст из первого столбца (названия) нажать на вторую ссылку с картинкой = “картинка2” в этой строчке (с таким текстом)

Пишу в Selenium IDE
Прочтя выше понял как в локаторе добраться до ссылке по названию, через xPath: //a[text()=‘XYZ’]
А как продолжить вот и найти ссылки-картинки в рамках этой одной строки tr?

Сам спросил, сам отвечаю. Если кому интересно - через following-sibling

//a[text()='XYZ']/../following-sibling::td//img[@src='file2.png']

как то так.

Теперь у меня другой вопрос. Как использовать переменную в локаторе при сравнении с функцией text(), а не константу?

т.е. например задаю переменную:

storeEval | "XYZ" | var1

И потом такой вот локатор не находится //a[text()=${var1}]
//a[text()=getEval(${var1})] - тоже не находит.

1 лайк

Этот вариант должен работать, только в xpath нужно использовать кавычки

Вот пример для этой страницы The Internet

<tr>
	<td>store</td>
	<td>Smith</td>
	<td>var1</td>
</tr>
<tr>
	<td>assertElementPresent</td>
	<td>//td[text()='${var1}']</td>
	<td></td>
</tr>

Раз уж добрался в IDE до таблиц поставь пару плагинов с циклами и обработкой . Имхо єкономит кучу времени .

Действительно сегодня попробовал оба варианта и мой старый и твой. Почему то заработало и без кавычек (//a[text()=${var1}]). Хотя вчера не получалось. Может быть я некорректно указал что-то другое в пути xPath.

Спасибо, до них еще не добрался. Обязательно посмотрю!