import datetime 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_apple_tab_locators import TopChartsAppleTabLocators 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 TopChartsAppleTab(TopChartsPage): log = Logger() def __init__(self, page: Page): super().__init__(page) self.page = page self.entity_type = 'top-charts?&tab=apple' self.url = f'/{self.entity_type}' self.header_non_sticky = BaseUIElement(self.page, TopChartsAppleTabLocators.CHARTS_TABLE_HEADER_NON_STICKY, 'Top Charts Page Apple - header') self.header_sticky = BaseUIElement(self.page, TopChartsAppleTabLocators.CHARTS_TABLE_HEADER_STICKY, 'Top Charts Page Apple - sticky header') self.subheader_sticky = BaseUIElement(self.page, TopChartsAppleTabLocators.CHARTS_TABLE_SUB_HEADER_STICKY, 'Top Charts Page Apple - sticky sub header') self.table_positions = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Apple - table positions') self.period_dd = BaseUIElement(self.page, TopChartsAppleTabLocators.PERIOD_DD, 'Top Charts Page Apple - period dd') self.info_icon = BaseUIElement(self.page, TopChartsAppleTabLocators.I_ICON, 'Top Charts Page Apple - info icon') self.market_dd = DropDownUIElement(self.page, TopChartsAppleTabLocators.MARKET_DD, 'Top Charts Page Apple - market dd') self.market_dd_filter_input = BaseUIElement(self.page, TopChartsAppleTabLocators.MARKET_DD_FILTER_INPUT, 'Top Charts Page Apple - market dd filter input') self.market_dd_list_of_markets = BaseUIElement(self.page, TopChartsAppleTabLocators.MARKET_DD_LIST_OF_MARKETS, 'Top Charts Page Apple - market dd list of markets') self.market_dd_close_icon = BaseUIElement(self.page, TopChartsAppleTabLocators.MARKET_DD_CLOSE_ICON, 'Top Charts Page Apple - market dd close icon') self.market_dd_no_markets_placeholder = BaseUIElement(self.page, TopChartsAppleTabLocators.MARKET_DD_NO_MARKETS_PLACEHOLDER, 'Top Charts Page Apple - market dd no markets placeholder') self.market_dd_item = BaseUIElement(self.page, TopChartsAppleTabLocators.MARKET_DD_ITEM, 'Top Charts Page Apple - market dd item') self.export_button = DropDownUIElement(self.page, TopChartsAppleTabLocators.EXPORT_BUTTON, 'Top Charts Page Apple - export button') self.back_to_top_button = BaseUIElement(self.page, TopChartsAppleTabLocators.BACK_TO_TOP_BUTTON, 'Top Charts Page Apple - table positions') self.column_header_position = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_POSITION_HEADER, 'Top Charts Page Apple - table column header positions') self.column_position_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Apple - table column positions values') self.column_track_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_TRACK_VALUES, 'Top Charts Page Apple - table column track values') self.column_track_header = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_TRACK_HEADER, 'Top Charts Page Apple - table column track header') self.column_release_date_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_RELEASE_DATE_VALUES, 'Top Charts Page Apple - table column genre values') self.column_release_date_header = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_RELEASE_DATE_HEADER, 'Top Charts Page Apple - table column genre header') self.column_peak_lifetime_position_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_PEAK_LIFETIME_POSITION_VALUES, 'Top Charts Page Apple - table column peak lifetime position values') self.column_peak_lifetime_position_header = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_PEAK_LIFETIME_POSITION_HEADER, 'Top Charts Page Apple - table column peak lifetime position header') self.column_peak_lifetime_date_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_VALUES, 'Top Charts Page Apple - table column peak lifetime date values') self.column_peak_lifetime_date_header = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_HEADER, 'Top Charts Page Apple - table column peak lifetime date header') self.column_entry_position_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_ENTRY_POSITION_VALUES, 'Top Charts Page Apple - table column entry position values') self.column_entry_position_header = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_ENTRY_POSITION_HEADER, 'Top Charts Page Apple - table column entry position header') self.column_entry_position_date_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_ENTRY_POSITION_DATE_VALUES, 'Top Charts Page Apple - table column entry position date values') self.column_entry_position_date_header = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_ENTRY_POSITION_DATE_HEADER, 'Top Charts Page Apple - table column entry position date header') self.column_on_chart_lifetime_date_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_ON_CHART_LIFETIME_DAYS_VALUES, 'Top Charts Page Apple - table column on chart lifetime date values') self.column_on_chart_lifetime_date_header = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_ON_CHART_LIFETIME_DAYS_HEADER, 'Top Charts Page Apple - table column on chart lifetime date header') self.column_header_trend = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_POSITION_TREND_HEADER, 'Top Charts Page Apple - table column header trend') self.column_trend_values = BaseUIElement(self.page, TopChartsAppleTabLocators.CELL_POSITION_TREND_VALUES, 'Top Charts Page Apple - table column trend values') self.filter_input = BaseUIElement(self.page, TopChartsAppleTabLocators.FILTER_INPUT, 'Top Charts Page Apple - filter input') self.table_no_results = BaseUIElement(self.page, TopChartsAppleTabLocators.NO_RESULTS, 'Top Charts Page Apple - table no results') self.entry_tooltip = BaseUIElement(self.page, TopChartsAppleTabLocators.ENTRY_REENTRY_TOOLTIP, 'Top Charts Page Apple - entry tooltip') @step("Top Charts Page Apple - Tab verify sticky header") def verify_sticky_header(self): text_header = self.header_sticky.get_text() text_sub_header = self.subheader_sticky.get_text() period = self.period_dd.get_attribute("value") market = self.market_dd.get_text() assert_that(text_header).is_equal_to(f"Top 100{period}{market}") assert_that(text_sub_header).is_equal_to("Position#PositionTrendTrackPeak, LifetimePosition #" "Peak Lifetime Position #DateEntryPosition #Entry Position #" "DateOn Chart, LifetimeDays") @step("Top Charts Page Apple - Tab scroll down") def scroll_down(self): self.table_positions.exists_multiple() self.apple_tab.click() self.page.keyboard.down('End') @step("Top Charts Page Apple - 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) # peak lifetime position self.column_peak_lifetime_position_header.click() values_desc = self.column_peak_lifetime_position_values.get_texts_from_list() assert_that([v for v in values_desc if v != 'N/A']).is_sorted(key=int) self.column_peak_lifetime_position_header.click() values_asc = self.column_peak_lifetime_position_values.get_texts_from_list() assert_that([v for v in values_asc if v != 'N/A']).is_sorted(key=int, reverse=True) # peak lifetime position date self.column_peak_lifetime_date_header.click() values_desc = self.column_peak_lifetime_date_values.get_texts_from_list() values_desc = [datetime.datetime.strptime(v, "%m/%d/%y").date() for v in values_desc if v != 'N/A'][:4] assert_that(values_desc).is_sorted(reverse=True) self.column_peak_lifetime_date_header.click() values_asc = self.column_peak_lifetime_date_values.get_texts_from_list() values_asc = [datetime.datetime.strptime(v, "%m/%d/%y").date() for v in values_asc if v != 'N/A'][:4] assert_that(values_asc).is_sorted() # entry position self.column_entry_position_header.click() values_desc = self.column_entry_position_values.get_texts_from_list() assert_that([v for v in values_desc if v != 'N/A']).is_sorted(key=int) self.column_entry_position_header.click() values_asc = self.column_entry_position_values.get_texts_from_list() assert_that([v for v in values_asc if v != 'N/A']).is_sorted(key=int, reverse=True) # entry position date self.column_entry_position_date_header.click() values_desc = self.column_entry_position_date_values.get_texts_from_list() values_desc = [datetime.datetime.strptime(v, "%m/%d/%y").date() for v in values_desc if v != 'N/A'][:4] assert_that(values_desc).is_sorted(reverse=True) self.column_entry_position_date_header.click() values_asc = self.column_entry_position_date_values.get_texts_from_list() values_asc = [datetime.datetime.strptime(v, "%m/%d/%y").date() for v in values_asc if v != 'N/A'][:4] assert_that(values_asc).is_sorted() # on chart lifetime days self.column_on_chart_lifetime_date_header.click() values_desc = self.column_on_chart_lifetime_date_values.get_texts_from_list() assert_that(values_desc).is_sorted(key=int, reverse=True) self.column_on_chart_lifetime_date_header.click() values_asc = self.column_on_chart_lifetime_date_values.get_texts_from_list() assert_that(values_asc).is_sorted(key=int) @step("Top Charts Page Apple - Tab select {date}") def select_date(self, date): self.column_position_values.exists_multiple() self.period_dd.input_text(date) self.page.keyboard.press('Enter') expect(self.period_dd._element).to_have_value(date) @step("Top Charts Page Apple - 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 Apple - tab is loaded") def is_loaded(self): self.column_position_values.exists_multiple()