import logging from contextlib import suppress import allure from ui_automation_framework.utils import logger as cl from waiting import TimeoutExpired, ALL from src.helpers.waiting_wrapper import wait from src.locators.tracks_locators import TracksLocators from ui_automation_framework.core.base_page import BasePage from src.ui_elements.button_ui_element import ButtonUIElement from src.ui_elements.input_ui_element import InputUIElement from src.ui_elements.label_ui_element import LabelUIElement from src.ui_elements.list_ui_element import ListUIElement from src.pages.track_view_page import TrackViewPage class TracksPage(BasePage): log = cl.Logger(logging.DEBUG) def __init__(self, driver): super().__init__(driver) self.driver = driver @property def lb_all_tracks(self): return LabelUIElement(self.driver, TracksLocators.ALL_TRACKS_LB, "All Tracks Logo") @property def lb_top_trending_tracks(self): return LabelUIElement(self.driver, TracksLocators.TOP_TRENDING_TRACKS_LB, "Top Trending Tracks tile") @property def lb_tiktok_top_trending_tracks(self): return LabelUIElement(self.driver, TracksLocators.TIKTOK_TOP_TRENDING_TRACKS_LB, "TikTok Top Trending Tracks") @property def lb_most_streamed_tracks(self): return LabelUIElement(self.driver, TracksLocators.MOST_STREAMED_TRACKS_LB, "Most Streamed Tracks Logo") @property def lb_newest_releases_tracks(self): return LabelUIElement(self.driver, TracksLocators.NEWEST_RELEASES_TRACKS_LB, "Newest Releases Tracks Logo") @property def lb_newest_releases_alltime(self): return LabelUIElement(self.driver, TracksLocators.NEWEST_RELEASES_ALLTIME, "Newest Releases ALLTIME Logo") @property def lb_favorite_tracks(self): return LabelUIElement(self.driver, TracksLocators.FAVORITE_TRACKS_LB, "Newest Releases Tracks Logo") @property def bn_tracks_tile_info(self): return ButtonUIElement(self.driver, TracksLocators.BN_TRACKS_INFO, "Info for tracks tile") @property def lb_tiktok_tile_info(self): return LabelUIElement(self.driver, TracksLocators.TIKTOK_INFO, "Info for tracks tile") @property def toggle_bn_all(self): return ButtonUIElement(self.driver, TracksLocators.ALL_TOGGLE_BTN, "ALL toggle button") @property def toggle_bn_spotify(self): return ButtonUIElement(self.driver, TracksLocators.SPOTIFY_TOGGLE_BTN, "SPOTIFY toggle button") @property def toggle_bn_apple(self): return ButtonUIElement(self.driver, TracksLocators.APPLE_TOGGLE_BTN, "APPLE toggle button") @property def toggle_bn_amazon(self): return ButtonUIElement(self.driver, TracksLocators.AMAZON_TOGGLE_BTN, "AMAZON toggle button") @property def list_tracks(self): return ListUIElement(self.driver, all_elements_locator=TracksLocators.TRACKS_LIST, by_position_locator=TracksLocators.TRACKS_LIST_BY_POSITION, by_text_locator=TracksLocators.TRACKS_LIST_BY_TEXT) @allure.step("Switch ALL toggle") def select_all(self): self.toggle_bn_all.click() return self @allure.step("Switch SPOTIFY toggle") def select_spotify(self): self.toggle_bn_spotify.click() return self @allure.step("Switch APPLE toggle") def select_apple(self): self.toggle_bn_apple.click() return self @allure.step("Switch AMAZON toggle") def select_amazon(self): self.toggle_bn_amazon.click() return self @allure.step("View All tracks page is visible") def all_tracks_page_visible(self): with suppress(TimeoutExpired): return wait(ALL([self.lb_all_tracks.is_visible, self.toggle_bn_all.is_visible, self.toggle_bn_spotify.is_visible, self.toggle_bn_apple.is_visible, self.toggle_bn_amazon.is_visible])) return False @allure.step("Top Trending tracks page is visible") def top_trending_tracks_page_visible(self): with suppress(TimeoutExpired): return wait(ALL([self.lb_top_trending_tracks.is_visible, self.toggle_bn_all.is_visible, self.toggle_bn_spotify.is_visible, self.toggle_bn_apple.is_visible, self.toggle_bn_amazon.is_visible])) return False @allure.step("TikTok Top Trending tracks page is visible") def tiktok_top_trending_tracks_page_visible(self): with suppress(TimeoutExpired): return wait(self.lb_tiktok_top_trending_tracks.is_visible) return False @allure.step("Most Streamed tracks page is visible") def most_streamed_tracks_page_visible(self): with suppress(TimeoutExpired): return wait(ALL([self.lb_most_streamed_tracks.is_visible, self.toggle_bn_all.is_visible, self.toggle_bn_spotify.is_visible, self.toggle_bn_apple.is_visible, self.toggle_bn_amazon.is_visible])) return False @allure.step("Favorites tracks page is visible") def favorite_tracks_page_visible(self): with suppress(TimeoutExpired): return wait(self.lb_favorite_tracks.is_visible) return False @allure.step("Newest Releases tracks page is visible") def newest_releases_tracks_page_visible(self): with suppress(TimeoutExpired): return wait(ALL([self.lb_newest_releases_tracks.is_visible, self.lb_newest_releases_alltime.is_visible])) return False @allure.step("Selecting track by position") def select_track_by_position(self, position): self.list_tracks.select_by_position(position) return TrackViewPage(self.driver) @allure.step("Selecting track by name") def select_track_by_name(self, name): self.list_tracks.select_by_text(name) return TrackViewPage(self.driver) def bn_tracks_tile_info_click(self): self.bn_tracks_tile_info.click() return self # TODO: try to find solution for this # @allure.step("Verify TikTok tracks info") # def verify_tiktok_tracks_info(self): # self.wait_for_element_present(TracksLocators.TIKTOK_INFO[1], "class-chain", timeout=60) # name = self.get_attribute_value(TracksLocators.TIKTOK_INFO[1], "class-chain", None, "label") # print(name) # return True # print(self.driver.page_source) # return wait(self.lb_tiktok_tile_info.is_visible)