pages/desktop/frontend/search.py (186 lines of code) (raw):
from pypom import Page, Region
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as expected
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class Search(Page):
_context_card_locator = (By.CLASS_NAME, "SearchContextCard-header")
_search_box_locator = (By.CLASS_NAME, "AutoSearchInput-query")
_submit_button_locator = (By.CLASS_NAME, "AutoSearchInput-submit-button")
_search_filters_sort_locator = (By.ID, "SearchFilters-Sort")
_search_filters_type_locator = (By.ID, "SearchFilters-AddonType")
_search_filters_os_locator = (By.ID, "SearchFilters-OperatingSystem")
_search_filters_badging_locator = (By.ID, "SearchFilters-Badging")
_recommended_checkbox_locator = (By.ID, "SearchFilters-Recommended")
_pagination_next_locator = (By.CSS_SELECTOR, ".Paginate-item--next")
_pagination_previous_locator = (By.CLASS_NAME, "Paginate-item--previous")
_selected_page_locator = (By.CLASS_NAME, "Paginate-page-number")
def wait_for_page_to_load(self):
self.wait.until(
expected.invisibility_of_element_located((By.CLASS_NAME, "LoadingText")),
message="Search page could not be loaded",
)
return self
def wait_for_contextcard_update(self, value):
self.wait.until(
expected.text_to_be_present_in_element(
(By.CLASS_NAME, "SearchContextCard-header"), value
),
message=f'Expected search term "{value}" not found in "{self.find_element(*self._context_card_locator).text}"',
)
def search_results_list_loaded(self, count):
"""method used when we need to check that the search results list
contains a certain number of items"""
self.wait.until(
lambda _: len(self.result_list.search_results) >= count,
message=f"Expected search results to be {count} but the list returned {len(self.result_list.search_results)}",
)
@property
def results_info(self):
self.wait.until(EC.visibility_of_element_located(self._context_card_locator))
return self.find_element(*self._context_card_locator)
@property
def result_list(self):
return self.SearchResultList(self)
@property
def filter_by_sort(self):
self.wait.until(
EC.visibility_of_element_located(self._search_filters_sort_locator)
)
return self.find_element(*self._search_filters_sort_locator)
@property
def filter_by_type(self):
self.wait.until(
EC.visibility_of_element_located(self._search_filters_type_locator)
)
return self.find_element(*self._search_filters_type_locator)
@property
def filter_by_os(self):
self.wait.until(
EC.visibility_of_element_located(self._search_filters_os_locator)
)
return self.find_element(*self._search_filters_os_locator)
@property
def filter_by_badging(self):
self.wait.until(
EC.visibility_of_element_located(self._search_filters_badging_locator)
)
return self.find_element(*self._search_filters_badging_locator)
@property
def recommended_filter(self) -> object:
self.wait.until(
EC.visibility_of_element_located(self._recommended_checkbox_locator)
)
return self.find_element(*self._recommended_checkbox_locator)
def next_page(self):
self.wait.until(EC.visibility_of_element_located(self._pagination_next_locator))
self.find_element(*self._pagination_next_locator).click()
def previous_page(self):
self.wait.until(EC.element_to_be_clickable(self._pagination_previous_locator))
self.find_element(*self._pagination_previous_locator).click()
@property
def page_number(self):
self.wait.until(
lambda _: self.is_element_displayed(*self._selected_page_locator),
message="Pagination items were not loaded",
)
return self.find_element(*self._selected_page_locator).text
class SearchResultList(Region):
_result_locator = (By.CLASS_NAME, "SearchResult")
_result_link_locator = (By.CLASS_NAME, "SearchResult-link")
_theme_locator = (By.CLASS_NAME, "SearchResult--theme")
_extension_locator = (By.CLASS_NAME, "SearchResult-name")
@property
def search_results(self):
items = self.find_elements(*self._result_locator)
return [self.ResultListItems(self, el) for el in items]
@property
def themes(self):
items = self.find_elements(*self._theme_locator)
return [self.ResultListItems(self, el) for el in items]
@property
def extension(self):
self.wait.until(EC.visibility_of_element_located(self._extension_locator))
items = self.find_elements(*self._extension_locator)
return [self.ResultListItems(self, el) for el in items]
def click_search_result(self, count):
self.wait.until(EC.element_to_be_clickable(self._result_link_locator))
self.find_elements(*self._result_link_locator)[count].click()
from pages.desktop.frontend.details import Detail
return Detail(self.driver, self.page.base_url).wait_for_page_to_load()
class ResultListItems(Region):
_rating_locator = (By.CSS_SELECTOR, ".Rating--small")
_search_item_name_locator = (By.CSS_SELECTOR, ".SearchResult-link")
_promoted_badge_locator = (By.CSS_SELECTOR, ".PromotedBadge")
_promoted_badge_label_locator = (By.CSS_SELECTOR, ".PromotedBadge-label")
_users_locator = (By.CLASS_NAME, "SearchResult-users")
_users_number_locator = (By.CLASS_NAME, "SearchResult-users-text")
_icon_locator = (By.CLASS_NAME, "SearchResult-icon")
_rating_stars_locator = (By.CLASS_NAME, "SearchResult-rating")
_author_locator = (By.CLASS_NAME, "SearchResult-author")
_summary_locator = (By.CLASS_NAME, "SearchResult-summary")
@property
def search_name(self):
self.wait.until(
EC.visibility_of_element_located(self._search_item_name_locator)
)
return self.find_element(*self._search_item_name_locator)
@property
def name(self):
self.wait.until(
EC.visibility_of_element_located(self._search_item_name_locator)
)
return self.find_element(*self._search_item_name_locator).text
def link(self):
self.wait.until(
EC.element_to_be_clickable(self._search_item_name_locator)
)
self.find_element(*self._search_item_name_locator).click()
from pages.desktop.frontend.details import Detail
detail_page = Detail(self.driver, self.page.page.base_url)
return detail_page.wait_for_page_to_load()
@property
def users(self):
self.wait.until(
EC.visibility_of_element_located(self._users_number_locator)
)
users = self.find_element(*self._users_number_locator).text
return int(users.split()[0].replace(",", "").replace("users", ""))
@property
def rating(self):
"""Returns the rating"""
self.wait.until(EC.visibility_of_element_located(self._rating_locator))
rating = self.find_element(*self._rating_locator).get_property("title")
return float(rating.split()[1])
@property
def search_result_icon(self):
self.wait.until(EC.visibility_of_element_located(self._icon_locator))
return self.find_element(*self._icon_locator)
@property
def search_result_rating_stars(self):
self.wait.until(
EC.visibility_of_element_located(self._rating_stars_locator)
)
return self.find_element(*self._rating_stars_locator)
@property
def search_result_author(self):
self.wait.until(EC.visibility_of_element_located(self._author_locator))
return self.find_element(*self._author_locator)
@property
def search_result_users(self):
self.wait.until(EC.visibility_of_element_located(self._users_locator))
return self.find_element(*self._users_locator)
@property
def search_result_summary(self):
self.wait.until(EC.visibility_of_element_located(self._summary_locator))
return self.find_element(*self._summary_locator)
@property
def promoted_badge(self):
WebDriverWait(self.driver, 10).until(
EC.visibility_of_element_located(self._promoted_badge_locator),
message="Promoted badge was not found for these search results",
)
return self
@property
def promoted_badge_label(self):
self.wait.until(
EC.visibility_of_element_located(self._promoted_badge_label_locator)
)
return self.find_element(*self._promoted_badge_label_locator).text