import pydash from allure import step from assertpy import assert_that from playwright.sync_api import Page, expect from src.helpers.logger import Logger from src.locators.top_charts_page.tc_spotify_tab_locators import TopChartsSpotifyTabLocators from src.pages.top_charts_page.top_charts_page import TopChartsPage from src.ui_elements.base_ui_element import BaseUIElement from src.ui_elements.dropdown_ui_element import DropDownUIElement class TopChartsSpotifyTab(TopChartsPage): log = Logger() daily_tab = "daily" weekly_tab = "weekly" def __init__(self, page: Page): super().__init__(page) self.page = page self.entity_type = 'top-charts?&tab=spotify' self.url = f'/{self.entity_type}' self.header_non_sticky = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CHARTS_TABLE_HEADER_NON_STICKY, 'Top Charts Page Spotify - header') self.header_sticky = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CHARTS_TABLE_HEADER_STICKY, 'Top Charts Page Spotify - sticky header') self.subheader_sticky = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CHARTS_TABLE_SUB_HEADER_STICKY, 'Top Charts Page Spotify - sticky sub header') self.table_positions = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Spotify - table positions') self.period_dd_daily = BaseUIElement(self.page, TopChartsSpotifyTabLocators.PERIOD_DD_DAILY, 'Top Charts Page Spotify - period dd daily tab') self.period_dd_weekly = BaseUIElement(self.page, TopChartsSpotifyTabLocators.PERIOD_DD_WEEKLY, 'Top Charts Page Spotify - period dd weekly tab') self.period_dd_selected_weekly = BaseUIElement(self.page, TopChartsSpotifyTabLocators.PERIOD_DD_WEEKLY_SELECTED, 'Top Charts Page Spotify - period dd weekly selected') self.market_dd = DropDownUIElement(self.page, TopChartsSpotifyTabLocators.MARKET_DD, 'Top Charts Page Spotify - market dd') self.market_dd_filter_input = BaseUIElement(self.page, TopChartsSpotifyTabLocators.MARKET_DD_FILTER_INPUT, 'Top Charts Page Spotify - market dd filter input') self.market_dd_list_of_markets = BaseUIElement(self.page, TopChartsSpotifyTabLocators.MARKET_DD_LIST_OF_MARKETS, 'Top Charts Page Spotify - market dd list of markets') self.market_dd_close_icon = BaseUIElement(self.page, TopChartsSpotifyTabLocators.MARKET_DD_CLOSE_ICON, 'Top Charts Page Spotify - market dd close icon') self.market_dd_no_markets_placeholder = BaseUIElement(self.page, TopChartsSpotifyTabLocators.MARKET_DD_NO_MARKETS_PLACEHOLDER, 'Top Charts Page Spotify - market dd no markets placeholder') self.market_dd_item = BaseUIElement(self.page, TopChartsSpotifyTabLocators.MARKET_DD_ITEM, 'Top Charts Page Spotify - market dd item') self.track_owner_filter_dd = BaseUIElement(self.page, TopChartsSpotifyTabLocators.TRACK_OWNER_FILTER_DD, 'Top Charts Page Spotify - track owner filter dd') self.track_owner_sony_checkbox = BaseUIElement(self.page, TopChartsSpotifyTabLocators.TRACK_OWNER_SONY_CHACKBOX, 'Top Charts Page Spotify - track owner filter sony checkbox') self.track_owner_non_sony_checkbox = BaseUIElement(self.page, TopChartsSpotifyTabLocators.TRACK_OWNER_NON_SONY_CHECKBOX, 'Top Charts Page Spotify - track owner filter non sony checkbox') self.track_owner_apply_button = BaseUIElement(self.page, TopChartsSpotifyTabLocators.TRACK_OWNER_APPLY_BUTTON, 'Top Charts Page Spotify - track owner filter apply button') self.filter_input = BaseUIElement(self.page, TopChartsSpotifyTabLocators.FILTER_INPUT, 'Top Charts Page Spotify - filter input') self.daily_sub_tab = BaseUIElement(self.page, TopChartsSpotifyTabLocators.DAILY_SUB_TAB, 'Top Charts Page Spotify - sub tab') self.weekly_sub_tab = BaseUIElement(self.page, TopChartsSpotifyTabLocators.WEEKLY_SUB_TAB, 'Top Charts Page Spotify - sub tab') self.export_button = DropDownUIElement(self.page, TopChartsSpotifyTabLocators.EXPORT_BUTTON, 'Top Charts Page Spotify - export button') self.clock_icon = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CLOCK_ICON, 'Top Charts Page Spotify - clock icon') self.clock_icon_tooltip = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CLOCK_ICON_TOOLTIP, 'Top Charts Page Spotify - clock icon tooltip') self.back_to_top_button = BaseUIElement(self.page, TopChartsSpotifyTabLocators.BACK_TO_TOP_BUTTON, 'Top Charts Page Spotify - table positions') self.column_header_position = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_POSITION_HEADER, 'Top Charts Page Spotify - table column header positions') self.column_position_values = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Spotify - table column positions values') self.column_header_trend = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_POSITION_TREND_HEADER, 'Top Charts Page Spotify - table column header trend') self.column_trend_values = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_POSITION_TREND_VALUES, 'Top Charts Page Spotify - table column trend values') self.column_track_values = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_TRACK_VALUES, 'Top Charts Page Spotify - table column track values') self.column_track_header = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_TRACK_HEADER, 'Top Charts Page Spotify - table column track header') self.column_streams_values = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_STREAMS_VALUES, 'Top Charts Page Spotify - table column streams values') self.column_streams_header = BaseUIElement(self.page, TopChartsSpotifyTabLocators.CELL_STREAMS_HEADER, 'Top Charts Page Spotify - table column streams header') self.table_no_results = BaseUIElement(self.page, TopChartsSpotifyTabLocators.NO_RESULTS, 'Top Charts Page Spotify - table no results') self.spotify_no_results_for_market = BaseUIElement(self.page, TopChartsSpotifyTabLocators.SPOTIFY_TOP_200_CHART_FOR_MARKET_NOT_EXISTS, 'Top Charts Page Spotify - not exists for market') self.entry_tooltip = BaseUIElement(self.page, TopChartsSpotifyTabLocators.ENTRY_REENTRY_TOOLTIP, 'Top Charts Page Spotify - entry tooltip') @step("Top Charts Page Spotify - Tab {tab} verify sticky header for {tab}") def verify_sticky_header(self, tab): text_header = self.header_sticky.get_text() text_sub_header = self.subheader_sticky.get_text() if tab.lower() == "daily": period = self.period_dd_daily.get_attribute("value") else: period = self.period_dd_selected_weekly.get_text() market = self.market_dd.get_text() assert_that(text_header).is_equal_to(f"Top 200{tab}{period}{market}") assert_that(text_sub_header).is_equal_to("#TrendNameTrackStreams") @step("Top Charts Page Spotify - Tab scroll down") def scroll_down(self): self.table_positions.exists_multiple() self.spotify_tab.click() self.page.keyboard.down('End') @step("Top Charts Page Spotify - Tab verify table sorting") def verify_table_sorting(self): # position self.column_header_position.click() values_desc = self.column_position_values.get_texts_from_list() assert_that(values_desc).is_sorted(key=int, reverse=True) self.column_header_position.click() values_asc = self.column_position_values.get_texts_from_list() assert_that(values_asc).is_sorted(key=int) # track self.column_track_header.click() values_desc_table = self.column_track_values.get_texts_from_list() values_desc = values_desc_table values_desc = pydash.sort(values_desc, reverse=True) assert_that(values_desc).is_equal_to(values_desc_table) self.column_track_header.click() values_asc_table = self.column_track_values.get_texts_from_list() values_asc = values_asc_table values_asc = pydash.sort(values_asc) assert_that(values_asc).is_equal_to(values_asc_table) # streams self.column_streams_header.click() values_desc = self.column_streams_values.get_texts_from_list() assert_that([v.replace(",", "") for v in values_desc]).is_sorted(key=int, reverse=True) self.column_streams_header.click() values_asc = self.column_streams_values.get_texts_from_list() assert_that([v.replace(",", "") for v in values_asc]).is_sorted(key=int) @step("Top Charts Page Spotify - Tab select date {date} on tab {tab}") def select_date(self, date, tab): self.is_loaded() if tab.lower() == "daily": self.period_dd_daily.input_text(date) self.page.keyboard.press('Enter') expect(self.period_dd_daily._element).to_have_value(date) else: self.period_dd_weekly.click() self.page.get_by_text(date).click() expect(self.period_dd_selected_weekly._element).to_have_text(date) @step("Top Charts Page Spotify - Tab select {market}") def select_market(self, market): self.column_position_values.exists_multiple() self.market_dd.click() self.market_dd_item.get_by(market).click() @step("Top Charts Page Spotify - switch sub tab {sub_tab}") def switch_sub_tab(self, sub_tab, wait_to_load=True): if wait_to_load: self.is_loaded() if sub_tab.lower() == "daily": self.daily_sub_tab.click() if wait_to_load: self.is_loaded() self.daily_sub_tab.is_selected() else: self.weekly_sub_tab.click() if wait_to_load: self.is_loaded() self.weekly_sub_tab.is_selected() if wait_to_load: self.is_loaded() @step("Top Charts Page Spotify - tab is loaded") def is_loaded(self): self.column_position_values.exists_multiple()