import re import random from appium.webdriver.common.appiumby import AppiumBy as By from helpers.platform.android.locators import ( resource_id_xpath, content_desc_xpath, text_view_xpath) from page_objects.base_screen import BaseScreen class ProfileScreen(BaseScreen): my_account_title = text_view_xpath('My Account') profile_detail = resource_id_xpath('profileDetail') settings_title = text_view_xpath('SETTINGS') default_language_btn = content_desc_xpath('Language, English') notifications_btn = content_desc_xpath('Notifications') about_title = text_view_xpath('ABOUT') privacy_policy_btn = content_desc_xpath('Privacy Policy') terms_and_conditions_btn = content_desc_xpath('Terms and Conditions') version = resource_id_xpath('version') url_bar = resource_id_xpath('com.android.chrome:id/url_bar') existing_languages = { "German": "Deutsch , (German)", "English": "English", "Spanish": "Español , (Spanish)", "French": "Français , (French)", "Italian": "Italiano , (Italian)", "Portuguese": "Português , (Portuguese)", "Russian": "Pусский , (Russian)", "Turkish": "Türkçe , (Turkish)", "Japanese": "日本語 , (Japanese)", "Simplified Chinese": "简体中文 , (Simplified Chinese)", "Traditional Chinese": "繁體中文 , (Traditional Chinese)", "Korean": "한국어 , (Korean)" } def verify_expected_labels_and_buttons_present(self): elements_to_check = [ self.default_language_btn, self.settings_title, self.notifications_btn, self.about_title, self.privacy_policy_btn, self.terms_and_conditions_btn ] for xpath in elements_to_check: self.waiter(10, By.XPATH, xpath) assert (self.waiter(3, By.XPATH, self.profile_detail). text.startswith('qa_insights_e2etest+')) # TODO: # The check will be temporarily removed until there is a clear # understanding of how the version display will look in the # master branch of the application. # version = (self.waiter(3, By.XPATH, self.version). # get_attribute('content-desc')) # assert self.check_version_format(version) @staticmethod def _ensure_current_language(context): current = getattr(context, "current_language", None) or 'English' context.current_language = current return current def _open_language_picker(self, context): current_lang = self._ensure_current_language(context) if current_lang == 'English': self.click_with_retry(10, By.XPATH, self.default_language_btn) else: language_entry = self.existing_languages[current_lang] current_lang_loc = language_entry.split(",")[0].strip() full_loc = text_view_xpath(current_lang_loc) self.click_with_retry(10, By.XPATH, full_loc) def select_random_language_different_from_current(self, context): self._open_language_picker(context) choices = [(lang, loc) for lang, loc in self.existing_languages.items() if lang != context.current_language] random_language, loc = random.choice(choices) self.click_with_retry(10, By.ACCESSIBILITY_ID, loc) context.current_language = random_language def select_default_language(self, context): self._open_language_picker(context) default_language = 'English ' # trailing space is mandatory here self.click_with_retry(10, By.ACCESSIBILITY_ID, default_language) context.current_language = default_language.strip() def tap_privacy_policy(self, context): self.waiter(10, By.XPATH, self.privacy_policy_btn).click() def verify_navigation_to_privacy_policy(self, context): assert (self.waiter(10, By.XPATH, self.url_bar).text == 'sonymusic.com/privacy-policy/') self.press_back_button() def tap_terms_and_conditions(self): self.waiter(10, By.XPATH, self.terms_and_conditions_btn).click() def verify_navigation_to_terms_and_conditions(self, context): assert (self.waiter(10, By.XPATH, self.url_bar).text == 'sonymusic.com/terms-and-conditions/') self.press_back_button() def tap_notifications_and_select(self, item): items = { 'labels': 'LabelSettingsTestId', 'artists': 'participantSettingsTestId', 'songs': 'soundRecordingsSettingsTestId' } self.waiter(10, By.XPATH, self.notifications_btn).click() self.waiter(10, By.XPATH, resource_id_xpath(items[item])).click() @staticmethod def check_version_format(version_text): pattern = r'^v?\d+\.\d+\.\d+ \([0-9a-fA-F]+\)$' if re.match(pattern, version_text): return True else: return False