pages/desktop/frontend/blog.py (179 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 EC from pages.desktop.base import Base class BlogHomepage(Base): URL_TEMPLATE = "blog/" _articles_locator = (By.CSS_SELECTOR, ".blog-entry") @property def articles(self): items = self.find_elements(*self._articles_locator) return [self.ArticlesList(self, el) for el in items] class ArticlesList(Region): _image_locator = (By.CSS_SELECTOR, ".blog-entry-featured-image > img") _image_link_locator = (By.CSS_SELECTOR, ".blog-entry-featured-image") _title_locator = (By.CLASS_NAME, "blog-entry-title") _date_locator = (By.CLASS_NAME, "blog-entry-date") _intro_text_locator = (By.CSS_SELECTOR, ".blog-entry-excerpt > p:nth-child(1)") _read_more_link_locator = (By.CSS_SELECTOR, ".blog-entry-read-more > a") @property def image(self): self.wait.until(EC.visibility_of_element_located(self._image_locator)) return self.find_element(*self._image_locator) @property def title(self): self.wait.until(EC.visibility_of_element_located(self._image_locator)) return self.find_element(*self._title_locator) @property def date(self): self.wait.until(EC.visibility_of_element_located(self._image_locator)) return self.find_element(*self._date_locator) @property def intro_text(self): self.wait.until(EC.visibility_of_element_located(self._image_locator)) return self.find_element(*self._intro_text_locator) @property def read_more_link(self): self.wait.until(EC.visibility_of_element_located(self._image_locator)) return self.find_element(*self._read_more_link_locator) def click_read_more_link(self): self.wait.until(EC.element_to_be_clickable(self._image_locator)) self.read_more_link.click() return ArticlePage(self.driver, self.page.base_url).wait_for_page_to_load() class ArticlePage(Base): _header_logo_locator = (By.CLASS_NAME, "header-logo") _article_title = (By.CLASS_NAME, "header-title") _navigation_bar_locator = (By.CSS_SELECTOR, ".blogpost-breadcrumb ol li") _content_paragraphs_locator = (By.CSS_SELECTOR, ".blogpost-content-wrapper > p") _last_updated_date_locator = (By.CSS_SELECTOR, "dd.updated") _previous_article_link_locator = (By.CSS_SELECTOR, ".blogpost-nav-prev a p") _next_article_link_locator = (By.CSS_SELECTOR, ".blogpost-nav-next a p") _author_info_section_locator = (By.CLASS_NAME, "blogpost-meta") _static_addon_card_locator = (By.CLASS_NAME, "StaticAddonCard") def wait_for_page_to_load(self): self.wait.until( EC.visibility_of_element_located(self._author_info_section_locator) ) return self @property def header_logo(self): self.wait_for_element_to_be_displayed(self._header_logo_locator) return self.find_element(*self._header_logo_locator) @property def title(self): self.wait_for_element_to_be_displayed(self._article_title) return self.find_element(*self._article_title) @property def nav_bar_links(self): self.wait_for_element_to_be_displayed(self._navigation_bar_locator) return self.find_elements(*self._navigation_bar_locator) @property def content_paragraphs(self): self.wait_for_element_to_be_displayed(self._content_paragraphs_locator) return self.find_elements(*self._content_paragraphs_locator) @property def last_updated_date(self): self.wait_for_element_to_be_displayed(self._last_updated_date_locator) return self.find_element(*self._last_updated_date_locator) @property def next_article(self): self.wait_for_element_to_be_displayed(self._next_article_link_locator) return self.find_element(*self._next_article_link_locator) @property def previous_article(self): self.wait_for_element_to_be_displayed(self._previous_article_link_locator) return self.find_element(*self._previous_article_link_locator) @property def author(self): return self.Author(self, self.find_element(*self._author_info_section_locator)) class Author(Region): _name_locator = (By.CSS_SELECTOR, "dd.author") _picture_locator = (By.CSS_SELECTOR, ".author-avatar > img") _twitter_link_locator = (By.CLASS_NAME, "share-twitter-link") _pocket_link_locator = (By.CLASS_NAME, "share-pocket-link") @property def name(self): self.wait.until(EC.visibility_of_element_located(self._name_locator)) return self.find_element(*self._name_locator) @property def picture(self): self.wait.until(EC.visibility_of_element_located(self._picture_locator)) return self.find_element(*self._picture_locator) @property def twitter_link(self): self.wait.until( EC.visibility_of_element_located(self._twitter_link_locator) ) return self.find_element(*self._twitter_link_locator) @property def pocket_link(self): self.wait.until(EC.visibility_of_element_located(self._pocket_link_locator)) return self.find_element(*self._pocket_link_locator) @property def addon_cards(self): return [ self.AddonCard(self, el) for el in self.find_elements(*self._static_addon_card_locator) ] class AddonCard(Region): _title_locator = (By.CSS_SELECTOR, ".AddonTitle > a") _author_locator = (By.CSS_SELECTOR, ".AddonTitle-author > a") _summary_locator = (By.CLASS_NAME, "StaticAddonCard-summary") _rating_locator = (By.CLASS_NAME, "Rating") _users_number_locator = (By.CLASS_NAME, "StaticAddonCard-metadata-adu") _add_to_firefox_button_locator = (By.CLASS_NAME, "GetFirefoxButton-button") _recommended_badge_link_locator = ( By.CLASS_NAME, "PromotedBadge-link--recommended", ) @property def title(self): self.wait.until(EC.visibility_of_element_located(self._title_locator)) return self.find_element(*self._title_locator) @property def author(self): self.wait.until(EC.visibility_of_element_located(self._author_locator)) return self.find_element(*self._author_locator) @property def summary(self): self.wait.until(EC.visibility_of_element_located(self._summary_locator)) return self.find_element(*self._summary_locator).text @property def rating(self): self.wait.until(EC.visibility_of_element_located(self._rating_locator)) rating = self.find_element(*self._rating_locator).get_attribute("title") if "There are no ratings yet" in rating: return 0 return float(rating.split()[1]) @property def users_number(self): self.wait.until( EC.visibility_of_element_located(self._users_number_locator) ) return int( self.find_element(*self._users_number_locator) .text.split("Users: ")[1] .replace(",", "") ) @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) @property def is_recommended(self): try: assert self.find_element( *self._recommended_badge_link_locator ).is_displayed() return True except NoSuchElementException: return False @property def recommended_link(self): self.wait.until( EC.visibility_of_element_located(self._recommended_badge_link_locator) ) return self.find_element(*self._recommended_badge_link_locator)