Skip to content

Commit 1db4a18

Browse files
author
Gaurav Singh
committed
Chapter 8: Organizing tests into batches
Change log: 1. Added a wrapper class called EyesManager which wraps eyes selenium's convenience methods 2. Updated conftest.py file to expose this class as a manager fixture (module level) 3. Added tests and page objects for tables webpage in elemental selenium 4. Added a setup_suite and setup_eyes fixture to set batch info for all the tests in the module and take care of setup/teardown of eyes.
1 parent 4061b0d commit 1db4a18

File tree

8 files changed

+112
-50
lines changed

8 files changed

+112
-50
lines changed

automation/core/__init__.py

Whitespace-only changes.

automation/core/eyes_manager.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from applitools.common import BatchInfo
2+
from applitools.selenium import Eyes
3+
4+
from automation.config.base import APPLITOOLS_API_KEY
5+
6+
7+
class EyesManager:
8+
def __init__(self, driver):
9+
self.app_name = None
10+
self.driver = driver
11+
self.eyes = self.initialize_eyes()
12+
13+
@staticmethod
14+
def initialize_eyes():
15+
eyes = Eyes()
16+
eyes.api_key = APPLITOOLS_API_KEY
17+
return eyes
18+
19+
def set_app_name(self, app_name):
20+
self.app_name = app_name
21+
22+
def set_batch(self, batch_name):
23+
if batch_name:
24+
batch_info = BatchInfo(batch_name)
25+
self.eyes.batch = batch_info
26+
27+
def validate_window(self, tag=None, full_page=False):
28+
if full_page:
29+
self.eyes.force_full_page_screenshot = True
30+
31+
self.eyes.check_window(tag=tag)
32+
33+
def validate_element(self, element, tag=None):
34+
self.eyes.check_region(element, tag=tag)
35+
36+
def validate_frame(self, frame_reference, region, tag=None):
37+
self.eyes.check_region_in_frame(frame_reference, region, tag=tag)
38+
39+
def open_eyes(self, test_name):
40+
self.eyes.open(self.driver, self.app_name,
41+
test_name=test_name)
42+
43+
def close_eyes(self):
44+
self.eyes.close()

automation/page_objects/the_internet/__init__.py

Whitespace-only changes.

automation/page_objects/the_internet/tables/__init__.py

Whitespace-only changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from time import sleep
2+
from selenium.webdriver.common.by import By
3+
4+
5+
class SortableTablePage:
6+
BASE_HEADER = '//table[@id="table1"]/descendant::span[text()="{}"]/parent::th'
7+
FIRST_NAME = (
8+
By.XPATH, BASE_HEADER.format('First Name'))
9+
LAST_NAME = (
10+
By.XPATH, BASE_HEADER.format("Last Name"))
11+
12+
def __init__(self, driver):
13+
self.driver = driver
14+
15+
def sort_by_first_name(self):
16+
locator = self.FIRST_NAME
17+
self.driver.find_element(*locator).click()
18+
sleep(5)
19+
20+
def sort_by_last_name(self):
21+
locator = self.LAST_NAME
22+
self.driver.find_element(*locator).click()
23+
sleep(5)

automation/tests/chapter_08/__init__.py

Whitespace-only changes.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import pytest
2+
3+
from automation.page_objects.the_internet.tables.sortable_tables import \
4+
SortableTablePage
5+
6+
7+
@pytest.fixture(scope='module')
8+
def setup_suite(manager, driver):
9+
app_name = 'the-internet'
10+
app_under_test = 'https://the-internet.herokuapp.com/tables'
11+
12+
manager.set_batch('sortable table test suite')
13+
manager.set_app_name(app_name)
14+
15+
driver.get(app_under_test)
16+
driver.maximize_window()
17+
18+
19+
@pytest.fixture(scope='function', autouse=True)
20+
def setup_eyes(request, setup_suite, manager):
21+
test_name = request.function.__name__
22+
manager.open_eyes(test_name)
23+
yield setup_eyes
24+
manager.close_eyes()
25+
26+
27+
def test_sort_by_first_name(manager):
28+
page = SortableTablePage(manager.driver)
29+
page.sort_by_first_name()
30+
31+
manager.validate_window(tag='by_first_name')
32+
33+
34+
def test_sort_by_last_name(manager):
35+
page = SortableTablePage(manager.driver)
36+
page.sort_by_last_name()
37+
38+
manager.validate_window(tag='by_last_name')

automation/tests/conftest.py

Lines changed: 7 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,17 @@
11
import pytest
2-
from applitools.selenium import Eyes
32
from selenium import webdriver
43

5-
from automation.config.base import APPLITOOLS_API_KEY
4+
from automation.core.eyes_manager import EyesManager
65

7-
APP_NAME = 'the-internet'
8-
APP_UNDER_TEST = 'https://the-internet.herokuapp.com/iframe'
96

7+
@pytest.fixture(scope='module')
8+
def manager(driver):
9+
eyes_manager = EyesManager(driver)
10+
yield eyes_manager
1011

11-
@pytest.fixture(scope='function')
12+
13+
@pytest.fixture(scope='module')
1214
def driver():
1315
driver = webdriver.Chrome()
14-
driver.get(APP_UNDER_TEST)
1516
yield driver
1617
driver.quit()
17-
18-
19-
@pytest.fixture(scope='function')
20-
def eyes():
21-
eyes = initialize_eyes()
22-
yield eyes
23-
24-
25-
def initialize_eyes():
26-
eyes = Eyes()
27-
eyes.api_key = APPLITOOLS_API_KEY
28-
return eyes
29-
30-
31-
def validate_window(driver, eyes, tag=None):
32-
open_eyes(driver, eyes)
33-
eyes.force_full_page_screenshot = True
34-
eyes.check_window(tag=tag)
35-
close_eyes(eyes)
36-
37-
38-
def validate_element(driver, eyes, element, tag=None):
39-
open_eyes(driver, eyes)
40-
eyes.check_region(element, tag=tag)
41-
close_eyes(eyes)
42-
43-
44-
def validate_frame(driver, eyes, frame_reference, region, tag=None):
45-
open_eyes(driver, eyes)
46-
eyes.check_region_in_frame(frame_reference, region, tag=tag)
47-
close_eyes(eyes)
48-
49-
50-
def open_eyes(driver, eyes):
51-
eyes.open(driver, APP_NAME, test_name=get_test_name())
52-
53-
54-
def get_test_name():
55-
import inspect
56-
return inspect.stack()[3].function
57-
58-
59-
def close_eyes(eyes):
60-
eyes.close()

0 commit comments

Comments
 (0)