import os import time from appium.webdriver.common.appiumby import AppiumBy as By from selenium.common.exceptions import TimeoutException from page_objects.base_screen import BaseScreen from helpers.platform.android.locators import ( resource_id_xpath, content_desc_xpath, text_view_xpath) class LoginFlow(BaseScreen): login_button = resource_id_xpath('loginButton') username_input = resource_id_xpath('username') password_input = resource_id_xpath('password') next_button = resource_id_xpath('nextButton') enable_button = '//*[@text="ENABLE"]' done_button = resource_id_xpath('doneButton') news_screen_title = text_view_xpath("What's New?") news_screen_enable_button = '//*[@content-desc="LET\'S GO"]' notifications_enable_button = '//*[@text="ENABLE"]' logout_button = resource_id_xpath('logOutButton') chrome_accept = 'com.android.chrome:id/terms_accept' chrome_negative = 'com.android.chrome:id/negative_button' def __init__(self, driver): self.chrome_login_button = '//android.widget.Button' \ '[@text="LOG IN"]' super().__init__(driver) self.logged_in = False def login(self, context, username, password): if not self.logged_in: # Setting login state to true before login as # we don't want to keep retrying login on login fail self.logged_in = True self.enter_user_details(password, username) self.driver.find_element( By.XPATH, self.chrome_login_button).click() if "sme" not in context.app_name: self.skip_tutorial() self.skip_news_screen() else: self.waiter( 30, By.XPATH, self.notifications_enable_button).click() def enter_user_details(self, password, username): def login_and_enter_username(): self.waiter(60, By.XPATH, self.login_button).click() if bool(os.getenv('CLEAN_BOOT') == 'true') is True: self.accept_chrome_terms() try: self.waiter( 40, By.XPATH, self.username_input).send_keys(username) except TimeoutException: self.waiter(10, By.XPATH, resource_id_xpath( 'com.android.chrome:id/menu_button_wrapper')).click() self.waiter(10, By.XPATH, content_desc_xpath('Refresh')).click() time.sleep(5) page_source = self.driver.page_source print("Current page source:", page_source) current_context = self.driver.current_context print("Current context:", current_context) self.waiter( 40, By.XPATH, self.username_input).send_keys(username) try: login_and_enter_username() except TimeoutException: self.driver.reset() login_and_enter_username() self.waiter(20, By.XPATH, self.password_input).send_keys(password) def skip_tutorial(self): try: for x in range(0, 3): self.waiter(60, By.XPATH, self.next_button).click() self.waiter(10, By.XPATH, self.enable_button).click() self.waiter(10, By.XPATH, self.done_button).click() except TimeoutException: pass def skip_news_screen(self): try: self.waiter(10, By.XPATH, self.news_screen_title) self.waiter(5, By.XPATH, self.news_screen_enable_button).click() except TimeoutException: pass def logout(self, context): def logout_flow(): self.open_profile_screen(context) self.waiter(20, By.XPATH, self.logout_button).click() try: logout_flow() except TimeoutException: logout_flow() self.logged_in = False def accept_chrome_terms(self): self.waiter(30, By.ID, self.chrome_accept).click() self.waiter(30, By.ID, self.chrome_negative).click() def assert_login_button(self): login_btn = self.waiter(60, By.XPATH, self.login_button) assert login_btn