Капибара подождет, пока кнопка не будет включена? - PullRequest
0 голосов
/ 01 июля 2019

Удивлен, я на самом деле не сталкивался с этим, но у меня есть простая кнопка, которая отключена, пока не выбран выпадающий список.Иногда страница не достаточно быстра, чтобы «включить» кнопку, на которую нужно нажать после выбора предыдущего выпадающего меню, что приводит к сбою.

Я мог бы бросить «сон» на секунду или две и исправитьэто, но это похоже на ленивый / плохой способ сделать это.

Есть ли способ в капибаре (или чисто селене), что я могу заставить его ждать, пока кнопка действительно не будет включена?Я хотел бы добавить это метод модели страницы для этой кнопки (так как я пытаюсь избежать специфических для API методов / selenium / etc ... в реальных спецификациях тестирования (хотя я могу, если мне нужно).

FWIW это специально для структуры капибары Руби, но чистый селен тоже подойдет.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Если предположить, что кнопка, на которую вы ссылаетесь, на самом деле является кнопкой (элемент с типом submit, reset, image или button), то Capybaras: селектор кнопки (по умолчанию) будет ждать ее быть не инвалидом.

click_button('Something')

или

find_button('button_id').click

или

find(:button, 'button_value').click

Если какой-либо из методов поиска или действия не ожидает достаточно долго для определенного элемента, вы всегда можете увеличить максимальное время ожидания для конкретного поиска или действия, передав параметр: wait

find(:button, 'Something', wait: 10).click

Если вы не используете типы селекторов (если нет, то почему бы и нет) и вместо этого просто используете необработанный CSS для поиска элемента, то вы можете использовать псевдокласс :enabled вместе с вашим существующим CSS и что-то вроде

find('#my_button:enabled', wait: 10).click

Если элемент, который вы называете кнопкой, на самом деле не кнопка, а элемент другого типа ( и т. Д.), Стилизованный под кнопку, то вам нужно будет объяснить, как именно вы отключаете «кнопка».

1 голос
/ 01 июля 2019

В Python вы можете сделать что-то вроде этого:

def wait_until_clickable(driver, xpath, timeout = 1):
    while timeout > 0:
        try:
            element = driver.find_element_by_xpath(xpath)
            element.click()
            return element

        except:
            time.sleep(0.1)
            timeout = timeout - 0.1

    return False
...