import logging import time import allure from assertpy import assert_that from ui_automation_framework.core import BasePage, TestStatus from ui_automation_framework.utils import CoreConfig from ui_automation_framework.utils import logger as cl from app.src.pages.login_page import LoginPage from app.src.pages.my_starred_tracks_page import MyStarredTracksPage class MostAddedTrackPage(BasePage): log = cl.Logger(logging.DEBUG) def __init__(self, driver): super().__init__(driver) self.driver = driver self.ts = TestStatus(self.driver) self.loginPage = LoginPage(self.driver) self.my_starred_tracks_page = MyStarredTracksPage(self.driver) @allure.step("Page title is present") def title_is_present(self): locator = "//span[contains(text(),'Most Added Track')]" self.wait_for_element_visible(locator=locator, locator_type="xpath") title = self.is_element_displayed(locator=locator, locator_type="xpath") assert_that(title).is_true() @allure.step("Navigating to the Most Added Page") def open_most_added_page(self): self.driver.get(CoreConfig.ENV_BASE_URL + "/spotify/most-added-track") self.page_has_loaded() @allure.step("Star track and verify that it is starred") def star_track_in_most_added_track_page(self): locator = "//span[contains(@class, 'icon-star')]/ancestor::div[1]" self.wait_for_element_visible(locator=locator, locator_type="xpath") self.wait_for_element_clickable(locator=locator, locator_type="xpath") icons_list = self.get_elements(locator=locator, locator_type="xpath") first_track_star_color = icons_list[0].get_attribute("style") self.log.info(f"star color before: {first_track_star_color}") assert_that(first_track_star_color).is_equal_to(self.my_starred_tracks_page.UNSTARRED_TRACK_ICON_COLOR) self.click_on_element_js(element=icons_list[0]) starred_hint = self.wait_for_element_visible(locator="//*[text()='Track successfully starred']", locator_type="xpath") hint = self.get_text(element=starred_hint) assert_that(hint).is_equal_to("Track successfully starred") self.wait_for_element_visible(locator=locator, locator_type="xpath") time.sleep(2) icons_list = self.get_elements(locator=locator, locator_type="xpath") first_track_star_color = icons_list[0].get_attribute("style") self.log.info(f"star color after: {first_track_star_color}") assert_that(first_track_star_color).is_equal_to(self.my_starred_tracks_page.STARRED_TRACK_ICON_COLOR) @allure.step("Unstar track and verify that it is unstarred") def unstar_track_in_most_added_track_page(self): locator = "//span[contains(@class, 'icon-star')]/ancestor::div[1]" time.sleep(10) self.wait_for_element_visible(locator=locator, locator_type="xpath") icons_list = self.get_elements(locator=locator, locator_type="xpath") first_track_star_color = icons_list[0].get_attribute("style") self.log.info(f"star color before: {first_track_star_color}") assert_that(first_track_star_color).is_equal_to(self.my_starred_tracks_page.STARRED_TRACK_ICON_COLOR) self.click_element(element=icons_list[0]) starred_hint = self.wait_for_element_visible(locator="//*[text()='Track successfully unstarred']", locator_type="xpath") hint = self.get_text(element=starred_hint) assert_that(hint).is_equal_to("Track successfully unstarred") self.wait_for_element_visible(locator=locator, locator_type="xpath") time.sleep(2) icons_list = self.get_elements(locator=locator, locator_type="xpath") first_track_star_color = icons_list[0].get_attribute("style") self.log.info(f"star color after: {first_track_star_color}") assert_that(first_track_star_color).is_equal_to(self.my_starred_tracks_page.UNSTARRED_TRACK_ICON_COLOR) @allure.step("Get track data from tracks list") def get_most_added_track_data(self, track_number): locator_track_id = f"//span[text()='{track_number}']/ancestor::div[3]/div[5]//a" locator_track_artists = f"(//*[contains(@href, '/spotify/artist/')]/ancestor::span)[{track_number}]" track_link = self.get_element(locator=locator_track_id, locator_type="xpath") track_id = track_link.get_attribute("href").split("/")[-1] track_name = self.get_text(locator=locator_track_id, locator_type="xpath") track_artists_list = self.get_elements(locator=locator_track_artists, locator_type="xpath") track_artists = [self.get_text(element=t) for t in track_artists_list] track_artists_final = track_artists[0].split(", ") track_data = {"track_id": track_id, "track_name": track_name, "track_artists": track_artists_final} self.log.info("Track data: " + str(track_data)) return track_data