"""The technology page."""
from time import sleep
from pypom import Region
from selenium.webdriver.common.by import By
from pages.web.base import WebBase
from pages.web.book import Book
from utils.utilities import Utility, go_to_
from utils.web import Library, WebException
[docs]class Technology(WebBase):
"""The technology options page."""
URL_TEMPLATE = '/technology'
_title_locator = (By.CSS_SELECTOR, '#banner h1')
_description_locator = (By.CSS_SELECTOR, '.description p')
_learn_more_locator = (By.CSS_SELECTOR, '.description ~ a')
_resources_locator = (By.CSS_SELECTOR, '#steps')
_tutor_locator = (By.CSS_SELECTOR, '#tutor')
@property
def loaded(self):
"""Override the base loader."""
return self.find_element(*self._title_locator)
[docs] def is_displayed(self):
"""Return True if the technology page is displayed."""
return self.find_element(*self._title_locator).is_displayed()
@property
def title(self):
"""Return the page title."""
return self.find_element(*self._title_locator).text.strip()
@property
def description(self):
"""Return the page subheading text."""
return self.find_element(*self._description_locator).text.strip()
[docs] def learn_more(self):
"""Click the banner page link."""
Utility.click_option(self.driver, self._learn_more_locator)
return self
@property
def resources(self):
"""Access the Steps section."""
return self.Steps(self)
@property
def tutor(self):
"""Access the OpenStax Tutor beta section."""
return self.Tutor(self)
[docs] class Steps(Region):
"""Resource access steps."""
INSTRUCTOR = '.step:nth-child(2) '
TECHNOLOGY = '.step:last-child '
BOOK = '[data-value={book}]'
_title_locator = (By.CSS_SELECTOR, 'h2')
_proxy_select_locator = (By.CSS_SELECTOR, '.proxy-select')
_option_list_locator = (By.CSS_SELECTOR, '.proxy-select ul')
_instructor_border_locator = (By.CSS_SELECTOR, INSTRUCTOR + 'div')
_instructor_link_locator = (By.CSS_SELECTOR, INSTRUCTOR + 'a')
_technology_link_locator = (By.CSS_SELECTOR, TECHNOLOGY + 'a')
_partner_resource_locator = (By.CSS_SELECTOR, '#technology-options h2')
_details_tab_locator = (By.CSS_SELECTOR, '.details-tab')
_instructor_resources_tab_locator = (
By.CSS_SELECTOR, '.instructor-resources')
_student_resources_tab_locator = (
By.CSS_SELECTOR, '.student-resources')
_partner_resources_tab_locator = (By.CSS_SELECTOR, '.partners-tab')
@property
def title(self):
"""Return the resource heading text."""
return self.title_box.text.strip()
@property
def title_box(self):
"""Return the resource heading element."""
return self.find_element(*self._title_locator)
[docs] def select_book(self, book):
"""Select a book from the proxy menu."""
menu = self.find_element(*self._proxy_select_locator)
options = self.find_element(*self._option_list_locator)
details = Library().get(book, Library.DETAILS)
option = self.find_element(
By.CSS_SELECTOR, f'[data-value={details}]')
offset = self.driver.execute_script(
'return arguments[0].offsetTop;',
option)
if 'open' not in menu.get_attribute('class'):
Utility.click_option(self.driver, element=menu)
self.driver.execute_script(
'arguments[0].scrollTop = {offset};'.format(offset=offset),
options)
sleep(0.2)
Utility.click_option(self.driver,
element=option,
force_js_click=True)
return self.page
[docs] def view_instructor_resources(self):
"""Click the instructor resource link."""
return self._selection_helper(self._instructor_link_locator)
[docs] def view_technology_options(self):
"""Click the technology options link."""
return self._selection_helper(self._technology_link_locator)
@property
def book_selected(self):
"""Return the resource link border stylings."""
link_border = self.find_element(*self._instructor_border_locator)
return ('dimmed' not in link_border.get_attribute('class'))
def _selection_helper(self, link, tab='book-details'):
"""Select the book reference link."""
if not self.book_selected:
raise WebException('No book selected')
book = self.find_element(*link)
book_title = (book.get_attribute('href')
.split('/')[-1].split('?')[0])
Utility.switch_to(self.driver, element=book)
self.wait.until(
lambda _: (
sleep(4) or (
self.find_elements(
*self._details_tab_locator) or
self.find_elements(
*self._instructor_resources_tab_locator) or
self.find_elements(
*self._student_resources_tab_locator) or
self.find_elements(
*self._partner_resources_tab_locator))))
return go_to_(Book(self.driver, self.page.base_url,
book_name=book_title))
[docs] class Tutor(Region):
"""Tutor information."""
_title_locator = (By.CSS_SELECTOR, 'h1')
_subheading_locator = (By.CSS_SELECTOR, 'h2')
_description_locator = (
By.CSS_SELECTOR, '[data-html="tutor.description"] p')
_how_it_works_locator = (By.CSS_SELECTOR, '[href*="#how-it-works"]')
_tutor_dashboard_locator = (By.CSS_SELECTOR, '[href$=dashboard]')
@property
def title(self):
"""Return the section banner title."""
return self.find_element(*self._title_locator).text.strip()
@property
def heading(self):
"""Return the heading text."""
return self.find_element(*self._subheading_locator).text.strip()
@property
def description(self):
"""Return the description text."""
return self.find_element(*self._description_locator).text.strip()
[docs] def learn_more(self):
"""Click the 'Learn more' button."""
Utility.click_option(
self.driver, self._how_it_works_locator)
from pages.web.tutor import TutorMarketing
return go_to_(TutorMarketing(self.driver, self.page.base_url))
[docs] def go_to_openstax_tutor(self, base_url=None):
"""Click the 'Go to OpenStax Tutor' button."""
Utility.switch_to(self.driver, self._tutor_dashboard_locator)
if self.page.is_safari:
sleep(2.0)
self.wait.until(lambda _:
'accounts' in self.driver.current_url or
'tutor' in self.driver.current_url)
if 'accounts' in self.driver.current_url:
from pages.accounts.home import AccountsHome
return go_to_(AccountsHome(self.driver, base_url=base_url))
from pages.tutor.dashboard import Dashboard
return go_to_(Dashboard(self.driver, base_url=base_url))