pages/desktop/frontend/versions.py (126 lines of code) (raw):
from pypom import Region
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as expected
from selenium.webdriver.support import expected_conditions as EC
from pages.desktop.base import Base
from regions.desktop.rating_stats_card import RatingStats
class Versions(Base):
_versions_page_header_locator = (By.CSS_SELECTOR, ".AddonVersions-versions header")
_latest_version_locator = (By.CSS_SELECTOR, ".Card-contents li:nth-child(2) h2")
_versions_list_locator = (By.CSS_SELECTOR, ".AddonVersionCard")
_notice_message_locator = (
By.CSS_SELECTOR,
".Card-contents .Notice-warning .Notice-text",
)
_notice_message_text_locator = (By.CSS_SELECTOR, ".AddonVersions-warning-text")
_rating_card_locator = (By.CSS_SELECTOR, ".AddonSummaryCard")
def wait_for_page_to_load(self):
"""Waits for various page components to be loaded"""
self.wait.until(
expected.invisibility_of_element_located((By.CLASS_NAME, "LoadingText"))
)
return self
@property
def versions_page_header(self):
self.wait_for_element_to_be_displayed(self._versions_page_header_locator)
return self.find_element(*self._versions_page_header_locator)
@property
def latest_version_number(self):
self.wait_for_element_to_be_displayed(self._latest_version_locator)
el = self.find_element(*self._latest_version_locator).text
return el.split()[1].replace("Version ", "")
@property
def notice_message(self):
self.wait_for_element_to_be_displayed(self._notice_message_locator)
return self.find_element(*self._notice_message_locator)
@property
def rating_card(self):
el = self.find_element(By.CLASS_NAME, "AddonSummaryCard")
return RatingStats(self, el)
@property
def versions_list(self):
items = self.find_elements(*self._versions_list_locator)
return [self.VersionCard(self, el) for el in items]
class VersionCard(Region):
_version_number_locator = (By.CSS_SELECTOR, ".AddonVersionCard-version")
_released_date_locator = (By.CSS_SELECTOR, ".AddonVersionCard-fileInfo")
_version_release_notes_locator = (
By.CSS_SELECTOR,
".AddonVersionCard-releaseNotes",
)
_license_link_locator = (By.CSS_SELECTOR, ".AddonVersionCard-license > a")
_license_text_locator = (By.CSS_SELECTOR, ".AddonVersionCard-license")
_warning_message_locator = (By.CSS_SELECTOR, ".Notice-text")
_warning_learn_more_button_locator = (By.CSS_SELECTOR, ".Notice-button")
_add_to_firefox_button_locator = (By.CSS_SELECTOR, ".AMInstallButton-button")
_download_link_locator = (
By.CSS_SELECTOR,
".InstallButtonWrapper-download-link",
)
@property
def version_number(self):
self.wait.until(
EC.visibility_of_element_located(self._version_number_locator)
)
return self.find_element(*self._version_number_locator).text.split()[1]
@property
def released_date(self):
self.wait.until(
EC.visibility_of_element_located(self._released_date_locator)
)
text = self.find_element(*self._released_date_locator).text
text = text.split("Released ")[1]
text = text.split("-")[0][:-1]
return text
@property
def version_size(self): # memory size, ex: 7.35 KB
self.wait.until(
EC.visibility_of_element_located(self._released_date_locator)
)
return self.find_element(*self._released_date_locator).text.split("-")[1][
1:
]
@property
def version_release_notes(self):
self.wait.until(
EC.visibility_of_element_located(self._version_release_notes_locator)
)
return self.find_element(*self._version_release_notes_locator)
@property
def license_link(self):
# there is a case where no license link is present
# instead, a 'All Rights Reserved' text is displayed
try:
return self.find_element(*self._license_link_locator)
except NoSuchElementException:
return False
@property
def license_text(self):
self.wait.until(
EC.visibility_of_element_located(self._license_text_locator)
)
text = self.find_element(*self._license_text_locator).text
if self.license_link:
text += self.license_link.get_attribute("href")
return text
@property
def warning_message(self):
self.wait.until(
EC.visibility_of_element_located(self._warning_message_locator)
)
return self.find_element(*self._warning_message_locator)
@property
def warning_learn_more_button(self):
self.wait.until(
EC.visibility_of_element_located(
self._warning_learn_more_button_locator
)
)
return self.find_element(*self._warning_learn_more_button_locator)
@property
def add_to_firefox_button(self):
self.wait.until(
EC.visibility_of_element_located(self._add_to_firefox_button_locator)
)
return self.find_element(*self._add_to_firefox_button_locator)
def click_download_link(self):
self.wait.until(EC.element_to_be_clickable(self._download_link_locator))
self.find_element(*self._download_link_locator).click()