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_trending_tab_locators import TopChartsTrendingTabLocators 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 TopChartsTrendingTab(TopChartsPage): log = Logger() def __init__(self, page: Page): super().__init__(page) self.page = page self.entity_type = 'top-charts?&tab=youtube' self.url = f'/{self.entity_type}' self.header_non_sticky = BaseUIElement(self.page, TopChartsTrendingTabLocators.CHARTS_TABLE_HEADER_NON_STICKY, 'Top Charts Page Youtube Trending - header') self.header_sticky = BaseUIElement(self.page, TopChartsTrendingTabLocators.CHARTS_TABLE_HEADER_STICKY, 'Top Charts Page Youtube Trending - sticky header') self.subheader_sticky = BaseUIElement(self.page, TopChartsTrendingTabLocators.CHARTS_TABLE_SUB_HEADER_STICKY, 'Top Charts Page Youtube Trending - sticky sub header') self.table_positions = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Youtube Trending - table positions') self.period_dd = BaseUIElement(self.page, TopChartsTrendingTabLocators.PERIOD_DD, 'Top Charts Page Youtube Trending - period dd') self.market_dd = DropDownUIElement(self.page, TopChartsTrendingTabLocators.MARKET_DD, 'Top Charts Page Youtube Trending - market dd') self.market_dd_item = DropDownUIElement(self.page, TopChartsTrendingTabLocators.MARKET_DD_ITEM, 'Top Charts Page Youtube Trending - market dd item') self.back_to_top_button = BaseUIElement(self.page, TopChartsTrendingTabLocators.BACK_TO_TOP_BUTTON, 'Top Charts Page Youtube Trending - table positions') self.column_header_position = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_POSITION_HEADER, 'Top Charts Page Youtube Trending - table column header positions') self.column_position_values = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_POSITION_VALUES, 'Top Charts Page Youtube Trending - table column positions values') self.column_track_values = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_TRACK_VALUES, 'Top Charts Page Youtube Trending - table column track values') self.column_track_header = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_TRACK_HEADER, 'Top Charts Page Youtube Trending - table column track header') self.column_release_date_values = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_RELEASE_DATE_VALUES, 'Top Charts Page Youtube Trending - table column genre values') self.column_release_date_header = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_RELEASE_DATE_HEADER, 'Top Charts Page Youtube Trending - table column genre header') self.column_peak_lifetime_position_values = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_PEAK_LIFETIME_POSITION_VALUES, 'Top Charts Page Youtube Trending - table column peak lifetime position values') self.column_peak_lifetime_position_header = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_PEAK_LIFETIME_POSITION_HEADER, 'Top Charts Page Youtube Trending - table column peak lifetime position header') self.column_peak_lifetime_date_values = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_VALUES, 'Top Charts Page Youtube Trending - table column peak lifetime date values') self.column_peak_lifetime_date_header = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_PEAK_LIFETIME_POSITION_DATE_HEADER, 'Top Charts Page Youtube Trending - table column peak lifetime date header') self.column_on_chart_lifetime_date_values = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_ON_CHART_LIFETIME_DAYS_VALUES, 'Top Charts Page Youtube Trending - table column on chart lifetime date values') self.column_on_chart_lifetime_date_header = BaseUIElement(self.page, TopChartsTrendingTabLocators.CELL_ON_CHART_LIFETIME_DAYS_HEADER, 'Top Charts Page Youtube Trending - table column on chart lifetime date header') @step("Top Charts Page Youtube Trending - 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"Trending Music Videos{period}{market}") assert_that(text_sub_header).is_equal_to("Position#PositionTrendTitlePeak, LifetimePosition #Peak, " "Lifetime Position #DateOn Chart, LifetimeDays") @step("Top Charts Page Youtube Trending - Tab scroll down") def scroll_down(self): self.table_positions.exists_multiple() self.trending_tab.click() self.page.keyboard.down('End') @step("Top Charts Page Youtube Trending - 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() # 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 Youtube Trending - 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 Youtube Trending - 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()