Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

wait
python
webdriver
Теги: #<Tag:0x00007f7b655df560> #<Tag:0x00007f7b655df420> #<Tag:0x00007f7b655df2b8>

(Александр Литовский) #1

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


(Alexandr D.) #2

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


(Юрий Аксютин) #3

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


#4

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()

(Александр Литовский) #5
  • Noksa спасибо, попробую

(Александр Литовский) #6

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


(Alexandr D.) #7

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


#8

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

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

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


(Александр Литовский) #9

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


(Александр Литовский) #10

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


(Alexandr D.) #11

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


(Ihor Kokhan) #12

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


(Александр Литовский) #13

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


(Nastya Fox) #14

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


(Anton Tereshko) #15

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

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


(Vatslau) #16

Из джавы но не важно:
опледелите цвет кнопки когда она точно включена
и кликайте
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"};