Есть таблица с id заявки, есть кнопка. Мне нужно выбрать только одну, id которой я знаю заранее. Получается что-то вроде
String myorder = "629/4100/000000104395";
Кнопка находится напротив нужного мне поля. Вот мой вариант решения
if(myorder.equalsIgnoreCase(driver.findElement(By.xpath("/html/body/table/tbody/tr[1]/td[2]/div[2]/div/div[2]/div[2]/div/div/div/div[1]/div[1]/table/tbody/tr/td[5]\n)){
driver.findElement(By.xpath("/html/body/table/tbody/tr[1]/td[2]/div[2]/div/div[2]/div[2]/div/div/div/div[1]/div[1]/table/tbody/tr/td[17]/a/img\n")).click();
driver.switchTo().alert().accept();
}
else if (myorder.equalsIgnoreCase(driver.findElement(By.xpath("/html/body/table/tbody/tr[1]/td[2]/div[2]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/table/tbody/tr/td[5]\n")).getText())){
driver.findElement(By.xpath("/html/body/table/tbody/tr[1]/td[2]/div[2]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/table/tbody/tr/td[17]/a/img\n")).click();
driver.switchTo().alert().accept();
(в xpath’е меняется только одна цифра, как для кнопки, так и для таблицы)
Ну и так далее. Полей может быть до 25, соответственно я так расписал 25 раз.
Изначально все xpath’ы полей были расставлены по переменным, но так падала ошибка nosuchelementexception, когда полей было например 5, а в цикле перечисляются 25 и ошибка падала на 6.
Проблема в том что когда нужное поле находится, кнопка нажимается, открывается новая страница, но цикл продолжается. И соответственно падает ошибка.
И тут у меня два вопроса. Как воткнуть сюда break; и есть ли возможность сделать это как-то симпатичнее, а не 25 раз if/else ?
Решение очень крутое! спасибо.
Только к сожалению нажимает всегда на самую первую кнопку. вне зависимости есть ли вообще такой заказ на странице. И после нажатия ошибка - org.openqa.selenium.NoAlertPresentException: no such alert
Вы конечно же содержимое строки майордер меняете? Ведь это и есть первая строка в таблице, если конечно, содержимое таблицы не меняется по сравнению со крином.
Содержимое таблицы меняется. И я вручную меняю myorder. Задумка была в том, что бы сделать отдельные тесты для каждого из ордеров. И сам ордер прыгает от пользователя к пользователю. Соответственно и у каждого из пользователей таблица будет разной и ордер может оказаться в любом месте таблицы
/html/body/table/tbody/tr[1]/td[2]/div[2]/div/div[2]/div[2]/div/div/div/div[1]/div[1!!Увеличивается на 1 до 25!!]/table/tbody/tr/td[5]
Вот xpath кнопки
/html/body/table/tbody/tr[1]/td[2]/div[2]/div/div[2]/div[2]/div/div/div/div/div[1!!Увеличивается на 1 до 25!!]/table/tbody/tr/td[17]/a/img
Решение с nth-child очень крутое и выглядит реально рабочим.
Я попробовал сделать так
for (WebElement row : driver.findElements(By.cssSelector("td:nth-child(5)"))) {
if (row.getText().contains(myorder)) {
row.findElement(By.cssSelector("td:nth-child(17) a img")).click();
driver.switchTo().alert().accept();
break;
}
}
Но в таком случае он ругается на кнопку org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"td:nth-child(17) a img"}
Что очень странно тк когда я использовал ваше решение, кнопка нажималась, значит элемент находился.
findElements в данном случае ищет все строки в таблице. Далее смотрится в каждой строке наличие текста с номером заказа. И если в этой строке есть текст, то в строке ищется элемент кнопки ( td[17]/a/img) и нажимается на неё. По этому проблема может быть только в неправильном локаторе строк. Находите/исправляйте/проверяйте локатор нахождения строк.