import logging import allure from appium.webdriver.common.mobileby import MobileBy from appium.webdriver.common.touch_action import TouchAction from ui_automation_framework.utils import logger as cl from app.src.helpers.waiting_wrapper import wait from app.src.pages.track_page import TrackPage from app.src.ui_elements.button_ui_element import ButtonUIElement from app.src.ui_elements.input_ui_element import InputUIElement from app.src.ui_elements.label_ui_element import LabelUIElement from app.src.ui_elements.list_ui_element import ListUIElement class StreamsByMarketsPage(TrackPage): log = cl.Logger(logging.DEBUG) def __init__(self, driver, api_client): super().__init__(driver, api_client) self.driver = driver self.streams_by_markets_locators = self.get_page_locators("StreamsByMarkets", "streams_by_markets_elements.json") @property def bn_all_markets_card(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "all_markets_card")) @property def bn_clear(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "clear_button")) @property def bn_date_range_picker(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_range_picker")) @property def bn_date_picker_1_year(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_picker_1_year")) @property def bn_combined_streams_i_icon(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "combined_streams_i_icon")) @property def bn_date_picker_2_weeks(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_picker_2_weeks")) @property def bn_date_picker_4_weeks(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_picker_4_weeks")) @property def bn_date_picker_8_weeks(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_picker_8_weeks")) @property def bn_date_picker_12_weeks(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_picker_12_weeks")) @property def bn_date_picker_26_weeks(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_picker_26_weeks")) @property def bn_graph_detailed(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "graph_detailed_btn")) @property def bn_close_detailed_view(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "close_detailed_view_btn")) @property def lb_detailed_graph_info(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "detailed_graph_info")) @property def lb_streams_by_markets_title(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "streams_by_markets_title")) @property def lb_top_5_markets(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "top_5_markets_tab")) @property def lb_streams_markets(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "streams_markets")) @property def lb_combined_streams_i_title(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "combined_streams_i_title")) @property def lb_date_picker_title(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "date_picker_title")) @property def lb_market_card(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "market_card")) @property def bn_all_markets_tab(self): return ButtonUIElement(self.driver, self.locator(self.streams_by_markets_locators, "all_markets_tab")) @property def lb_combined_graph_title(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "combined_streams_graph_title")) @property def in_search(self): return InputUIElement(self.driver, self.locator(self.streams_by_markets_locators, "search_field")) @property def lb_no_streams_in_period(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "no_streams_in_period")) @property def lb_combined_streams_card_data(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "combined_streams_card_data")) @property def lt_top_markets(self): return ListUIElement( self.driver, all_elements_locator=( MobileBy.IOS_CLASS_CHAIN, self.locator(self.streams_by_markets_locators, "top_markets")[0], ), ) @property def lt_top_5_markets(self): return ListUIElement( self.driver, all_elements_locator=( MobileBy.IOS_CLASS_CHAIN, self.locator(self.streams_by_markets_locators, "top_5_markets")[0], ), ) @property def lt_all_markets(self): return ListUIElement( self.driver, all_elements_locator=( MobileBy.IOS_CLASS_CHAIN, self.locator(self.streams_by_markets_locators, "all_markets")[0], ), ) @property def lb_i_popup(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "i_popup")) @property def lb_combined_streams_card(self): return LabelUIElement(self.driver, self.locator(self.streams_by_markets_locators, "combined_streams_card")) @allure.step("Clicking all markets tab") def open_all_markets_tab(self): self.bn_all_markets_tab.click() return self @allure.step("Opening market detailed view") def click_all_markets_card(self): self.wait_for_element_visible(*self.locator(self.streams_by_markets_locators, "all_markets_card")) self.click_element(*self.locator(self.streams_by_markets_locators, "all_markets_card")) return self @allure.step("Searching for market") def search_for_market(self, query): self.in_search.send_text(query) self.close_keyboard_by_swipe() return self @allure.step("Clearing the search field") def clear_search_field(self): self.click_element(*self.locator(self.streams_by_markets_locators, "clear_button")) self.close_keyboard_by_swipe() return self @allure.step("Tap on streams graph for detailed info") def tap_graph_for_detailed_info(self): size = self.driver.get_window_size() actions = TouchAction(self.driver) actions.press(x=size["width"] / 2, y=size["height"] / 1.8).wait(6000) actions.move_to(x=size["width"] / 2, y=size["height"] / 4).wait(6000) actions.perform() return self @allure.step("Clicking top markets card") def click_top_market(self, position): self.lt_top_markets.elements[position - 1].click() return self @allure.step("Opening date selector") def open_date_picker(self): self.bn_date_range_picker.click() return self @allure.step("Selecting 1 year date range") def select_1_year_date_filter(self): self.bn_date_picker_1_year.click() self.bn_date_picker_done.click() return self @allure.step("Clicking i-icon for combined streams") def open_combined_graph_i_popup(self): self.bn_combined_streams_i_icon.click() return self @allure.step("Selecting 2 weeks date range") def select_2_weeks_date_filter(self): self.bn_date_picker_2_weeks.click() self.bn_date_picker_done.click() return self @allure.step("Selecting 4 weeks date range") def select_4_weeks_date_filter(self): self.bn_date_picker_4_weeks.click() self.bn_date_picker_done.click() return self @allure.step("Selecting 8 weeks date range") def select_8_weeks_date_filter(self): self.bn_date_picker_8_weeks.click() self.bn_date_picker_done.click() return self @allure.step("Selecting 12 weeks date range") def select_12_weeks_date_filter(self): self.bn_date_picker_12_weeks.click() self.bn_date_picker_done.click() return self @allure.step("Selecting 26 weeks date rage") def select_26_weeks_date_filter(self): self.bn_date_picker_26_weeks.click() self.bn_date_picker_done.click() return self @allure.step("Opening detailed view for combined graph") def open_combined_graph_detailed(self): self.bn_graph_detailed.click() return self @allure.step("Closin detailed view for combined graph") def close_combined_graph_detailed(self): self.bn_close_detailed_view.click() return self @allure.step("Getting data from market card") def get_top_markets_data(self): markets = wait(lambda: self.lt_top_5_markets.elements) countries = [] dates = [] streams = [] trends = [] trend_values = [] for market in markets: data = market.text.split() if not data[1][0].isdigit(): countries.append(data[0] + " " + data[1]) dates.append(data[2]) streams.append(data[3]) trends.append(data[4]) trend_values.append(data[5]) else: countries.append(data[0]) dates.append(data[1]) streams.append(data[2]) trends.append(data[3]) trend_values.append(data[4]) return countries, dates, streams, trends, trend_values @allure.step("Getting data from track top market default combined streams card") def get_market_default_card_data(self): return self.lb_combined_streams_card_data.visible_text @allure.step("Getting data from track top market detailed card") def get_market_detailed_card_data(self): return self.lb_detailed_graph_info.visible_text @allure.step("Getting data from market card") def get_markets_data(self): markets = self.lt_all_markets.elements countries = [] dates = [] streams = [] trends = [] trend_values = [] for market in markets: data = market.text.split() if not data[2][0].isdigit(): countries.append(data[0] + " " + data[1] + " " + data[2]) dates.append(data[3]) streams.append(data[4]) trends.append(data[5]) trend_values.append(data[6]) elif not data[1][0].isdigit(): countries.append(data[0] + " " + data[1]) dates.append(data[2]) streams.append(data[3]) trends.append(data[4]) trend_values.append(data[5]) else: countries.append(data[0]) dates.append(data[1]) streams.append(data[2]) trends.append(data[3]) trend_values.append(data[4]) return countries, dates, streams, trends, trend_values @allure.step("Getting date picker dates") def get_date_picker_dates(self): return { "1 year": self.bn_date_picker_1_year.label.replace("1 Year ", "").replace(" ", ""), "2 weeks": self.bn_date_picker_2_weeks.label.replace("2 Weeks ", "").replace(" ", ""), "4 weeks": self.bn_date_picker_4_weeks.label.replace("4 Weeks ", "").replace(" ", ""), "8 weeks": self.bn_date_picker_8_weeks.label.replace("8 Weeks ", "").replace(" ", ""), "12 weeks": self.bn_date_picker_12_weeks.label.replace("12 Weeks ", "").replace(" ", ""), "26 weeks": self.bn_date_picker_26_weeks.label.replace("26 Weeks ", "").replace(" ", ""), } @allure.step("Getting dates for selected period") def get_selected_dates(self): self.bn_date_range_picker.wait(to_assert=False) text = self.bn_date_range_picker.label.split("", 1)[1].replace(" ", "") dates = text.split("–") return dates @allure.step("Verifying streams by markets page is opened") def is_streams_by_markets_opened(self): return self.lb_streams_by_markets_title.is_visible() @allure.step("Verifying date range picker is displayed") def is_date_range_picker_displayed(self): return self.bn_date_range_picker.is_visible() @allure.step("Verifying top 5 markets tab is displayed") def is_top_5_tab_displayed(self): return self.lb_top_5_markets.is_visible() @allure.step("Verifying all markets tab is displayed") def is_all_markets_tab_displayed(self): return self.bn_all_markets_tab.is_visible() @allure.step("Verifying combined streams is displayed") def is_combined_streams_graph_displayed(self): return self.lb_combined_graph_title.is_visible() @allure.step("Verifying streams section is displayed") def is_markets_section_displayed(self): return self.lb_streams_markets.is_visible() @allure.step("Verifying search field is displayed") def is_search_field_displayed(self): return self.in_search.is_visible() @allure.step("Verifying no streams in period message is displayed") def is_no_streams_in_period_displayed(self): return self.lb_no_streams_in_period.is_visible() @allure.step("Verifying top 5 markets available in streams section") def is_5_markets_available(self): return len(self.lt_top_markets.elements) == 5 @allure.step("Verifying detiled graph info is displayed") def is_detailed_info_displayed(self): return self.lb_detailed_graph_info.is_present() @allure.step("Verifying top markets are available in graph legend") def are_top_markets_in_graph_legend(self, top_markets): markets_present = True for market in top_markets: locator = "**/XCUIElementTypeStaticText[`label == '{}'`]".format(market) markets_present = self.is_element_present(locator, "class-chain") return markets_present @allure.step("Verifying markets list is scrollable") def is_markets_list_scrolled(self): return not self.bn_all_markets_card.is_visible() @allure.step("Verifying sorting by streams for top markets") def is_top_markets_sorted(self): streams = self.get_top_markets_data()[2] streams_formatted = [] for stream in streams: if "k" in stream: value = float(stream.replace("k", "")) * 1000 streams_formatted.append(value) elif "M" in stream: value = float(stream.replace("M", "")) * 1000000 streams_formatted.append(value) else: streams_formatted.append(float(stream)) return streams_formatted == sorted(streams_formatted, reverse=True) @allure.step("Verifying sorting by streams for top markets") def is_all_markets_sorted(self): streams = self.get_markets_data()[2] streams_formatted = [] for stream in streams: if "k" in stream: value = float(stream.replace("k", "")) * 1000 streams_formatted.append(value) elif "M" in stream: value = float(stream.replace("M", "")) * 1000000 streams_formatted.append(value) else: streams_formatted.append(float(stream)) return streams_formatted == sorted(streams_formatted, reverse=True) @allure.step("Verifying popup contains top markets") def are_top_markets_in_popup(self, markets): market_present = True popup_text = self.lb_i_popup.attr_name for market in markets: if market not in popup_text: market_present = False return market_present @allure.step("Verifying popup contains selected dates") def are_selected_dates_in_popup(self, dates): dates_in_popup = True popup_text = self.lb_i_popup.label for date in dates: if date not in popup_text: dates_in_popup = False return dates_in_popup @allure.step("Verifying combined streams info popup opened") def is_combined_graph_popup_opened(self): return self.lb_combined_streams_i_title.is_present() @allure.step("Verifying date picker is opened") def is_date_picker_opened(self): wait(lambda: self.bn_date_picker_done.is_visible() is True) return self.lb_date_picker_title.is_visible() and self.bn_date_picker_done.is_visible() and self.bn_date_picker_2_weeks.is_visible() @allure.step("Verifying search results accordingly to query") def is_market_filtered(self, query_1, query_2): locator_1 = ("(//XCUIElementTypeStaticText[@name='STREAMS']/../../XCUIElementTypeOther[contains(@name, '%')]/" "XCUIElementTypeOther[contains(@name, '{}')])[1]").format(query_1) locator_2 = ("(//XCUIElementTypeStaticText[@name='STREAMS']/../../XCUIElementTypeOther[contains(@name, '%')]" "/XCUIElementTypeOther[contains(@name, '{}')])[1]").format(query_2) return self.is_element_displayed(locator_1, "xpath") and not self.is_element_displayed(locator_2, "xpath") @allure.step("Verifying search results accordingly to query") def are_all_markets_displayed(self, query_1, query_2): locator_1 = ("(//XCUIElementTypeStaticText[@name='STREAMS']/../../XCUIElementTypeOther[contains(@name, '%')]" "/XCUIElementTypeOther[contains(@name, '{}')])[1]").format(query_1) locator_2 = ("(//XCUIElementTypeStaticText[@name='STREAMS']/../../XCUIElementTypeOther[contains(@name, '%')]" "/XCUIElementTypeOther[contains(@name, '{}')])[1]").format(query_2) return self.is_element_displayed(locator_1, "xpath") and self.is_element_present(locator_2, "xpath") @allure.step("Verifying 1 year filter applied") def is_1_year_date_filter_applied_top_markets(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_combined_streams_card.label date = dates["1 year"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 2 weeks filter applied") def is_2_weeks_date_filter_applied_top_markets(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_combined_streams_card.label date = dates["2 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 4 weeks filter applied") def is_4_weeks_date_filter_applied_top_markets(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_combined_streams_card.label date = dates["4 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 8 weeks filter applied") def is_8_weeks_date_filter_applied_top_markets(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_combined_streams_card.label date = dates["8 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 12 weeks filter applied") def is_12_weeks_date_filter_applied_top_markets(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_combined_streams_card.label date = dates["12 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 26 weeks filter applied") def is_26_weeks_date_filter_applied_top_markets(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_combined_streams_card.label date = dates["26 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 1 year filter applied") def is_1_year_date_filter_applied(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_market_card.label date = dates["1 year"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 2 weeks filter applied") def is_2_weeks_date_filter_applied(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_market_card.label date = dates["2 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 4 weeks filter applied") def is_4_weeks_date_filter_applied(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_market_card.label date = dates["4 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 8 weeks filter applied") def is_8_weeks_date_filter_applied(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_market_card.label date = dates["8 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 12 weeks filter applied") def is_12_weeks_date_filter_applied(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_market_card.label date = dates["12 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying 26 weeks filter applied") def is_26_weeks_date_filter_applied(self, dates): wait(lambda: self.bn_date_picker_2_weeks.is_visible() is False) card_data = self.lb_market_card.label date = dates["26 weeks"] formatted_date = date.split("–") return formatted_date[0] in card_data and formatted_date[1] in card_data @allure.step("Verifying detailed view is opened") def is_detailed_combined_graph_opened(self): self.bn_close_detailed_view.wait(to_assert=False) return self.driver.orientation == "LANDSCAPE" @allure.step("Verifying detailed view is closed") def is_detailed_combined_graph_closed(self): self.bn_date_range_picker.wait(to_assert=False) return self.driver.orientation == "PORTRAIT" @allure.step("Verifying market selector in case of wrong name of the market") def is_market_section_available_without_correct_data(self): return self.lb_no_charts_search_results_msg.is_visible()