from allure import step from playwright.sync_api import Page from playwright.sync_api import expect from src.locators.search_locators import SearchLocators from src.ui_elements.base_ui_element import BaseUIElement from assertpy import assert_that from src.pages.common_page import CommonPage class SearchPage(CommonPage): def __init__(self, page: Page): super().__init__(page) self.page = page self.url = '/search' self.api_search_by_name = {'artist': '**api/artist/search_by_name?offset=0&name=**&limit=40', 'track': '**api/track/search_by_name?offset=0&name=**&limit=40'} self.lb_start_search = BaseUIElement(self.page, SearchLocators.LB_START_SEARCH, 'Start search label') self.lb_no_search_results = BaseUIElement(self.page, SearchLocators.LB_NO_RESULTS, 'No results label') self.placeholder_search = BaseUIElement(self.page, SearchLocators.PLACEHOLDER_SEARCH, 'Search placeholder') self.btn_search_clear = BaseUIElement(self.page, SearchLocators.BN_SEARCH_CLEAR, 'Search Clear button') self.search_cards_title = BaseUIElement(self.page, SearchLocators.CARDS_TITLE, 'Cards title') self.search_card_item = BaseUIElement(self.page, SearchLocators.SEARCH_ENTITY_CARD_ITEM, 'Card item') self.search_card_image = BaseUIElement(self.page, SearchLocators.SEARCH_ENTITY_CARD_IMG, 'Card - Image') self.search_card_bn_bookmark = BaseUIElement(self.page, SearchLocators.SEARCH_ENTITY_CARD_BTN, 'Card bookmark - Add to category') self.search_card_green_mark = BaseUIElement(self.page, SearchLocators.SEARCH_ENTITY_CARD_GREEN_MARK, 'Card - Green mark') self.search_card_name = BaseUIElement(self.page, SearchLocators.SEARCH_ENTITY_CARD_NAME, 'Card - Name') self.search_card_by_artist = BaseUIElement(self.page, SearchLocators.SEARCH_ENTITY_CARD_BY_ARTIST, 'By Artist') self.search_switch_all = BaseUIElement(self.page, SearchLocators.SEARCH_SWITCH_ALL, 'Search switch - All') self.search_switch_artists = BaseUIElement(self.page, SearchLocators.SEARCH_SWITCH_ARTISTS, 'Search switch - Artists') self.search_switch_tracks = BaseUIElement(self.page, SearchLocators.SEARCH_SWITCH_TRACKS, 'Search switch - Tracks') @step("Search page is loaded") def is_page_loaded(self): self.placeholder_search.exists() @step("Switch Search to Artists") def switch_search_to_artists(self): self.search_switch_artists.click() self.search_switch_artists.is_selected(True) @step("Switch Search to Tracks") def switch_search_to_tracks(self): self.search_switch_tracks.click() self.search_switch_tracks.is_selected(True) @step("Verify found cards in search box") def verify_found_cards_response_vs_page(self, search_name, entity_type, search_response): response = search_response.value.json() assert_that(len(response) <= 40).is_true() top_score = None for i in range(len(response)): # Check items sorted by score DESC response_score = response[i]['data']['score'] if top_score is None: top_score = response_score else: assert_that(top_score >= response_score).is_true() # check entity_type assert_that(response[i]['entity_type']).is_equal_to(entity_type) # check name response_name = response[i]['data']['name'] card_name = self.search_card_name.get_by(f"{entity_type.capitalize()}s", i+1).get_text() assert_that(response_name).is_equal_to(card_name) if entity_type == 'track': by_artist = self.search_card_by_artist.get_by(f"{entity_type.capitalize()}s", i+1).get_text() response_artist_name = response[i]['data']['artist_name'] assert_that(f"By {response_artist_name}").is_equal_to(by_artist) # check img src card_img_url = self.search_card_image.get_by(f"{entity_type.capitalize()}s", i + 1).get_attribute("src") assert_that(card_img_url == response[i]['data']['artwork_url'] or card_img_url == response[i]['data']['artwork_url_alt']).is_true() # check found item relevance self.check_found_name_relevance(response_name, search_name) @step("Verify search relevance: search_name = {search_name} | found name = {found_name}") def check_found_name_relevance(self, found_name, search_name): matched = 0 for letter in search_name.lower(): if letter in found_name.lower(): matched += 1 print(f"{search_name} vs {found_name} | matched = {matched}") assert_that(matched >= len(search_name) - 1)