Skip to content

danclaudiupop/selenium-elements

Repository files navigation

Overview

tests
Travis-CI Build Status Dependabot Coverage Status
package
PyPI Package latest release PyPI Wheel Supported versions Supported implementations
Commits since latest release

Page object model made easy.

  • Free software: BSD 2-Clause License

Installation

pip install selenium-elements

Documentation

To use the project:

from contextlib import contextmanager

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import staleness_of
from selenium.webdriver.support.wait import WebDriverWait

from selenium_elements.conditions import clickable
from selenium_elements.elements import PageElement, PageElements, RegionElements
from selenium_elements.page import Page, Region
from selenium_elements.validators import title_matches, url_contains


@contextmanager
def wait_for_page_load(driver, timeout=30):
    old_page = driver.find_element_by_tag_name("html")
    yield
    WebDriverWait(driver, timeout).until(staleness_of(old_page))


class Show(Page):
    path = "/show/{show_slug}/"
    validators = [title_matches("^[a-zA-Z]+ | PBS$"), url_contains("pbs.org/")]

    official_website_btn = PageElement(By.CLASS_NAME, "btn--visit", condition=clickable)

    @property
    def official_website_link(self):
        return self.official_website_btn.get_attribute("href")


class PromoShowRegion(Region):
    title_element = PageElement(By.CLASS_NAME, "carousel--show-strip__image-link")

    def open(self):
        with wait_for_page_load(self.driver):
            self.title_element.click()
        return Show(driver=self.driver, base_url=self.base_url, visit=False)

    def title(self):
        return self.title_element.get_attribute("data-gtm-label")


class Home(Page):
    path = "/"
    load_timeout = 30
    validators = [
        title_matches("^PBS: Public Broadcasting Service$"),
        url_contains("pbs.org/"),
    ]

    promo_show_elements = PageElements(
        By.CLASS_NAME, "show-promo", find_on_page_load=True
    )
    promo_shows = RegionElements(
        region_class=PromoShowRegion, root_element=promo_show_elements
    )


@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()


def test_foo(driver):
    home = Home(driver=driver, base_url="https://www.pbs.org")
    for show in home.promo_shows:
        print(show.title())
    show = home.promo_shows[0].open()
    print(show.official_website_link)
    assert True

About

Page object models using declarative class attributes

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published