Как дождаться перезагрузки а затем искать элемент?

Приветствую.

Возникла такая проблема.

На сайте есть иконка авторизации, по клику появляется форма авторизации, если юзер не авторизован.
Либо меню пользователя если юзер авторизован. Все по клику на одну кнопку.

Юзер вводит данные, нажимает войти, страница перезагружается и теперь по клику на иконку авторизации он видит меню.

Я пытаюсь сделать login и logout сразу. Но проблема в том, что selenium заполняет поля, отправляет форму и не дожидаясь перезагрузки начинает искать кнопку logout, которая должна появиться только после перезагрузки.

Если ставить sleep(1) между login и logout работает нормально.

Как правильно сделать ожидание перезагрузки страницы?

Вы уверенны что у вас имено перезагрузка полностью? Так как вообще то селениум ждет пока document.readyState == complete. Скорее всего у вас элемент еще не существует для события. Тогда ожидайте через WebDriverWait

1 лайк
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

logout_button = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, "logout_button_xpath")))
logout_button.click()

Попробуйте так ждать видимости кнопки.

А вообще по сценарию как:
Заполнил данные и нажал войти. Перезагрузилась страница.
Кликнул на иконку авторизации.
Кликнул на Logout.

У вас где косяк? Судя по вашим словам [quote=“bitande7, post:1, topic:12384”]
Но проблема в том, что selenium заполняет поля, отправляет форму и не дожидаясь перезагрузки начинает искать кнопку logout
[/quote]

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

1 лайк

сценарий такой.

login
кликнул на иконку авторизации
появилась форма авторизации
заполнил форму
страница перезагружается
пользователь авторизован

logout
кликнул на иконку авторизации
появилось меню с ссылкой на logout
нажал на ссылку Log out
страница перезагружается
пользователь вышел из аккаунта

если в тесте запустить примерно так

page.login()
page.logout()

page.logout() - запускается еще до перезагрузки, так как происходит все очень быстро, соответственно ссылку log out не находит, все валится

А что там внутри?

class Page():

    wd = driver


    def __init__(self):
        pass

    def login(self):
        self.login_icon.click()

        login_email = find('//input[@id="login-email"]')
        login_password = find('//input[@id="login-password"]')

        login_email.clear()
        login_email.send_keys(user + Keys.TAB)
        login_password.clear()
        login_password.send_keys(password + Keys.RETURN)

    def logout(self):
        self.login_icon.click()
        self.logout_link.click()



    #-------------------------------- COMMON LOCATORS (header and footer)-------------------------------------
    @property
    def login_icon(self):
        return find('//ul[@class="header-links"]/li[4]')

    @property
    def logout_link(self):
        return find('//a[contains(@href, "customer/account/logout/")]')

У вас тест где падает? self.login_icon.click() срабатывает?
Как вы проверяете, что пользователь авторизован после перезагрузки страницы?

1 лайк

хм, да, проверку надо добавить.

но проблема не в этом.

как только selenium заполнил форму и нажал “Enter” он тут же начинает выполнять page.logout(), хотя как раз должна запуститься перезагрузка страницы. Он успевает искать элемент до начала перезагрузки.

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

тут нужно как-то задержку поставить, желательно универсальную в отдельном методе.

Можно ждать сначала исчезновения какого-нибудь элемента, например логотипа (то есть происходит обновление страницы), а уже потом снова кликать на иконку авторизации. Написал в личку. Если поможет, то потом сюда вставите.

Чем не подходит ответ выше?

logout_button.click()```

Была похожая проблема, приложение было старое и после клика новая страница загружалась не сразу. Поэтому драйвер не ждал загрузки (ждать-то нечего, еще не началась), тест шел дальше и падал. Тут я думаю помог бы явный Wait после логина на лого/юзера и тд. А потом уже нажимать на логаут. кнопку