Skip to content

WebDriver

qa_pytest_webdriver

__all__ = ['SeleniumSteps', 'SeleniumTests', 'SeleniumUiContext', 'SeleniumUiElement'] module-attribute

SeleniumSteps

Bases: UiSteps[SeleniumSteps[TConfiguration]]

BDD-style step definitions for Selenium-based UI operations.

Attributes:

Name Type Description
_ui_context UiContext[UiElement]

The UI context instance used for browser automation.

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_steps.py
10
11
12
13
14
15
16
17
18
19
20
21
22
class SeleniumSteps[TConfiguration: UiConfiguration](
    UiSteps[TConfiguration]
):
    """
    BDD-style step definitions for Selenium-based UI operations.

    Type Parameters:
        TConfiguration: The configuration type, must be a UiConfiguration.

    Attributes:
        _ui_context (UiContext[UiElement]): The UI context instance used for browser automation.
    """
    pass

SeleniumTests

Bases: AbstractTestsBase[SeleniumTests[TSteps], SeleniumTests[TConfiguration]]

Base class for Selenium-based UI test cases.

This class manages the lifecycle of a Selenium WebDriver for each test method. It is generic over the types of steps and configuration used.

Attributes:

Name Type Description
_web_driver WebDriver

The Selenium WebDriver instance (not thread safe).

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_tests.py
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class SeleniumTests[
    TSteps: SeleniumSteps[Any],
    TConfiguration: UiConfiguration
](AbstractTestsBase[TSteps, TConfiguration]):
    """
    Base class for Selenium-based UI test cases.

    This class manages the lifecycle of a Selenium WebDriver for each test method.
    It is generic over the types of steps and configuration used.

    Attributes:
        _web_driver (WebDriver): The Selenium WebDriver instance (not thread safe).

    Type Parameters:
        TSteps: The type of the steps class, typically derived from SeleniumSteps.
        TConfiguration: The type of the configuration class, typically derived from UiConfiguration.
    """
    _web_driver: WebDriver  # not thread safe

    @property
    def ui_context(self) -> UiContext[UiElement]:
        '''
        Returns the web driver instance.

        Returns:
            UiContext[UiElement]: The web driver instance.
        '''
        return SeleniumUiContext(self._web_driver)

    @override
    def setup_method(self):
        '''
        Initializes a local Chrome WebDriver before each test method.

        If you need to customize or use other driver, override this method in your test class.
        '''
        from selenium.webdriver import Chrome
        from selenium.webdriver.chrome.options import Options
        from selenium.webdriver.chrome.service import Service
        from webdriver_manager.chrome import ChromeDriverManager

        super().setup_method()

        options = Options()
        options.add_argument("--start-maximized")
        options.add_argument("--disable-gpu")
        self._web_driver = Chrome(
            options,
            Service(ChromeDriverManager().install()))

    @override
    def teardown_method(self):
        '''
        Quits the Selenium WebDriver after each test method.
        '''
        try:
            self._web_driver.quit()
        finally:
            super().teardown_method()

ui_context property

Returns the web driver instance.

Returns:

Type Description
UiContext[UiElement]

UiContext[UiElement]: The web driver instance.

setup_method()

Initializes a local Chrome WebDriver before each test method.

If you need to customize or use other driver, override this method in your test class.

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_tests.py
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
@override
def setup_method(self):
    '''
    Initializes a local Chrome WebDriver before each test method.

    If you need to customize or use other driver, override this method in your test class.
    '''
    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager

    super().setup_method()

    options = Options()
    options.add_argument("--start-maximized")
    options.add_argument("--disable-gpu")
    self._web_driver = Chrome(
        options,
        Service(ChromeDriverManager().install()))

teardown_method()

Quits the Selenium WebDriver after each test method.

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_tests.py
65
66
67
68
69
70
71
72
73
@override
def teardown_method(self):
    '''
    Quits the Selenium WebDriver after each test method.
    '''
    try:
        self._web_driver.quit()
    finally:
        super().teardown_method()

SeleniumUiContext

Bases: UiContext[SeleniumUiElement]

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class SeleniumUiContext(UiContext[SeleniumUiElement]):
    _driver: WebDriver

    def __init__(self, driver: WebDriver) -> None:
        self._driver = driver

    def find_element(self, by: str, value: Optional[str]) -> SeleniumUiElement:
        return SeleniumUiElement(self._driver.find_element(by, value))

    def find_elements(
            self, by: str, value: Optional[str]) -> Iterator[SeleniumUiElement]:
        return (SeleniumUiElement(e) for e in self._driver.find_elements(by, value))

    def get(self, url: str) -> None:
        self._driver.get(url)

    def execute_script(self, script: str, *args: UiElement) -> Any:
        return self._driver.execute_script(script, *args)  # type: ignore

__init__(driver)

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
37
38
def __init__(self, driver: WebDriver) -> None:
    self._driver = driver

execute_script(script, *args)

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
50
51
def execute_script(self, script: str, *args: UiElement) -> Any:
    return self._driver.execute_script(script, *args)  # type: ignore

find_element(by, value)

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
40
41
def find_element(self, by: str, value: Optional[str]) -> SeleniumUiElement:
    return SeleniumUiElement(self._driver.find_element(by, value))

find_elements(by, value)

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
43
44
45
def find_elements(
        self, by: str, value: Optional[str]) -> Iterator[SeleniumUiElement]:
    return (SeleniumUiElement(e) for e in self._driver.find_elements(by, value))

get(url)

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
47
48
def get(self, url: str) -> None:
    self._driver.get(url)

SeleniumUiElement

Bases: WebElement, UiElement

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class SeleniumUiElement(WebElement, UiElement):
    def __init__(self, element: WebElement) -> None:
        # Copy all attributes from the original WebElement
        self.__dict__ = element.__dict__

    def type(self, text: str) -> None:
        super().clear()
        super().send_keys(text)

    def scroll_into_view(self) -> None:
        self.parent.execute_script(  # type: ignore[attr-defined]
            "arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});",
            self)

    @property
    def text(self) -> str:
        return super().text

__dict__ = element.__dict__ instance-attribute

text property

__init__(element)

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
16
17
18
def __init__(self, element: WebElement) -> None:
    # Copy all attributes from the original WebElement
    self.__dict__ = element.__dict__

scroll_into_view()

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
24
25
26
27
def scroll_into_view(self) -> None:
    self.parent.execute_script(  # type: ignore[attr-defined]
        "arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});",
        self)

type(text)

Source code in qa-pytest-webdriver/src/qa_pytest_webdriver/selenium_ui_adapter.py
20
21
22
def type(self, text: str) -> None:
    super().clear()
    super().send_keys(text)