Как нажать на кнопку ? (Вопрос про ожидание)

Добрый день. Такая проблема. Есть сайт, я логинюсь. После чего происходит загрузка.
Есть некоторая кнопка, которая видна, но серая (задисейблена), пока не прогрузится (5-7 скеунд). Мне необходимо нажать на эту кнопку.
Делаю неявное ожидание- кнопка есть, она наживается, но следующее окно не открывается и тесты падают
Явное ожидание тоже пробовал, то же самое . Кнопка есть, она видима и нажимается. Приходиться делать sleep. Как можно обойти проблему? Самому писать свой wait, если окно после кнопки не появилось?
#selenium + #programming:python

Ждите, пока кнопка будет Enabled.

Кнопка может стать Enabled или при наступлении определенного события, может поменяться css кнопки(смотря как сделали разработчики). Проверьте, что происходит с кнопкой у вас реально

import

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

ожидание пока элемент станет clickable

element = WebDriverWait(self.driver, self.timeout).until(
                EC.element_to_be_clickable(locator))

а потом уже

element.click()
  • Noksa спасибо, попробую

После такого кода кнопка нажимается и тесты падают, так как ничего не происходит далее

В какой момент кнопка нажимается?
Значит вам надо ждать какое-то условие, при котором нажатие на кнопку вызовет дальнейшие действия.

можно поиграться и посмотреть какие атрибуты у кнопки есть вообще.

size = WebDriverWait(self.driver, self.timeout).until(
            EC.presence_of_element_located(locator)).size

для одного из частных случаев я использовал size, вам нужно найти свой. или еще какие то варианты. сложно абстрактно говорить о ситуации.

1 лайк

Форма загрузилась, кнопка задисейблена и я вижу, что она нажата визуально. И тесты падают, так как результата нажатия кнопки нет, следующее окно не открылось.
Попробую как вы сказали поиграть с Enabled и есть еще один половой признак того, что данные загрузились, попробую тут проверку сделать.

Этот вариант тоже рассматривал, но зацепок нет. Спасибо за советы, ушел думать

Конечно в таком случае тесты будут падать. Кликнуть по задизейбленной кнопке ничего не мешает, только это бессмысленно :slight_smile:

Попробуй еще (IJavaScriptExecutor)Driver.ExecuteScript(“arguments[0].click()”, element);
Мне иногда помогает, особенно если кнопка on-hover например

isEnabled не помог, вовращает true, (IJavaScriptExecutor)Driver.ExecuteScript(“arguments[0].click()”, element); тоже не помогло.
А вот кнопка задисейбленная отличается от кнопки, когда с ней можно работать, Yurij_Aksyutin спасибо за подсказку.
Всем еще раз спасибо за советы!

Можна попробовать
ActionChains(self.browser).move_to_element(menu)
hover.perform()
подождать пока в кнопке не будет аттрибута (enabled or hovered) и только тогда кликать

так ты посмотри свойства кнопки. Что меняется, когда она становится доступна для нажатия?

И вообще странно, у меня в проекте обычно используется dismissAlertSuccess().waitForVisible(5) и потом уже клик.
то есть в течении 5 секунд если кнопка не раздисейблится, то тест падает

Из джавы но не важно:
опледелите цвет кнопки когда она точно включена
и кликайте
PS проперти смотреть F12 ->компутед стайлс

 startWorkflowBtn.shouldBe(visible)
                .hover()
                .shouldHave(cssValue(ENABLED_BTN[0], ENABLED_BTN[1]))
                .click();
    public static final String[] ENABLED_BTN =
            {"outline-color", "rgb(51, 51, 51)", "Color if button is enabled"};

Посмотри что происходит с атрибутами кнопки в момент пока она неактивна, обычно есть что-то по типу disabled=disabled, этот атрибут пропадает когда кнопка становится active. В RobotFramework для этого есть wait_until_element_is_enabled, в твоем случае наверное придется писать кастомный вейтер ожидающий пока пропадет нужный атрибут.