Skip to content

Commit 9ea0d26

Browse files
author
dmy.berezovskyi
committed
improved project structure and added logging
1 parent c0ad57f commit 9ea0d26

10 files changed

Lines changed: 48 additions & 57 deletions

File tree

config/caps.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# config/capabilities.yaml
2+
chrome:
3+
browserName: "chrome"
4+
version: "latest"
5+
platform: "MAC"
6+
enableVNC: true
7+
enableVideo: false
8+
9+
firefox:
10+
browserName: "firefox"
11+
version: "latest"
12+
platform: "MAC"
13+
enableVNC: true
14+
enableVideo: false

conftest.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import pytest
2-
import sys
32
import os
43

54
from dotenv import load_dotenv
65
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver
76

8-
from utils.event_listener import EventListener
9-
from driver.driver_factory import WebDriverFactory
7+
from core.event_listener import EventListener
8+
from core.driver_factory import WebDriverFactory
109
from utils.logger import Logger, LogLevel
1110

1211
log = Logger(log_lvl=LogLevel.INFO).get_instance()

driver/driver.py renamed to core/driver.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
from abc import ABC, abstractmethod
33

44
from selenium import webdriver
5-
from selenium.common import WebDriverException
65
from selenium.webdriver.chrome.service import Service as ChromeService
76
from selenium.webdriver.remote.remote_connection import RemoteConnection
87
from webdriver_manager.chrome import ChromeDriverManager
98

10-
from driver.driver_options import _init_driver_options
9+
from core.driver_options import _init_driver_options
10+
from utils.error_handler import ErrorHandler, ErrorType
1111
from utils.logger import Logger, LogLevel
1212
from properties import Properties
1313
from utils.yaml_reader import YamlReader
@@ -16,21 +16,15 @@
1616

1717

1818
def _get_driver_path(driver_type=None):
19-
# Check if driver_type is provided
2019
if driver_type is None:
21-
raise ValueError("Driver type must be specified.")
20+
ErrorHandler.raise_error(ErrorType.UNSUPPORTED_DRIVER_TYPE)
2221

2322
project_dir = os.path.dirname(
24-
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
25-
)
23+
os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
2624
driver_path = os.path.join(project_dir, "resources", driver_type)
2725

28-
# Check if the driver file exists
2926
if not os.path.exists(driver_path):
30-
raise WebDriverException(
31-
f"WebDriver binary not found at {driver_path}. "
32-
f"Please ensure it exists the driver {driver_type} in directory."
33-
)
27+
ErrorHandler.raise_error(ErrorType.DRIVER_NOT_FOUND, driver_type)
3428

3529
return driver_path
3630

@@ -57,11 +51,13 @@ def create_driver(self, environment=None, dr_type=None):
5751
"""Tries to use ChromeDriverManager to install the latest driver,
5852
and if it fails, it falls back to a locally stored driver in resources."""
5953
try:
60-
driver_path = ChromeDriverManager().install() # No need for ChromeType
54+
log.info(f"Run local chrome driver")
55+
driver_path = ChromeDriverManager().install()
6156
driver = webdriver.Chrome(
62-
service=ChromeService(executable_path=driver_path))
57+
service=ChromeService(executable_path=driver_path),
58+
options=_init_driver_options(dr_type=dr_type))
6359
except Exception as e:
64-
log.error(f"Run local driver: {e}")
60+
log.info(f"Run local driver: {e}")
6561
driver = webdriver.Chrome(
6662
service=ChromeService(_get_driver_path(dr_type)),
6763
options=_init_driver_options(dr_type=dr_type),
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
from driver.driver import ChromeRemoteDriver, FirefoxDriver, LocalDriver
1+
from core.driver import ChromeRemoteDriver, FirefoxDriver, LocalDriver
22
from utils.error_handler import ErrorHandler, ErrorType
3+
from utils.logger import Logger, LogLevel
4+
5+
log = Logger(log_lvl=LogLevel.INFO).get_instance()
36

47

58
class WebDriverFactory:
@@ -11,6 +14,7 @@ class WebDriverFactory:
1114

1215
@staticmethod
1316
def create_driver(environment=None, driver_type="local"):
17+
log.info(f"Creating driver {driver_type}")
1418
driver_type = driver_type.lower()
1519
if driver_type in WebDriverFactory.DRIVER_MAPPING:
1620
driver_class = WebDriverFactory.DRIVER_MAPPING[driver_type]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ def _init_driver_options(dr_type=None):
3333
)
3434

3535
_shared_driver_options(options)
36+
log.info(f"Driver options {options.arguments}")
3637
return options

core/event_listener.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from selenium.webdriver.support.abstract_event_listener import (
2+
AbstractEventListener
3+
)
4+
5+
6+
class EventListener(AbstractEventListener):
7+
"""Custom event listener for WebDriver"""
8+
9+
def after_click(self, element, driver):
10+
print(f"Clicked on {element.tag_name} at location {element.location}")
11+
12+
def on_exception(self, exception, driver):
13+
print(f"Exception occurred: {exception}")
14+
driver.save_screenshot("exception.png")

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ readme = "README.md"
77
packages = [
88
{ include = "utils" },
99
{ include = "scraper" },
10-
{ include = "driver" },
10+
{ include = "core" }
1111
]
1212
[tool.poetry.dependencies]
1313
python = "^3.12"

resources/caps.yaml

Lines changed: 0 additions & 6 deletions
This file was deleted.

utils/event_listener.py

Lines changed: 0 additions & 31 deletions
This file was deleted.

utils/yaml_reader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def read_caps(browser="chrome", filename="caps.yaml"):
88
try:
99
# Get the path to the resources folder from the script's directory
1010
resources_path = (
11-
Path(__file__).resolve().parent.parent.parent / "resources"
11+
Path(__file__).resolve().parent.parent.parent / "config"
1212
)
1313
abs_path = resources_path / filename
1414

0 commit comments

Comments
 (0)