Page Object Example

Test case

test.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# coding: utf-8

import os

from contesto import ContestoTestCase, config
from examples.page import CityPage

config.add_config_file(os.path.join(os.path.dirname(__file__), "config.ini"))


class TestExample(ContestoTestCase):
    def setUp(self):
        super(TestExample, self).setUp()
        self.driver.get("http://2gis.ru")
        self.page = CityPage(self.driver)

    def test_example(self):
        self.page.search_bar().search("1")
        results_count = self.page.search_results().results_count()
        self.assertGreater(results_count, 0)

Page

page.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from contesto import Page, Component, find_element, by, step, Step


class SearchResults(Component):
    _header = by.class_name("mixedResults__header")

    def header(self):
        return find_element(self.element, self._header)

    def results_count(self):
        header_text = self.header().text
        count = ''.join(x for x in header_text if x.isdigit())
        return int(count)


class SearchBar(Component):
    _search_field = by.css_selector(".searchBar__textfield._directory .suggest__input")
    _search_submit_button = by.css_selector(".searchBar__submit._directory")

    def __init__(self, driver, element):
        self.register_onload_elements([
            self._search_field,
            self._search_submit_button
        ])
        super(SearchBar, self).__init__(driver, element)

    def search_field(self):
        return find_element(self.element, self._search_field)

    def search_submit_button(self):
        return find_element(self.element, self._search_submit_button)

    @step("searching for {text}")
    def search(self, text):
        with Step("entering text %s" % text):
            self.search_field().send_keys(text)

        with Step("submitting search"):
            self.search_submit_button().click()


class CityPage(Page):
    _search_bar = by.class_name("online__searchBar")
    _search_results = by.class_name("mixedResults")

    def __init__(self, driver):
        self.register_onload_elements([self._search_bar])
        super(CityPage, self).__init__(driver)

    def search_bar(self):
        return SearchBar(self.driver, find_element(self.driver, self._search_bar))

    def search_results(self):
        return SearchResults(self.driver, find_element(self.driver, self._search_results))