from allure import step from playwright.sync_api import Page, expect from src.helpers.logger import Logger from src.locators.track_page.performance_section.by_markets_tab_locators import TrackPagePerformanceByMarketsLocators from src.pages.track_page.header.track_page_header import TrackPageHeader from src.ui_elements.dropdown_ui_element import DropDownUIElement log = Logger() tab_name = "By MarketsTab - " class TrackPagePerformanceByMarketsTab(TrackPageHeader): def __init__(self, page: Page): super().__init__(page) self.page = page self.dsp_dd = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.DSP_DD, tab_name + 'dsp dd') self.dsp_dd_chosen = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.DSP_DD_CHOSEN, tab_name + 'dsp dd chosen') self.source_dd = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.SOURCE_DD, tab_name + 'source dd') self.market_dd = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.MARKET_DD, tab_name + 'market dd') self.dd_apply_button = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.DD_APPLY_BUTTON, tab_name + 'market item') self.region_item = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.REGION_ITEM, tab_name + 'region item') self.metric_dd = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.METRIC_DD, tab_name + 'metric dd') self.metric_dd_chosen = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.METRIC_DD_CHOSEN, tab_name + 'metric dd chosen') self.graph_type_dd = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.GRAPH_TYPE_DD, tab_name + 'graph type dd chosen') self.graph_type_dd_chosen = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.GRAPH_TYPE_DD_CHOSEN, tab_name + 'graph type dd chosen') self.day_count_label = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.DAY_COUNT_LABEL, tab_name + 'day count label') self.export_dd = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.EXPORT_DD, tab_name + 'export dd') self.export_as_png = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.EXPORT_AS_PNG, tab_name + 'export as png') self.export_as_csv = DropDownUIElement(self.page, TrackPagePerformanceByMarketsLocators.EXPORT_AS_CSV, tab_name + 'export as csv') @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 + "choose tiktok metric {item}") def choose_metric(self, item): if self.metric_dd_chosen.get_text() != item: self.metric_dd.click() self.metric_dd._element.get_by_text(item).click() self.verify_chosen_metric(item) @step(tab_name + "verify chosen tiktok metric {item}") def verify_chosen_metric(self, item): expect(self.metric_dd_chosen._element).to_contain_text(item) @step(tab_name + "verify chosen dsp {item}") def verify_chosen_dsp(self, item): expect(self.dsp_dd_chosen._element).to_contain_text(item) @step(tab_name + "choose sources {items}") def choose_sources(self, items): loc = "//*[contains(@id, '{}')]" all_sources = "All Sources" 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)).click() 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 + "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_bar_chart(self): graph = "Bar Chart" 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.is_loaded() 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 + "export as csv") def download_csv(self): self.is_loaded() self.page.wait_for_load_state('domcontentloaded') self.export_dd.click() with self.page.expect_download() as download_info: self.export_as_csv.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()