Skip to content

Commit 1e7c24f

Browse files
authored
Merge pull request #9 from startrug/SPF-05-cfg
SPF-05-cfg: Add config.json, extend driver_factory.py
2 parents acdd47a + 2e5aef6 commit 1e7c24f

File tree

8 files changed

+83
-21
lines changed

8 files changed

+83
-21
lines changed

config.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"browser": "firefox",
3+
"headless_mode": true,
4+
"tested_page": "http://www.phptravels.net/",
5+
"timeout": 10
6+
}

helpers/web_driver_listener.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
class WebDriverListener(AbstractEventListener):
1515
def __init__(self):
1616
self.logger = logging.getLogger("selenium")
17-
self.logger.setLevel(logging.INFO)
1817

1918
def before_navigate_to(self, url, driver):
2019
self.logger.info(f"Navigating to {url}")
@@ -25,7 +24,7 @@ def after_navigate_to(self, url, driver):
2524
def before_find(self, by, value, driver):
2625
self.logger.info(f"Searching for element by {by} {value}")
2726

28-
def after_find(self,by, value, driver):
27+
def after_find(self, by, value, driver):
2928
self.logger.info(f"Element by {by} {value} found")
3029

3130
def before_click(self, element, driver):

pages/base_page.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class BasePage:
2+
def __init__(self, driver):
3+
self.driver = driver
4+
5+
def open_home_page(self, config):
6+
self.driver.get(config["tested_page"])

pages/login_page.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import allure
22
from selenium.webdriver.common.keys import Keys
33
from locators.locators import LogInLocators
4+
from pages.base_page import BasePage
45

56

6-
class LogInPage:
7+
class LogInPage(BasePage):
78
def __init__(self, driver):
8-
self.driver = driver
9-
10-
@allure.step("Opening phptravels.net website")
11-
def open_page(self):
12-
self.driver.get("http://www.phptravels.net/")
9+
super().__init__(driver)
1310

1411
@allure.step("Expanding account menu")
1512
def expand_account_menu(self):

requirements.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,27 @@ allure-pytest==2.8.6
22
allure-python-commons==2.8.6
33
atomicwrites==1.3.0
44
attrs==19.3.0
5-
certifi==2019.9.11
5+
certifi==2020.12.5
66
chardet==3.0.4
77
colorama==0.4.1
88
configparser==4.0.2
99
crayons==0.3.0
1010
idna==2.8
1111
importlib-metadata==0.23
12+
iniconfig==1.1.1
1213
more-itertools==7.2.0
14+
msedge-selenium-tools==3.141.3
1315
packaging==19.2
1416
pluggy==0.13.0
15-
py==1.8.0
17+
py==1.10.0
1618
pyparsing==2.4.4
1719
pytest==5.2.2
1820
requests==2.22.0
1921
selenium==3.141.0
2022
six==1.13.0
23+
toml==0.10.2
2124
urllib3==1.25.6
2225
wcwidth==0.1.7
23-
webdriver-manager==2.2.0
26+
webdriver-manager==3.4.0
2427
xlrd==1.2.0
2528
zipp==0.6.0

tests/conftest.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,50 @@
1+
import json
2+
13
import allure
24
import pytest
35
from allure_commons.types import AttachmentType
6+
47
from utils.driver_factory import DriverFactory
58

9+
CONFIG_PATH = "../config.json"
10+
DEFAULT_WAIT_TIME = 10
11+
SUPPORTED_BROWSERS = ["chrome", "firefox", "edge"]
12+
DEFAULT_WEBSITE = "http://www.google.com/"
13+
14+
15+
@pytest.fixture(scope='session')
16+
def config():
17+
config_file = open(CONFIG_PATH)
18+
return json.load(config_file)
19+
20+
21+
@pytest.fixture(scope="session")
22+
def browser_setup(config):
23+
if "browser" not in config:
24+
raise Exception('The config file does not contain "browser"')
25+
elif config["browser"] not in SUPPORTED_BROWSERS:
26+
raise Exception(f'"{config["browser"]}" is not a supported browser')
27+
return config["browser"]
28+
29+
30+
@pytest.fixture(scope='session')
31+
def wait_time_setup(config):
32+
return config['wait_time'] if 'wait_time' in config else DEFAULT_WAIT_TIME
33+
34+
35+
@pytest.fixture(scope='session')
36+
def website_setup(config):
37+
return config['tested_page'] if 'tested_page' in config else DEFAULT_WEBSITE
38+
639

