import logging import time import allure from selenium.webdriver import ActionChains from ui_automation_framework.core import BasePage, TestStatus from ui_automation_framework.utils import logger as cl class AddTrackPopup(BasePage): log = cl.Logger(logging.DEBUG) def __init__(self, driver): super().__init__(driver) self.driver = driver self.add_track_popup = self.get_page_locators("AddTrackPopup", "add_track_popup_elements.json") self.track_comparison_page = self.get_page_locators("TrackComparisonPage", "comparison_elements.json") self.ts = TestStatus(self.driver) @allure.step("Add Track Popup - search for a track") def search_for_track(self, track): self.page_has_loaded() self.send_text(track, *self.locator(self.add_track_popup, "search_input")) self.page_has_loaded() self.log.info("add track popup - search for a track: {}".format(track)) @allure.step("Add Track Popup - is popup opened") def is_popup_displayed(self): self.page_has_loaded() header_displayed = self.is_element_displayed(*self.locator(self.add_track_popup, "header")) close_icon_displayed = self.is_element_displayed(*self.locator(self.add_track_popup, "close_icon")) search_displayed = self.is_element_displayed(*self.locator(self.add_track_popup, "search_input")) self.ts.markFinal(header_displayed == close_icon_displayed == search_displayed == True, "is add track popup opened") @allure.step("Add Track Popup - add track to comparison") def add_track_to_comparison(self, track_name): self.click_to_add_track(track_name) self.track_is_added(track_name) @allure.step("Add Track Popup - add track to comparison") def track_is_added(self, track_name): self.wait_for_element_visible("//a[contains(@href, '/track/')]/*[text()='{}']".format(track_name[0]), "xpath") track_is_added = self.is_element_displayed("//a[contains(@href, '/track/')]/*[text()='{}']".format(track_name[0]), "xpath") self.ts.markFinal(track_is_added, "{} track is added to comparison page".format(track_name[0])) @allure.step("Add Track Popup - verify autofocus, search placeholder, start typing") def verify_elements(self): start_type_el = self.is_element_displayed(*self.locator(self.add_track_popup, "start_typing")) input = self.get_element(*self.locator(self.add_track_popup, "search_input")) focused_el = self.driver.switch_to.active_element placeholder = self.get_attribute_value(element=input, attribute="placeholder") self.ts.markFinal(start_type_el, "start typing is displayed") self.ts.markFinal(input == focused_el, "input is focused") self.ts.markFinal(placeholder == "Search for a track...", "placeholder is: {}".format(placeholder)) @allure.step("Add Track Popup - verify close icon is displayed") def is_search_close_icon_displayed(self, present=True): close_icon = self.is_element_displayed(*self.locator(self.add_track_popup, "search_close_icon")) self.ts.markFinal(close_icon == present, "close icon is displayed: {}".format(close_icon)) @allure.step("Add Track Popup - verify search results") def verify_search_results_present(self, present=True): self.page_has_loaded() time.sleep(3) results_el = self.get_elements(*self.locator(self.add_track_popup, "search_results")) if present: self.ts.markFinal(0 < len(results_el) <= 20, "count of track results is: {}".format(len(results_el))) else: self.ts.markFinal(len(results_el) == 0, "count of track results is: {}".format(len(results_el))) @allure.step("Add Track Popup - verify hover") def verify_hover(self): track_result = self.get_elements(*self.locator(self.add_track_popup, "search_results"))[0] color_before = track_result.value_of_css_property("background-color") ActionChains(self.driver).move_to_element(to_element=track_result).perform() color_after = track_result.value_of_css_property("background-color") self.ts.markFinal( color_after != color_before, "color after and before are different: {}, {}".format(color_before, color_after), ) @allure.step("Add Track Popup - clear input") def click_clear_icon(self): self.click_element(*self.locator(self.add_track_popup, "search_close_icon")) input = self.get_text(*self.locator(self.add_track_popup, "search_input")) self.ts.markFinal(input == "", "input is cleared: {}".format(input)) @allure.step("Add Track Popup - verify popup height") def verify_popup_height(self): popup = self.get_element(*self.locator(self.add_track_popup, "popup")) min = popup.value_of_css_property("min-height") max = popup.value_of_css_property("max-height") self.ts.markFinal(min == "370px", "min is: {}".format(min)) self.ts.markFinal(max == "510px", "max is: {}".format(max)) @allure.step("Add Track Popup - close popup") def close_popup(self): self.click_element(*self.locator(self.add_track_popup, "close_icon")) popup = self.is_element_displayed(*self.locator(self.add_track_popup, "popup")) self.click_on_header() self.ts.markFinal(not popup, "popup is closed") @allure.step("Add Track Popup - close popup") def verify_no_tracks_to_show(self): self.wait_for_element_visible(*self.locator(self.add_track_popup, "loop_icon")) self.wait_for_element_visible(*self.locator(self.add_track_popup, "no_tracks")) self.wait_for_element_visible(*self.locator(self.add_track_popup, "try_change")) loop_icon = self.is_element_displayed(*self.locator(self.add_track_popup, "loop_icon")) no_tracks = self.is_element_displayed(*self.locator(self.add_track_popup, "no_tracks")) try_change = self.is_element_displayed(*self.locator(self.add_track_popup, "try_change")) self.ts.markFinal(loop_icon == no_tracks == try_change == True, "no tracks to show placeholder is displayed") @allure.step("Add Track Popup - click to add track") def click_to_add_track(self, track_name): self.page_has_loaded() self.send_text("{}".format(track_name[0]), *self.locator(self.add_track_popup, "search_input")) self.page_has_loaded() time.sleep(3) self.send_text(" ", *self.locator(self.add_track_popup, "search_input")) self.page_has_loaded() self.log.info("typed to search input: {}".format(track_name[0])) track_locator = "//*[contains(@id, 'add-track-track-')]/..//*[text()='{}']//following-sibling::*[text()='{}']".format(track_name[0], track_name[1]) self.wait_for_element_visible(track_locator, "xpath") self.click_element(track_locator, "xpath") @allure.step("Add Track Popup - clear input") def clear_input(self): self.get_element(*self.locator(self.add_track_popup, "search_input")).clear() @allure.step("Add Track Popup - verify recent searches") def verify_recent_searches(self, tracks): tracks = list(list(tracks).__reversed__()) recent_search = self.get_text(*self.locator(self.add_track_popup, "recent_search")) results_el = self.get_elements(*self.locator(self.add_track_popup, "search_results")) results = [self.get_text(element=e) for e in results_el] self.ts.markFinal(recent_search == "Recent Searches ({})".format(len(tracks)), "recent search: {}".format(recent_search)) self.ts.markFinal( [str(r).split("\n")[0] for r in results] == [t.name for t in tracks], "results in recent is: {}, expected: {}".format([str(r).split("\n")[0] for r in results], [t.name for t in tracks]), ) @allure.step("Add Track Popup - click on header") def click_on_header(self): self.click_element(*self.locator(self.add_track_popup, "header")) @allure.step("Add Track Popup - add track by index") def add_track_by_index(self, param): results_el = self.get_elements(*self.locator(self.add_track_popup, "search_results"))[param] track_to_add = str(self.get_text(element=results_el)).split("\n")[0] self.click_element(element=results_el) self.track_is_added([track_to_add])