Из-за чего не нажимается кнопка по методу click() в Selenide?

Ссылка скопирована
1 ответ

Привожу часть кода:

// Модальное окно подтверждение заказа private SelenideElement modalWindow = $(".Order_Modal__YZ-d3"); // Кнопка "Да" в модальном окне подтверждения заказа private SelenideElement yesButtonModalWindow = modalWindow.$(".Order_Buttons__1xGrp").$$(".Button_Button__ra12g").findBy(text("Да"));

Далее в методе теста:

modalWindow.shouldBe(enabled); yesButtonModalWindow.click();

Но кнопка не нажимается
По вводным: также проверял "достать" текст кнопки и он выводится корректно
По вводным: структуру html также прикладываю:

<div class="Order_Modal__YZ-d3"><div class="Order_ModalHeader__3FDaJ">Хотите оформить заказ?<br><div class="Order_Text__2broi">&nbsp;</div></div><div class="Order_Buttons__1xGrp"><button class="Button_Button__ra12g Button_Middle__1CSJM Button_Inverted__3IF-i">Нет</button><button class="Button_Button__ra12g Button_Middle__1CSJM">Да</button></div></div>

По вводным: при этом кнопка меняет оформление, как будто курсор на неё наводится

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Анна SEO Ответ

В Selenide click() может “не нажимать” кнопку даже при видимом hover-эффекте, если элемент найден, но фактически перекрыт, не находится в активном состоянии, модалка ещё анимируется или вы кликаете не тот экземпляр кнопки. Проверка modalWindow.shouldBe(enabled) здесь слабая: модальное окно может быть enabled, но сама кнопка ещё не clickable.

Сначала сделайте локатор проще и проверяйте именно кнопку:

SelenideElement yesButton = $(".Order_Modal__YZ-d3")
    .$$("button")
    .findBy(exactText("Да"));
 
yesButton.shouldBe(visible, enabled).click();

SelenideElement yesButton = $(".Order_Modal__YZ-d3") .$$("button") .findBy(exactText("Да")); yesButton.shouldBe(visible, enabled).click();

Если классы CSS module генерируются, лучше не завязываться на полный набор классов. Ещё лучше — попросить разработчиков добавить стабильные атрибуты:

&lt;button data-testid="confirm-order-yes"&gt;Да&lt;/button&gt;

&lt;button data-testid="confirm-order-yes"&gt;Да&lt;/button&gt;

$("[data-testid='confirm-order-yes']")
    .shouldBe(visible, enabled)
    .click();

$("[data-testid='confirm-order-yes']") .shouldBe(visible, enabled) .click();

Если кнопка меняет оформление как при наведении, но действие не происходит, проверьте, нет ли overlay поверх кнопки. В браузере это часто видно через DevTools. В тесте можно временно проверить так:

Selenide.executeJavaScript(
    "return document.elementFromPoint(arguments[0], arguments[1]).outerHTML",
    yesButton.getLocation().getX() + 5,
    yesButton.getLocation().getY() + 5
);

Selenide.executeJavaScript( "return document.elementFromPoint(arguments[0], arguments[1]).outerHTML", yesButton.getLocation().getX() + 5, yesButton.getLocation().getY() + 5 );

Если возвращается не сама кнопка, значит клик перехватывает другой элемент. Тогда нужно ждать завершения анимации/исчезновения loader-а, а не насильно кликать JavaScript-ом.

Правильный тестовый шаг обычно выглядит так:

modalWindow.shouldBe(visible);
yesButton.shouldBe(visible, enabled).scrollIntoView(true).click();

modalWindow.shouldBe(visible); yesButton.shouldBe(visible, enabled).scrollIntoView(true).click();

JavaScript click я бы использовал только как диагностический костыль:

executeJavaScript("arguments[0].click()", yesButton);

executeJavaScript("arguments[0].click()", yesButton);

Если JS-click работает, а обычный click нет, проблема почти точно в перекрытии, анимации, координатах или состоянии UI. Исправлять лучше ожидания и локаторы, а не оставлять JS-click в стабильных автотестах.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно