pages/desktop/about_addons.py (213 lines of code) (raw):

from pypom import Page, Region from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC class AboutAddons(Page): _addon_cards_locator = (By.CLASS_NAME, "card.addon") _search_box_locator = (By.CSS_SELECTOR, ".main-search search-textbox") _extension_tab_button_locator = (By.CSS_SELECTOR, 'button[name = "extension"]') _theme_tab_button_locator = (By.CSS_SELECTOR, 'button[name = "theme"]') _dictionary_tab_button_locator = (By.CSS_SELECTOR, 'button[name = "dictionary"]') _langpack_tab_button_locator = (By.CSS_SELECTOR, 'button[name = "locale"]') _extension_disable_toggle_locator = (By.CLASS_NAME, "extension-enable-button") _enabled_theme_status_locator = (By.CLASS_NAME, "card.addon") _installed_addon_cards_locator = (By.CSS_SELECTOR, ".card.addon") _enabled_theme_image_locator = (By.CLASS_NAME, "card-heading-image") _installed_addon_name_locator = (By.CSS_SELECTOR, ".addon-name a") _installed_addon_author_locator = (By.CSS_SELECTOR, ".addon-detail-row-author a") _find_more_addons_button_locator = (By.CLASS_NAME, "primary") _installed_extension_version_locator = ( By.CSS_SELECTOR, ".addon-detail-row-version", ) _options_button_locator = (By.CSS_SELECTOR, ".more-options-button") def wait_for_page_to_load(self): self.wait.until( EC.visibility_of_element_located(self._find_more_addons_button_locator) ) return self def search_box(self, value): self.wait.until(EC.visibility_of_element_located(self._search_box_locator)) search_field = self.find_element(*self._search_box_locator) search_field.send_keys(value) # send Enter to initiate search redirection to AMO search_field.send_keys(Keys.ENTER) # AMO search results open in a new tab, so we need to switch windows self.wait.until( EC.number_of_windows_to_be(2), message=f"Number of windows was {len(self.driver.window_handles)}, expected 2", ) self.driver.switch_to.window(self.driver.window_handles[1]) from pages.desktop.frontend.search import Search return Search(self.driver, self.base_url).wait_for_page_to_load() def click_extensions_side_button(self): self.wait.until(EC.element_to_be_clickable(self._extension_tab_button_locator)) self.find_element(*self._extension_tab_button_locator).click() self.wait.until( EC.text_to_be_present_in_element( (By.CLASS_NAME, "list-section-heading"), "Enabled" ) ) def click_themes_side_button(self): self.wait.until(EC.element_to_be_clickable(self._theme_tab_button_locator)) self.find_element(*self._theme_tab_button_locator).click() self.wait.until( EC.text_to_be_present_in_element( (By.CLASS_NAME, "list-section-heading"), "Enabled" ) ) def click_dictionaries_side_button(self): self.wait.until(EC.element_to_be_clickable(self._dictionary_tab_button_locator)) self.find_element(*self._dictionary_tab_button_locator).click() self.wait.until( EC.text_to_be_present_in_element( (By.CLASS_NAME, "list-section-heading"), "Enabled" ) ) def click_language_side_button(self): self.wait.until(EC.element_to_be_clickable(self._langpack_tab_button_locator)) self.find_element(*self._langpack_tab_button_locator).click() self.wait.until( EC.text_to_be_present_in_element( (By.CLASS_NAME, "list-section-heading"), "Enabled" ) ) def disable_extension(self): self.wait.until( EC.element_to_be_clickable(self._extension_disable_toggle_locator) ) self.find_element(*self._extension_disable_toggle_locator).click() @property def installed_addon_cards(self): self.wait.until( EC.visibility_of_element_located(self._installed_addon_cards_locator) ) return self.find_elements(*self._installed_addon_cards_locator) @property def installed_addon_name(self): return self.find_elements(*self._installed_addon_name_locator) @property def installed_addon_author_name(self): self.wait.until( EC.visibility_of_element_located(self._installed_addon_author_locator) ) return self.find_element(*self._installed_addon_author_locator).text @property def enabled_theme_active_status(self): """Verifies if a theme is enabled""" self.wait.until( EC.visibility_of_element_located(self._enabled_theme_status_locator) ) el = self.find_elements(*self._enabled_theme_status_locator) return el[0].get_attribute("active") @property def enabled_theme_image(self): return self.find_elements(*self._enabled_theme_image_locator)[0].get_attribute( "src" ) @property def addon_cards_items(self): self.wait.until(EC.visibility_of_element_located(self._addon_cards_locator)) items = self.find_elements(*self._addon_cards_locator) return [self.AddonCards(self, el) for el in items] def click_find_more_addons(self): self.wait.until( EC.element_to_be_clickable(self._find_more_addons_button_locator) ) self.find_element(*self._find_more_addons_button_locator).click() # this button opens AMO homepage in a new tab self.wait.until( EC.number_of_windows_to_be(2), message=f"Number of windows was {len(self.driver.window_handles)}, expected 2", ) self.driver.switch_to.window(self.driver.window_handles[1]) from pages.desktop.frontend.home import Home return Home(self.driver, self.base_url).wait_for_page_to_load() @property def installed_version_number(self): self.wait.until( EC.visibility_of_element_located(self._installed_extension_version_locator) ) return self.find_element( *self._installed_extension_version_locator ).text.replace("Version\n", "") def click_options_button(self): self.wait.until(EC.element_to_be_clickable(self._options_button_locator)) self.find_element(*self._options_button_locator).click() class AddonCards(Region): _theme_image_locator = (By.CLASS_NAME, "card-heading-image") _extension_icon_locator = (By.CLASS_NAME, "card-heading-icon") _disco_addon_name_locator = (By.CLASS_NAME, "disco-addon-name") _disco_addon_author_locator = (By.CSS_SELECTOR, ".disco-addon-author a") _extension_summary_locator = (By.CLASS_NAME, "disco-description-main") _extension_rating_locator = ( By.CSS_SELECTOR, ".disco-description-statistics moz-five-star", ) _extension_users_count_locator = (By.CLASS_NAME, "disco-user-count") _addon_install_button_locator = ( By.CSS_SELECTOR, 'button[action="install-addon"]', ) def is_extension_card(self): """Determines if we have an extension of a theme card. If it is a Theme, we return false""" try: # this statement returns true if the card has an extension return self.disco_extension_rating.is_displayed() except NoSuchElementException: return False @property def theme_image(self): self.wait.until(EC.visibility_of_element_located(self._theme_image_locator)) return self.find_element(*self._theme_image_locator) @property def extension_image(self): return self.find_element(*self._extension_icon_locator) @property def disco_addon_name(self): self.wait.until( EC.visibility_of_element_located(self._disco_addon_name_locator) ) return self.find_element(*self._disco_addon_name_locator) @property def disco_addon_author(self): self.wait.until( EC.visibility_of_element_located(self._disco_addon_author_locator) ) return self.find_element(*self._disco_addon_author_locator) def click_disco_addon_author(self): self.disco_addon_author.click() self.wait.until( EC.number_of_windows_to_be(2), message=f"Number of windows was {len(self.driver.window_handles)}, expected 2", ) self.driver.switch_to.window(self.driver.window_handles[1]) from pages.desktop.frontend.details import Detail return Detail(self.driver, self.page.base_url) @property def disco_extension_summary(self): self.wait.until( EC.visibility_of_element_located(self._extension_summary_locator) ) return self.find_element(*self._extension_summary_locator).text @property def disco_extension_rating(self): self.wait.until( EC.visibility_of_element_located(self._extension_rating_locator) ) return self.find_element(*self._extension_rating_locator) @property def rating_score(self): return self.disco_extension_rating.get_attribute("rating") @property def disco_extension_users(self): self.wait.until( EC.visibility_of_element_located(self._extension_users_count_locator) ) return self.find_element(*self._extension_users_count_locator) @property def user_count(self): return int( self.disco_extension_users.text.replace("Users: ", "").replace(",", "") ) @property def install_button(self): self.wait.until( EC.visibility_of_element_located(self._addon_install_button_locator) ) return self.find_element(*self._addon_install_button_locator)