from allure import step from playwright.sync_api import Page, expect from src.helpers.logger import Logger from src.locators.track_page.performance_section.streams_and_source_tab_locators import \ TrackPagePerformanceStreamsAndSourcesLocators from src.pages.track_page.header.track_page_header import TrackPageHeader from src.ui_elements.base_ui_element import BaseUIElement from src.ui_elements.dropdown_ui_element import DropDownUIElement log = Logger() tab_name = "Streams and Sources Tab - " class TrackPagePerformanceSASTab(TrackPageHeader): def __init__(self, page: Page): super().__init__(page) self.page = page self.dsp_dd = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.DSP_DD, tab_name + 'dsp dd') self.dsp_dd_chosen = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.DSP_DD_CHOSEN, tab_name + 'dsp dd chosen') self.by_source_dd = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.BY_SOURCE_DD, tab_name + 'by source dd') self.by_source_dd_chosen = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.BY_SOURCE_DD_CHOSEN, tab_name + 'by source dd chosen') self.source_dd = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.SOURCE_DD, tab_name + 'source dd') self.tiers_dd = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.TIERS_DD, tab_name + 'tiers dd') self.market_dd = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.MARKET_DD, tab_name + 'market dd') self.dd_apply_button = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.DD_APPLY_BUTTON, tab_name + 'market item') self.region_item = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.REGION_ITEM, tab_name + 'region item') self.graph_type_dd = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.GRAPH_TYPE_DD, tab_name + 'graph type dd chosen') self.graph_type_dd_chosen = DropDownUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.GRAPH_TYPE_DD_CHOSEN, tab_name + 'graph type dd chosen') self.export_dd = BaseUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.EXPORT_DD, tab_name + 'export dd') self.export_as_png = BaseUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.EXPORT_AS_PNG, tab_name + 'export as png button') self.day_count_label = BaseUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.DAY_COUNT_LABEL, tab_name + 'day count label') self.performance_graph = BaseUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.PERFORMANCE_GRAPH, tab_name + 'export as png button') self.legend_totals_by_dsp = BaseUIElement(self.page, TrackPagePerformanceStreamsAndSourcesLocators.LEGEND_BY_DSP_TOTALS, tab_name + 'by dsp legend totals') @step(tab_name + "choose dsp {item}") def choose_dsp(self, item): if self.dsp_dd_chosen.get_text() != item: self.dsp_dd.click() self.dsp_dd._element.get_by_text(item).click() self.verify_chosen_dsp(item) @step(tab_name + "verify chosen dsp {item}") def verify_chosen_dsp(self, item): expect(self.dsp_dd_chosen._element).to_have_text(item) @step(tab_name + "choose by source {item}") def choose_by_source(self, item): if item != self.by_source_dd_chosen.get_text(): self.is_loaded() self.by_source_dd.click() self.by_source_dd._element.get_by_text(item).click() self.verify_by_source(item) @step(tab_name + "choose sources {items}") def choose_sources(self, items): loc = "//*[contains(@id, '{}')]" all_sources = "All Sources" self.is_loaded() self.source_dd.click() self.page.locator(loc.format(all_sources)).click() if self.page.locator(loc.format(all_sources)).get_attribute("data-checked") == "checked": self.page.locator(loc.format(all_sources)).click() for item in items: self.page.locator(loc.format(item)).check() self.dd_apply_button.click() self.verify_sources(items) @step(tab_name + "verify chosen sources {items}") def verify_sources(self, items): if len(items) == 1: expect(self.source_dd._element).to_have_text(items[0]) else: expect(self.source_dd._element).to_have_text(f"{len(items)} Sources") @step(tab_name + "verify by source {item}") def verify_by_source(self, item): expect(self.by_source_dd_chosen._element).to_have_text(item) @step(tab_name + "choose markets {items}") def choose_markets(self, items): self.is_loaded() loc = "//*[contains(@id, '{}')]" all_markets = "All Markets" self.market_dd.click() self.page.locator(loc.format(all_markets)).click() if self.page.locator(loc.format(all_markets)).get_attribute("data-checked") == "checked": self.page.locator(loc.format(all_markets)).click() for item in items: self.page.locator(loc.format(item)).check() self.dd_apply_button.click() self.verify_markets(items) @step(tab_name + "choose region {item}") def choose_region(self, item): self.market_dd.click() self.region_item.get_by(item).click() self.verify_markets([item]) def choose_graph(self, graph): if self.graph_type_dd_chosen.get_text() != graph: self.graph_type_dd.click() self.graph_type_dd._element.get_by_text(text=graph, exact=True).click() expect(self.graph_type_dd_chosen._element).to_have_text(graph) @step(tab_name + "choose line graph") def choose_line_graph(self): graph = "Line Graph" self.choose_graph(graph) @step(tab_name + "choose are graph") def choose_area_graph(self): graph = "Area Graph" self.choose_graph(graph) @step(tab_name + "choose area percentage graph") def choose_percentage_graph(self): graph = "Area Graph, %" self.choose_graph(graph) @step(tab_name + "verify chosen markets {items}") def verify_markets(self, items): if len(items) == 1: expect(self.market_dd._element).to_have_text(items[0]) else: expect(self.market_dd._element).to_have_text(f"{len(items)} Markets") @step(tab_name + "export as png") def download_png(self): self.page.wait_for_load_state('domcontentloaded') self.export_dd.click() with self.page.expect_download() as download_info: self.export_as_png.click() download = download_info.value download.save_as(download.suggested_filename) return download @step(tab_name + "is loaded") def is_loaded(self): self.day_count_label.exists() @step(tab_name + "choose tiers {tiers}") def choose_tiers(self, tiers): loc = "//*[contains(@id, '{}')]" all_tiers = "All Tiers" self.tiers_dd.click() self.page.locator(loc.format(all_tiers)).click() if self.page.locator(loc.format(all_tiers)).get_attribute("data-checked") == "checked": self.page.locator(loc.format(all_tiers)).click() for item in tiers: self.page.locator(loc.format(item)).click() self.dd_apply_button.click() self.verify_tiers(tiers) @step(tab_name + "verify chosen tiers {items}") def verify_tiers(self, items): if len(items) == 1: expect(self.tiers_dd._element).to_have_text(items[0]) else: expect(self.tiers_dd._element).to_have_text(f"{len(items)} Tiers")