Skip to main content

A Page Object Model DSL for Python, inspired by Ruby SitePrism

Project description

inspired by Ruby SitePrism https://github.com/site-prism/site_prism

Synopsis

Here’s an overview of how PytePrism is designed to be used:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from pyte_prism import Page, PageSection, Element, Section, Sections

class Menu(PageSection):
  gmail = Element(By.XPATH, "//a[text()='Gmail']")
  images = Element(By.XPATH, "//a[text()='Images']")

class SearchResult(PageSection):
  title = Element(By.CSS_SELECTOR, "div.r > a > h3")
  title_link = Element(By.CSS_SELECTOR, "div.r > a")
  blurb = Element(By.CSS_SELECTOR, "div.s > div > span")

class Home(Page):
  _url = "https://www.google.com/"

  search_field = Element(By.CSS_SELECTOR, "input[name='q'")
  search_button = Element(By.CSS_SELECTOR, "div.FPdoLc.tfB0Bf input[name='btnK']")
  footer_links = Element(By.CSS_SELECTOR, "#footer a")
  menu = Section(Menu, By.CSS_SELECTOR, "#gbw")

class SearchResults(Page):
  _url_matcher = "https://www.google.com/results\?.*"

  menu = Section(Menu, By.CSS_SELECTOR, "#gbw")
  search_results = Sections(SearchResult, By.CSS_SELECTOR, "#search > div > div > div.g")

  def search_result_links(self):
    return [result.title.get_attribute('href') for result in self.search_results]

def main():
  driver = webdriver.Chrome()

  home = Home(driver)
  home.load()
  home.wait_until_menu_visible()  # menu loads after a second or 2, give it time to arrive

  print(home.has_menu())          #=> True
  print(home.has_search_field())  #=> True
  print(home.has_search_button()) #=> True

  home.search_field.send_keys("Sausages")
  home.search_field.send_keys(Keys.ESCAPE) # Close suggestion box
  home.wait_until_search_button_visible()  # Wait until suggestion box close
  home.search_button.click()

  results_page = SearchResults(driver)
  results_page.is_loaded()  #=> True ( Does _url_matcher matches current_url? )
  results_page.wait_until_search_results_visible(timeout=30)  # default timeout is 10 sec
  print(len(results_page.search_results))  #=> about 10

  titles = [result.title.text for result in results_page.search_results]
  links =  [result.title_link.get_attribute('href') for result in results_page.search_results]
  descr =  [result.blurb.text for result in results_page.search_results]

  from pprint import pprint
  pprint(list(zip(titles, links, descr)))
  """
  #=> [('Sausage - Wikipedia', 'https://en.wikipedia.org/wiki/Sausage', 'Sausages are ...'),
  #    ('List of sausages - Wikipedia', 'https://en.wikipedia.org/wiki/List_of_sausages', 'This is a lias of ...'),
  #    ...]
  """

if __name__ == "__main__":
    main()

Requirements

  • Python 3

Features

  • Multiple platforms support: Linux, macOS, Windows

  • Pure python

The Installation

From Pypi with the Python package manager:

pip install pyte-prism

To install the cutting edge version from the git repository:

git clone https://github.com/fkshom/pyte-prism.git
cd pyte-prism
python setup.py install

Examples

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from pyte_prism import Page, PageSection, PageIframe, Element, Section, Sections, Iframe

# Section must inherit PageSection class
class MySection(PageSection):
  title = Element(By.XPATH, "//div[@class='title']")

# Iframe must inherit PageIframe class
class MyIframe(PageIframe):
  title = Element(By.XPATH, "//div[@class='title']")

# Page must inherit Page class
class Home(Page):
  _url = "http://example.com/"                # _url is used by Page.load() method.
  _url_matcher = r"https?://example.com/.*"   # _url_matcher is used by Page.is_loaded() method.

  # definition of element
  go_button = Element(By.ID, "#button")
  keyword_box = Element(By.ID, "#keyword")
  items = Elements(By.CSS_SELECTOR, "ul#items > li")
  section = Setion(MySection, By.ID, "#section")
  sections = Sections(MySection, By.ID, "#sections")   # MySection is not typo
  myiframe = IFrame(MyIframe, BY.ID, "#iframe")

def main():
  driver = webdriver.Chrome()
  home = Home(driver)
  home.load()                    # visit to "_url"
  home.wait_until_page_loaded()  # check current_url is  _url or _url_matcher (if defined)
  home.assert_loaded()           # raise Exception if is_loaded() is False.
  home.wait_until_page_readystate_is_complete(timeout=10)  # wait until javascript readyState is complete.


  # Defined some supported methods automatically
  # home.wait_until_<variablename>_visible()          # None or Exception
  # home.wait_until_<variablename>_invisible()        # None or Exception
  # home.wait_until_<variablename>_to_be_clickable()  # None or Exception
  # home.has_<variablename>()                         # True or False
  # home.has_no_<variablename>()                      # True or False

  home.keyword_box.send_keys('my keyword')            # element is webdriver element.

  home.wait_until_go_button_visible(timeout=30)       # timeout: default 10
  home.go_button.click()

  home.section.title.text
  home.sections[0].title.text

  # swtich to, exit from iframe context automatically
  with home.myiframe as iframe:
    iframe.title.text

Parametrized URLs

PytePrism uses the uritemplate module and therefore allows for parameterization of URLs. see https://uritemplate.readthedocs.io/en/latest/

class Home(Page):
  _url = 'http://example.com/users{/userid}'
  _url_matcher = 'https?://example.com/users.*'

class Home2(Page):
  _url = 'http://example.com/search{?keyword,lang}'
  _url_matcher = 'https?://example.com/search.*'

def main():
  driver = webdriver.Chrome()
  home = Home(driver)
  home.load()             # visit to http://example.com/users
  home.load(userid=100)   # visit to http://example.com/users/100

  home2 = Home2(driver)
  home2.load(keyword='mykeyword', lang='en')   # visit to http://example.com/saearch?keyword=mykeyword&lang=en

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

pyte-prism-0.0.4.tar.gz (7.1 kB view details)

Uploaded Source

Built Distribution

pyte_prism-0.0.4-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file pyte-prism-0.0.4.tar.gz.

File metadata

  • Download URL: pyte-prism-0.0.4.tar.gz
  • Upload date:
  • Size: 7.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.9 CPython/3.8.3 Linux/5.4.0-33-generic

File hashes

Hashes for pyte-prism-0.0.4.tar.gz
Algorithm Hash digest
SHA256 48bdf750d7940a56f7fa5e0e39eea3eec4ad336794772c8cfc8aaea761e73636
MD5 06bba82c4db66558f2e6270789badb36
BLAKE2b-256 10c0f97f48c224f3bc82175f006cc023bc9b4ce50440cb248ce1bab72d5a138f

See more details on using hashes here.

File details

Details for the file pyte_prism-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: pyte_prism-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 5.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.9 CPython/3.8.3 Linux/5.4.0-33-generic

File hashes

Hashes for pyte_prism-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 0324e9e9fb840d489e13baf097454ef4dce8b1eef75d7a9312c23909acbe0f1e
MD5 08c665f96d6636ef08eccc3c210a4bcb
BLAKE2b-256 c5e8571815f34018566f59bb0b8b591797dfc11718d3f18b9b8f6a3591af6c1f

See more details on using hashes here.

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