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_shazam_tab_locators import TopChartsShazamTabLocators 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 TopChartsShazamTab(TopChartsPage): log = Logger() def __init__(self, page: Page): super().__init__(page) self.page = page self.entity_type = 'top-charts?&tab=shazam' self.url = f'/{self.entity_type}' self.header_non_sticky = BaseUIElement(self.page, TopChartsShazamTabLocators.CHARTS_TABLE_HEADER_NON_STICKY, 'Top Charts Page Shazam - header') self.header_sticky = BaseUIElement(self.page, TopChartsShazamTabLocators.CHARTS_TABLE_HEADER_STICKY, 'Top Charts Page Shazam - sticky header') self.subheader_sticky = BaseUIElement(self.page, TopChartsShazamTabLocators.CHARTS_TABLE_SUB_HEADER_STICKY, 'Top Charts Page Shazam - sticky sub header') self.table_positions = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Shazam - table positions') self.period_dd = BaseUIElement(self.page, TopChartsShazamTabLocators.PERIOD_DD, 'Top Charts Page Shazam - period dd') self.market_dd = DropDownUIElement(self.page, TopChartsShazamTabLocators.MARKET_DD, 'Top Charts Page Shazam - market dd') self.market_dd_item = DropDownUIElement(self.page, TopChartsShazamTabLocators.MARKET_DD_ITEM, 'Top Charts Page Shazam - market dd item') self.city_dd = DropDownUIElement(self.page, TopChartsShazamTabLocators.CITY_DD, 'Top Charts Page Shazam - genre dd') self.city_selected = BaseUIElement(self.page, TopChartsShazamTabLocators.CITY_SELECTED, 'Top Charts Page Shazam - table positions') self.back_to_top_button = BaseUIElement(self.page, TopChartsShazamTabLocators.BACK_TO_TOP_BUTTON, 'Top Charts Page Shazam - table positions') self.column_header_position = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_POSITION_HEADER, 'Top Charts Page Shazam - table column header positions') self.column_position_values = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Shazam - table column positions values') self.column_track_values = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_TRACK_VALUES, 'Top Charts Page Shazam - table column track values') self.column_track_header = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_TRACK_HEADER, 'Top Charts Page Shazam - table column track header') self.column_release_date_values = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_RELEASE_DATE_VALUES, 'Top Charts Page Shazam - table column genre values') self.column_release_date_header = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_RELEASE_DATE_HEADER, 'Top Charts Page Shazam - table column genre header') self.column_peak_lifetime_position_values = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_PEAK_LIFETIME_POSITION_VALUES, 'Top Charts Page Shazam - table column peak lifetime position values') self.column_peak_lifetime_position_header = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_PEAK_LIFETIME_POSITION_HEADER, 'Top Charts Page Shazam - table column peak lifetime position header') self.column_peak_lifetime_date_values = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_VALUES, 'Top Charts Page Shazam - table column peak lifetime date values') self.column_peak_lifetime_date_header = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_HEADER, 'Top Charts Page Shazam - table column peak lifetime date header') self.column_on_chart_lifetime_date_values = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_ON_CHART_LIFETIME_DAYS_VALUES, 'Top Charts Page Shazam - table column on chart lifetime date values') self.column_on_chart_lifetime_date_header = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_ON_CHART_LIFETIME_DAYS_HEADER, 'Top Charts Page Shazam - table column on chart lifetime date header') self.column_total_shazams_values = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_TOTAL_SHAZAMS_VALUES, 'Top Charts Page Shazam - table column on chart lifetime date values') self.column_total_shazams_header = BaseUIElement(self.page, TopChartsShazamTabLocators.CELL_TOTAL_SHAZAMS_HEADER, 'Top Charts Page Shazam - table column on chart lifetime date header') @step("Top Charts Page Shazam - 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() city = self.city_selected.get_text() assert_that(text_header).is_equal_to(f"Top 200{period}{market}{city}") assert_that(text_sub_header).is_equal_to("Position#PositionTrendTrackReleaseDatePeak, LifetimePosition # Peak, " "Lifetime Position #DateTotal, LifetimeShazamsOn Chart, LifetimeDays") @step("Top Charts Page Shazam - Tab scroll down") def scroll_down(self): self.table_positions.exists_multiple() self.shazam_tab.click() self.page.keyboard.down('End') @step("Top Charts Page Shazam - 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) # release date self.column_release_date_header.click() values_desc = self.column_release_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_release_date_header.click() values_asc = self.column_release_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() # 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() # lifetime shazams self.column_total_shazams_header.click() values_desc = self.column_total_shazams_values.get_texts_from_list() assert_that(values_desc).is_sorted(key=int, reverse=True) self.column_total_shazams_header.click() values_asc = self.column_total_shazams_values.get_texts_from_list() assert_that(values_asc).is_sorted(key=int) # 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 Shazam - 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 Shazam - 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 Shazam - Tab select {city}") def select_city(self, city): self.column_position_values.exists_multiple() self.city_selected.click() choice = self.page.locator('{0}//*[text()="{1}"]'.format(self.city_dd.locator, city)) choice.click() assert_that(self.city_selected.get_text()).is_equal_to(city)