Source code for pages.web.partners

"""OpenStax Partners."""

from time import sleep

from pypom import Region
from selenium.webdriver.common.by import By

from pages.web.base import WebBase
from utils.utilities import Utility
from utils.web import TechProviders, Web


[docs]class Institutional(WebBase): """The OpenStax Institutional Partners page.""" URL_TEMPLATE = '/institutional-partnership' _title_locator = (By.CSS_SELECTOR, '.banner h1') @property def loaded(self) -> bool: """Return True when the page is loaded. :return: ``True`` when the async hide class is not found, the template URL is in use, and the title banner is found :rtype: bool """ return (super().loaded and self.URL_TEMPLATE in self.location and bool(self.find_elements(*self._title_locator)))
[docs] def is_displayed(self) -> bool: """Return True when the page is displayed. :return: ``True`` when the page is loaded and the title is found :rtype: bool """ title = self.find_elements(*self._title_locator) if not title: return False return self.loaded and 'Institutional' in title[0].text
[docs]class Partners(WebBase): """The OpenStax Partners page.""" URL_TEMPLATE = '/partners' _title_locator = (By.CSS_SELECTOR, '.hero h1') _image_locator = (By.CSS_SELECTOR, 'img') _description_locator = ( By.CSS_SELECTOR, '.hero .text-content p:nth-child(2)') _logo_locator = (By.CSS_SELECTOR, '.ally-logo') _logo_description_locator = (By.CSS_SELECTOR, '.logo-text') _filter_button_locator = (By.CSS_SELECTOR, '.filter-button') _current_filter_locator = (By.CSS_SELECTOR, '[aria-pressed=true]') _company_locator = (By.CSS_SELECTOR, '.icons .logo:not(.spacer)') _summary_locator = (By.CSS_SELECTOR, '.text[id$=blurb]') @property def loaded(self): """Return True if the title is set and images are visible.""" return ('OpenStax Tech Scout' in self.title and Utility.is_image_visible(self.driver, locator=self._image_locator))
[docs] def is_displayed(self): """Return True if the hero banner is displayed.""" return self.banner.is_displayed()
@property def banner(self): """Return the page heading object.""" return self.find_element(*self._title_locator) @property def title(self): """Return the banner text.""" return self.banner.text @property def description(self): """Return the subheading.""" return self.find_element(*self._description_locator).text @property def logo(self): """Return the OpenStax Ally logo.""" return self.find_element(*self._logo_locator) @property def logo_description(self): """Return the ally logo meaning.""" return self.find_element(*self._logo_description_locator).text
[docs] def filter_by(self, option): """Filter allies by a subject.""" if option != self.current_filter: Utility.click_option(self.driver, element=self.filter) Utility.click_option( self.driver, element=self.filter_buttons[Web.PARTNER_FILTERS.get(option)]) return self
@property def filter(self): """Return the currently selected filter button.""" return self.find_element(*self._current_filter_locator) @property def current_filter(self): """Return the current filter.""" return self.filter.text @property def filter_buttons(self): """Access the subject filter buttons.""" return self.find_elements(*self._filter_button_locator) @property def companies(self): """Access the OpenStax Ally companies by their logos.""" return [self.Company(self, logo) for logo in self.find_elements(*self._company_locator)] @property def summaries(self): """Access the OpenStax Ally company summaries.""" return [self.Summary(self, company) for company in self.find_elements(*self._summary_locator)]
[docs] def summary_by_name(self, name): """Return the summary for a particular company name.""" for summary in self.summaries: if summary.name == name: return summary raise(ValueError('"{0}" not in the company summary list'.format(name)))
[docs] class Company(Region): """A company logo and summary link.""" _logo_locator = (By.CSS_SELECTOR, 'img') _link_locator = (By.CSS_SELECTOR, 'a') @property def name(self): """Return the company name.""" return self.logo.get_attribute('alt') @property def logo(self): """Return the company logo.""" return self.find_element(*self._logo_locator) @property def link(self): """Return the anchor link to the company's summary.""" return self.find_element(*self._link_locator)
[docs] def view(self): """Click the company logo.""" Utility.click_option(self.driver, element=self.link) sleep(1.5) return self.page
[docs] class Summary(Region): """An OpenStax Ally company summary.""" _name_locator = (By.CSS_SELECTOR, 'h3') _description_locator = (By.CSS_SELECTOR, '[data-html$=description] p') _availability_locator = (By.CSS_SELECTOR, 'a') _return_locator = (By.CSS_SELECTOR, '.to-top') @property def name(self): """Return the company name.""" return self.header.text @property def header(self): """Return the company name object.""" return self.find_element(*self._name_locator) @property def description_segments(self): """Return the pared list of description paragraphs.""" return [paragraph for paragraph in self.find_elements(*self._description_locator) if paragraph.text.strip()] @property def description(self): """Return the full company description.""" return '\n'.join(list( [paragraph.text for paragraph in self.description_segments])) @property def availability(self): """Return the links to the resources available for an ally.""" if self.name == TechProviders.OPEN_TEXTBOOK_NETWORK: return [] return [link for link in (self.description_segments[-1] .find_elements(*self._availability_locator)) if 'openstax' in link.get_attribute('href')] @property def return_to_top_link(self): """Return the 'Return to top' link element.""" return self.find_element(*self._return_locator)
[docs] def return_to_top(self): """Click the 'Return to top' link.""" Utility.click_option(self.driver, element=self.return_to_top_link) sleep(1.5) return self.page