740
@pytest.fixture()
8-
def setup(request):
9-
driver = DriverFactory.get_driver("chrome")
10-
driver.implicitly_wait(10)
41+
def setup(request, config):
42+
driver = DriverFactory.get_driver(config["browser"], config["headless_mode"])
43+
driver.implicitly_wait(config["timeout"])
1144
request.cls.driver = driver
1245
before_failed = request.session.testsfailed
46+
if config["browser"] == "firefox":
47+
driver.maximize_window()
1348
yield
1449
if request.session.testsfailed != before_failed:
1550
allure.attach(driver.get_screenshot_as_png(), name="Test failed", attachment_type=AttachmentType.PNG)

tests/test_log_in.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
from pages.login_page import LogInPage
55

66

7-
@pytest.mark.usefixtures("setup")
7+
@pytest.mark.usefixtures("setup", "website_setup")
88
class TestLogIn:
99

1010
@allure.title("Login with valid data test")
1111
@allure.description("This is test of login with valid data")
12-
def test_login_passed(self):
12+
def test_login_passed(self, config):
1313
log_in_page = LogInPage(self.driver)
14-
log_in_page.open_page()
14+
log_in_page.open_home_page(config)
1515
log_in_page.expand_account_menu()
1616
log_in_page.open_login_page()
1717
log_in_page.set_user_inputs("[email protected]", "demouser")
@@ -22,9 +22,9 @@ def test_login_passed(self):
2222

2323
@allure.title("Login with invalid email test")
2424
@allure.description("This is test of login with invalid email")
25-
def test_login_failed(self):
25+
def test_login_failed(self, config):
2626
log_in_page = LogInPage(self.driver)
27-
log_in_page.open_page()
27+
log_in_page.open_home_page(config)
2828
log_in_page.expand_account_menu()
2929
log_in_page.open_login_page()
3030
log_in_page.set_user_inputs("[email protected]", "demouser")

utils/driver_factory.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,42 @@
22
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver
33
from webdriver_manager.chrome import ChromeDriverManager
44
from webdriver_manager.firefox import GeckoDriverManager
5+
from webdriver_manager.microsoft import EdgeChromiumDriverManager
56
from helpers.web_driver_listener import WebDriverListener
7+
from msedge.selenium_tools import EdgeOptions, Edge
68

79

810
class DriverFactory:
911
@staticmethod
10-
def get_driver(browser) -> EventFiringWebDriver:
12+
def get_driver(browser, headless_mode=False) -> EventFiringWebDriver:
1113
if browser == "chrome":
1214
options = webdriver.ChromeOptions()
1315
options.add_argument("start-maximized")
16+
if headless_mode is True:
17+
options.add_argument("--headless")
1418
driver = EventFiringWebDriver(
1519
webdriver.Chrome(ChromeDriverManager().install(), options=options),
1620
WebDriverListener()
1721
)
1822
return driver
1923
elif browser == "firefox":
2024
options = webdriver.FirefoxOptions()
21-
options.add_argument("start-maximized")
25+
if headless_mode is True:
26+
options.headless = True
2227
driver = EventFiringWebDriver(
2328
webdriver.Firefox(executable_path=GeckoDriverManager().install(), options=options),
2429
WebDriverListener()
2530
)
2631
return driver
32+
elif browser == "edge":
33+
options = EdgeOptions()
34+
options.use_chromium = True
35+
if headless_mode is True:
36+
options.headless = True
37+
driver_path = EdgeChromiumDriverManager().install()
38+
driver = EventFiringWebDriver(
39+
Edge(executable_path=driver_path, options=options),
40+
WebDriverListener()
41+
)
42+
return driver
2743
raise Exception("Provide valid driver name")

0 commit comments

Comments
 (0)