t.me/atinfo_chat Telegram группа по автоматизации тестирования

If/else в java selenium. Как прервать цикл и красиво его оформить

Теги: #<Tag:0x00007f7499076920> #<Tag:0x00007f7499076808> #<Tag:0x00007f74990766a0>

Всем привет,
столкнулся с такой проблемой. http://joxi.ru/YmEvzLqHwgkkE2

Есть таблица с 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 ?

1 Симпатия
        String myorder = "629/4100/000000104395";
        
        for (WebElement row: driver.findElements(By.cssSelector("table tbody tr"))) {
            if (row.getText().contains(myorder)) {
                row.findElement(By.cssSelector("td:nth-child(17) a img")).click();
                driver.switchTo().alert().accept();
                break;
            }
        }
7 Симпатий

Решение очень крутое! спасибо.
Только к сожалению нажимает всегда на самую первую кнопку. вне зависимости есть ли вообще такой заказ на странице. И после нажатия ошибка - org.openqa.selenium.NoAlertPresentException: no such alert

Вы конечно же содержимое строки майордер меняете? Ведь это и есть первая строка в таблице, если конечно, содержимое таблицы не меняется по сравнению со крином.

Содержимое таблицы меняется. И я вручную меняю myorder. Задумка была в том, что бы сделать отдельные тесты для каждого из ордеров. И сам ордер прыгает от пользователя к пользователю. Соответственно и у каждого из пользователей таблица будет разной и ордер может оказаться в любом месте таблицы

  1. Селекторы для нахождения строк и кнопки даны были ориентировочные, необходимо их проверить.
  2. По поводу

надо ожидать появление алерта и только потом с ним работать.

Вообщем вот xpath первого элемента таблицы с ID.

/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"}

Что очень странно тк когда я использовал ваше решение, кнопка нажималась, значит элемент находился.

Вопросы вам такие: что делает driver.findElements(By.cssSelector("")) ?
Селектор каких элементов должен быть там?

td:nth-child(17)>a>img

driver.findElements(By.cssSelector("")) находит заказ
row.findElement(By.cssSelector("")).click() нажимает кнопку под тем же номером, что и заказ;

findElements в данном случае ищет все строки в таблице. Далее смотрится в каждой строке наличие текста с номером заказа. И если в этой строке есть текст, то в строке ищется элемент кнопки ( td[17]/a/img) и нажимается на неё. По этому проблема может быть только в неправильном локаторе строк. Находите/исправляйте/проверяйте локатор нахождения строк.

Все равно не понимаю в чем проблема. td:nth-child(5) находит все строчки с id по отдельности каждую.


table tbody tr - строка попадает целиком. И нахождений на странице больше 14.

Как тогда правильно то…

Второй (мой) вариант правильный, конечно же.