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_amazon_tab_locators import TopChartsAmazonTabLocators 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 TopChartsAmazonTab(TopChartsPage): log = Logger() def __init__(self, page: Page): super().__init__(page) self.page = page self.entity_type = 'top-charts?&tab=amazon' self.url = f'/{self.entity_type}' self.header_non_sticky = BaseUIElement(self.page, TopChartsAmazonTabLocators.CHARTS_TABLE_HEADER_NON_STICKY, 'Top Charts Page Amazon - header') self.header_sticky = BaseUIElement(self.page, TopChartsAmazonTabLocators.CHARTS_TABLE_HEADER_STICKY, 'Top Charts Page Amazon - sticky header') self.subheader_sticky = BaseUIElement(self.page, TopChartsAmazonTabLocators.CHARTS_TABLE_SUB_HEADER_STICKY, 'Top Charts Page Amazon - sticky sub header') self.table_positions = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Amazon - table positions') self.period_dd = BaseUIElement(self.page, TopChartsAmazonTabLocators.PERIOD_DD, 'Top Charts Page Amazon - period dd') self.market_dd = DropDownUIElement(self.page, TopChartsAmazonTabLocators.MARKET_DD, 'Top Charts Page Amazon - market dd') self.market_dd_item = DropDownUIElement(self.page, TopChartsAmazonTabLocators.MARKET_DD_ITEM, 'Top Charts Page Amazon - market dd item') self.genre_dd = DropDownUIElement(self.page, TopChartsAmazonTabLocators.GENRE_DD, 'Top Charts Page Amazon - genre dd') self.genre_selected = BaseUIElement(self.page, TopChartsAmazonTabLocators.GENRE_SELECTED, 'Top Charts Page Amazon - table positions') self.back_to_top_button = BaseUIElement(self.page, TopChartsAmazonTabLocators.BACK_TO_TOP_BUTTON, 'Top Charts Page Amazon - table positions') self.column_header_position = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_POSITION_HEADER, 'Top Charts Page Amazon - table column header positions') self.column_position_values = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Amazon - table column positions values') self.column_track_values = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_TRACK_VALUES, 'Top Charts Page Amazon - table column track values') self.column_track_header = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_TRACK_HEADER, 'Top Charts Page Amazon - table column track header') self.column_genre_values = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_GENRE_VALUES, 'Top Charts Page Amazon - table column genre values') self.column_genre_header = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_GENRE_HEADER, 'Top Charts Page Amazon - table column genre header') self.column_peak_lifetime_position_values = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_PEAK_LIFETIME_POSITION_VALUES, 'Top Charts Page Amazon - table column peak lifetime position values') self.column_peak_lifetime_position_header = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_PEAK_LIFETIME_POSITION_HEADER, 'Top Charts Page Amazon - table column peak lifetime position header') self.column_peak_lifetime_date_values = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_VALUES, 'Top Charts Page Amazon - table column peak lifetime date values') self.column_peak_lifetime_date_header = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_HEADER, 'Top Charts Page Amazon - table column peak lifetime date header') self.column_on_chart_lifetime_date_values = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_ON_CHART_LIFETIME_DAYS_VALUES, 'Top Charts Page Amazon - table column on chart lifetime date values') self.column_on_chart_lifetime_date_header = BaseUIElement(self.page, TopChartsAmazonTabLocators.CELL_ON_CHART_LIFETIME_DAYS_HEADER, 'Top Charts Page Amazon - table column on chart lifetime date header') @step("Top Charts Page - Amazon 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() genre = self.genre_selected.get_text() assert_that(text_header).is_equal_to(f"Top tracks{period}{market}{genre}") assert_that(text_sub_header).is_equal_to("Position#PositionTrendTrackGenrePeak, LifetimePosition #Peak, " "Lifetime Position #DateOn Chart, LifetimeDays") @step("Top Charts Page - Amazon Tab scroll down") def scroll_down(self): self.table_positions.exists_multiple() self.amazon_tab.click() self.page.keyboard.down('End') @step("Top Charts Page - Amazon 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) # genre self.column_genre_header.click() values_desc = self.column_genre_values.get_texts_from_list() assert_that(values_desc).is_sorted() self.column_genre_header.click() values_asc = self.column_genre_values.get_texts_from_list() assert_that(values_asc).is_sorted(reverse=True) # peak lifetime position self.column_peak_lifetime_position_header.click() values_desc = self.column_peak_lifetime_position_values.get_texts_from_list() assert_that(values_desc).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(values_asc).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") for v in values_desc] 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") for v in values_asc] 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 - Amazon Tab select date {date}") def select_date(self, date): self.period_dd.input_text(date) self.page.keyboard.press('Enter') expect(self.period_dd._element).to_have_value(date) @step("Top Charts Page - Amazon Tab select {market}") def select_market(self, market): self.market_dd.click() self.market_dd_item.get_by(market).click() @step("Top Charts Page - Amazon Tab select {genre}") def select_genre(self, genre): self.column_position_values.exists_multiple() self.genre_selected.click() choice = self.page.locator('{0}//*[text()="{1}"]'.format(self.genre_dd.locator, genre)) choice.click() assert_that(self.genre_selected.get_text()).is_equal_to(genre)