Skip to main content

Base implementation of Page Object Model

Project description

GitHub Workflow Status (with event) PyPI PyPI - Status PyPI - Python Version PyPI - License PyPI - Downloads Code style: black Imports: isort

Pomcorn, or Page Object Model corn, is a Python package that contains base classes to create systems based on Selenium framework and Page Object Model pattern. You can read more about this pattern here. The package can be used to create autotesting systems, parsing scripts and anything that requires interaction with the browser.

The package includes next base classes to create Page Object Model (POM) pages:

Class diagram

It also includes classes to locate elements on the web page and a number of additional waiting conditions.

Installation

You can install it by pip:

$ pip install pomcorn

Or poetry:

$ poetry add pomcorn

Documentation

Link to the documentation: http://pomcorn.rtfd.io/.

Usage

You need to install pomcorn and Chrome webdriver.

Below is the code that opens PyPI.org, searches for packages by name and prints names of found packages to the terminal. The script contains all base classes contained in pomcorn: Page, ComponentWithBaseLocator, ListComponent and Element.

from typing import Self

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.remote.webdriver import WebDriver

from pomcorn import ComponentWithBaseLocator, Element, ListComponent, Page, locators


# Prepare base page
class PyPIPage(Page):

    APP_ROOT = "https://pypi.org"

    def check_page_is_loaded(self) -> bool:
        return self.init_element(locator=locators.TagNameLocator("main")).is_displayed

    @property
    def search(self) -> Element[locators.XPathLocator]:
        return self.init_element(locator=locators.IdLocator("search"))


# Prepare components
Package = ComponentWithBaseLocator[PyPIPage]


class PackageList(ListComponent[Package, PyPIPage]):

    item_class = Package

    @property
    def base_item_locator(self) -> locators.XPathLocator:
        return self.base_locator // locators.ClassLocator("snippet__name")

    @property
    def names(self) -> list[str]:
        return [package.body.get_text() for package in self.all]


# Prepare search page
class SearchPage(PyPIPage):

    @classmethod
    def open(cls, webdriver: WebDriver, **kwargs) -> Self:
        pypi_page = super().open(webdriver, **kwargs)
        # Specific logic for PyPI for an open search page
        pypi_page.search.fill("")
        pypi_page.search.send_keys(Keys.ENTER)
        return cls(webdriver, **kwargs)

    @property
    def results(self) -> PackageList:
        return PackageList(
            page=self,
            base_locator=locators.PropertyLocator(
                prop="aria-label",
                value="Search results",
            ),
        )

    def find(self, query: str) -> PackageList:
        self.search.fill(query)
        self.search.send_keys(Keys.ENTER)
        return self.results


search_page = SearchPage.open(webdriver=Chrome())
print(search_page.find("saritasa").names)

For more information about package classes, you can read in Object Hierarchy and Developer Interface.

Also you can try our demo autotests project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pomcorn-0.3.0.tar.gz (17.5 kB view hashes)

Uploaded Source

Built Distribution

pomcorn-0.3.0-py3-none-any.whl (17.8 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page