Compare commits
1 Commits
master
...
circleci-p
Author | SHA1 | Date | |
---|---|---|---|
961db28e24 |
21
.circleci/config.yml
Normal file
21
.circleci/config.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
version: 2.1
|
||||||
|
|
||||||
|
orbs:
|
||||||
|
python: circleci/python@0.2.1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-test:
|
||||||
|
executor: python/default
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- python/load-cache
|
||||||
|
- python/install-deps
|
||||||
|
- python/save-cache
|
||||||
|
- run:
|
||||||
|
command: ./manage.py test
|
||||||
|
name: Test
|
||||||
|
|
||||||
|
workflows:
|
||||||
|
main:
|
||||||
|
jobs:
|
||||||
|
- build-and-test
|
@ -1,65 +0,0 @@
|
|||||||
# DISABLED
|
|
||||||
name: ChromeTests
|
|
||||||
|
|
||||||
on: [ push ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-gitea
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
python-version: [ "3.12" ]
|
|
||||||
env:
|
|
||||||
CHROMEDRIVER_VERSION: 113.0.5672.63
|
|
||||||
CHROME_VERSION: 113.0.5672.0
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- name: Clone repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
|
||||||
uses: actions/setup-python@v3
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python-version }}
|
|
||||||
|
|
||||||
- name: Install python dependencies
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
python -m pip install -r requirements.txt
|
|
||||||
mkdir drivers
|
|
||||||
|
|
||||||
- name: Prep the host environment for Chrome
|
|
||||||
run: |
|
|
||||||
apt update -y
|
|
||||||
apt upgrade -y
|
|
||||||
apt install -y fonts-liberation libasound2 libatk-bridge2.0-0 libatk1.0-0 libu2f-udev libcups2 libdrm2\
|
|
||||||
libgbm1 libgtk-3-0 libgtk-4-1 libnspr4 libnss3 libu2f-udev libvulkan1 libxcomposite1 libxdamage1 libxfixes3\
|
|
||||||
libxkbcommon0 libxrandr2 xdg-utils xvfb libx11-6 libx11-dev libice6 xorg xorg-dev
|
|
||||||
|
|
||||||
|
|
||||||
- name: Install Chrome and Chromedriver for Linux
|
|
||||||
if: runner.os == 'Linux'
|
|
||||||
run: |
|
|
||||||
wget https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/linux64/chrome-linux64.zip
|
|
||||||
wget https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip
|
|
||||||
unzip chrome-linux64.zip
|
|
||||||
unzip chromedriver_linux64.zip
|
|
||||||
mv chromedriver chrome-linux64
|
|
||||||
|
|
||||||
- name: Verify Installation
|
|
||||||
run: |
|
|
||||||
export PATH=$PATH:${{gitea.workspace}}/chrome-linux64
|
|
||||||
which chrome
|
|
||||||
which chromedriver
|
|
||||||
chrome --version
|
|
||||||
chromedriver --version
|
|
||||||
|
|
||||||
- name: Run the pytests
|
|
||||||
run: |
|
|
||||||
export PATH=$PATH:${{gitea.workspace}}/chrome-linux64
|
|
||||||
export PATH=$PATH:${{gitea.workspace}}/drivers
|
|
||||||
pytest -vv -c pytest.ini -m chrome
|
|
||||||
|
|
||||||
|
|
||||||
- name: Run the behave tests
|
|
||||||
run: behave --tags=mark.chrome
|
|
@ -1,57 +0,0 @@
|
|||||||
name: EdgeTests
|
|
||||||
|
|
||||||
on: [ push ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-gitea
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
python-version: [ "3.12" ]
|
|
||||||
env:
|
|
||||||
EDGEDRIVER_VERSION: 126.0.2592.102
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
|
||||||
uses: actions/setup-python@v3
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python-version }}
|
|
||||||
|
|
||||||
- name: Install python dependencies
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
python -m pip install -r requirements.txt
|
|
||||||
mkdir drivers
|
|
||||||
|
|
||||||
- name: Prep the Debian repositories
|
|
||||||
run: |
|
|
||||||
apt update -y
|
|
||||||
apt upgrade -y
|
|
||||||
|
|
||||||
- name: Install Edge and EdgeDriver for Linux
|
|
||||||
if: runner.os == 'Linux'
|
|
||||||
run: |
|
|
||||||
wget https://msedgedriver.azureedge.net/${EDGEDRIVER_VERSION}/edgedriver_linux64.zip
|
|
||||||
unzip edgedriver_linux64.zip
|
|
||||||
mv msedgedriver drivers
|
|
||||||
|
|
||||||
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
|
|
||||||
install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
|
|
||||||
sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-dev.list'
|
|
||||||
sudo rm microsoft.gpg
|
|
||||||
apt update
|
|
||||||
apt install -y microsoft-edge-stable
|
|
||||||
|
|
||||||
- name: EdgeDriver for Windows
|
|
||||||
if: runner.os == 'Windows'
|
|
||||||
run: |
|
|
||||||
wget https://msedgedriver.azureedge.net/${EDGEDRIVER_VERSION}/edgedriver_win64.zip
|
|
||||||
unzip edgedriver_win64.zip
|
|
||||||
mv msedgedriver.exe drivers
|
|
||||||
List-Item -Recurse drivers
|
|
||||||
|
|
||||||
- name: Run the pytests
|
|
||||||
run: pytest -c pytest.ini -m edge
|
|
||||||
|
|
||||||
- name: Run the behave tests
|
|
||||||
run: behave --tags=mark.edge
|
|
@ -1,24 +0,0 @@
|
|||||||
name: Pylint
|
|
||||||
|
|
||||||
on: [ push ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-gitea
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
python-version: [ "3.12" ]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
|
||||||
uses: actions/setup-python@v3
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python-version }}
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install pylint
|
|
||||||
python -m pip install -r requirements.txt
|
|
||||||
- name: Analysing the code with pylint
|
|
||||||
run: |
|
|
||||||
pylint $(git ls-files '*.py')
|
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -6,6 +6,3 @@
|
|||||||
**/__pycache/
|
**/__pycache/
|
||||||
.idea/
|
.idea/
|
||||||
.vscode/
|
.vscode/
|
||||||
.venv/
|
|
||||||
drivers/
|
|
||||||
chrome-linux64/
|
|
||||||
|
23
Pipfile
Normal file
23
Pipfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
[[source]]
|
||||||
|
name = "pypi"
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
flask = "*"
|
||||||
|
pytest = "*"
|
||||||
|
behave = "*"
|
||||||
|
selenium = "*"
|
||||||
|
webdriver_manager = "*"
|
||||||
|
msedge-selenium-tools = "*"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
flask = "*"
|
||||||
|
pytest = "*"
|
||||||
|
behave = "*"
|
||||||
|
selenium = "*"
|
||||||
|
webdriver_manager = "*"
|
||||||
|
msedge-selenium-tools = "*"
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.6"
|
@ -1,5 +1,2 @@
|
|||||||
# behave-framework
|
# behave-framework
|
||||||
|
|
||||||
basic python test framework
|
basic python test framework
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
[behave]
|
[behave]
|
||||||
default_format = pretty
|
default_format = pretty
|
||||||
show_skipped = true
|
show_skipped = true
|
||||||
show_timings = true
|
show_timings = true
|
||||||
stdout_capture = yes
|
stdout_capture = yes
|
||||||
logging-level = ERROR
|
logging-level = ERROR
|
||||||
default_tags = ~@skip
|
default_tags = ~@skip
|
||||||
|
|
||||||
[behave.userdata]
|
[behave.userdata]
|
||||||
|
@ -1,69 +1,52 @@
|
|||||||
# pylint: disable=too-few-public-methods
|
|
||||||
import os
|
|
||||||
import platform
|
|
||||||
|
|
||||||
from selenium import webdriver
|
from selenium import webdriver
|
||||||
from selenium.webdriver.chrome.options import Options as ChromeOptions
|
|
||||||
from selenium.webdriver.chrome.service import Service as ChromeService
|
|
||||||
from selenium.webdriver.edge.options import Options as EdgeOptions
|
|
||||||
from selenium.webdriver.edge.service import Service as EdgeService
|
|
||||||
from selenium.webdriver.firefox.options import Options as FirefoxOptions
|
|
||||||
|
|
||||||
from conftest import CWD
|
from msedge.selenium_tools import Edge, EdgeOptions
|
||||||
|
from webdriver_manager.firefox import GeckoDriverManager
|
||||||
|
from webdriver_manager.chrome import ChromeDriverManager
|
||||||
|
from webdriver_manager.microsoft import EdgeChromiumDriverManager
|
||||||
|
|
||||||
|
|
||||||
class BrowserDriver:
|
class BrowserDriver:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get(browser=None, headless=True):
|
def get(browser=None, headless=True):
|
||||||
valid_browsers = ['chrome', 'firefox', 'safari', 'edge']
|
if browser == "chrome":
|
||||||
if browser in valid_browsers:
|
return chrome(headless)
|
||||||
browser_method = globals()[browser]
|
elif browser == "firefox":
|
||||||
return browser_method(headless)
|
return firefox(headless)
|
||||||
|
elif browser == "edge":
|
||||||
raise ValueError(f"'{browser}' is not a supported browser")
|
return edge(headless)
|
||||||
|
elif browser == "safari":
|
||||||
|
return safari()
|
||||||
|
else:
|
||||||
|
raise ValueError("'{}' is not a supported browser".format(browser))
|
||||||
|
|
||||||
|
|
||||||
def chrome(headless=True):
|
def chrome(headless=True):
|
||||||
chrome_path = os.path.join(CWD, 'chrome-linux64', 'chrome')
|
options = webdriver.ChromeOptions()
|
||||||
driver_path = os.path.join(CWD, 'chrome-linux64', 'chromedriver')
|
options.headless = headless
|
||||||
options = ChromeOptions()
|
|
||||||
options.binary_location = chrome_path
|
|
||||||
if headless:
|
|
||||||
options.add_argument("--headless")
|
|
||||||
options.add_argument('--ignore-certificate-errors')
|
options.add_argument('--ignore-certificate-errors')
|
||||||
chrome_service = ChromeService(executable_path=driver_path)
|
return webdriver.Chrome(
|
||||||
return webdriver.Chrome(service=chrome_service, options=options)
|
ChromeDriverManager().install(),
|
||||||
|
options=options)
|
||||||
|
|
||||||
|
|
||||||
def firefox(headless=True):
|
def firefox(headless=True):
|
||||||
options = FirefoxOptions()
|
options = webdriver.FirefoxOptions()
|
||||||
if headless:
|
|
||||||
options.add_argument("--headless")
|
|
||||||
options.accept_insecure_certs = True
|
options.accept_insecure_certs = True
|
||||||
return webdriver.Firefox(options=options)
|
options.headless = headless
|
||||||
|
gecko_driver = GeckoDriverManager().install()
|
||||||
|
return webdriver.Firefox(
|
||||||
|
executable_path=gecko_driver,
|
||||||
|
options=options)
|
||||||
|
|
||||||
|
|
||||||
def edge(headless=True):
|
def edge(headless=True):
|
||||||
options = EdgeOptions()
|
options = EdgeOptions()
|
||||||
driver_name = "msedgedriver"
|
|
||||||
if platform.system() == 'Windows':
|
|
||||||
driver_name += ".exe"
|
|
||||||
edgedriver_loc = os.path.join(CWD, 'drivers', driver_name)
|
|
||||||
if os.path.isfile(edgedriver_loc):
|
|
||||||
print(f'\nThe file {edgedriver_loc} exists.\n')
|
|
||||||
else:
|
|
||||||
print(f'\nThe file {edgedriver_loc} does not exist!\n')
|
|
||||||
|
|
||||||
options.use_chromium = True
|
options.use_chromium = True
|
||||||
options.add_argument('disable-gpu')
|
options.headless = headless
|
||||||
options.add_argument("no-sandbox")
|
edge_driver = EdgeChromiumDriverManager().install()
|
||||||
options.add_argument("disable-dev-shm-usage")
|
driver = Edge(edge_driver, options=options)
|
||||||
if headless:
|
return driver
|
||||||
options.add_argument('headless')
|
|
||||||
edge_service = EdgeService(executable_path=edgedriver_loc)
|
|
||||||
edge_driver = webdriver.Edge(service=edge_service, options=options)
|
|
||||||
return edge_driver
|
|
||||||
|
|
||||||
|
|
||||||
def safari():
|
def safari():
|
||||||
|
@ -1,18 +1,13 @@
|
|||||||
import configparser
|
import configparser
|
||||||
import os
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session", autouse=True)
|
@pytest.fixture(scope="session", autouse=True)
|
||||||
def headless():
|
def headless():
|
||||||
config_file = os.path.join(CWD, "fixtures.ini")
|
return _str_to_bool(_read_config_section("fixtures.ini", "dev")["headless"])
|
||||||
dev_config = _read_config_section(config_file, 'dev')
|
|
||||||
return _str_to_bool(dev_config["headless"])
|
|
||||||
|
|
||||||
|
|
||||||
def _read_config_section(source, section):
|
def _read_config_section(source, section):
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
Feature: Browser Demo
|
Feature: Browser Demo
|
||||||
|
|
||||||
Scenario: Load test.io web page with chrome
|
Scenario: Load test.io web page with chrome
|
||||||
Given I have a chrome driver
|
Given I have a chrome driver
|
||||||
When I navigate to test.io
|
When I navigate to test.io
|
||||||
@ -10,13 +9,12 @@ Feature: Browser Demo
|
|||||||
When I navigate to test.io
|
When I navigate to test.io
|
||||||
Then The page is displayed
|
Then The page is displayed
|
||||||
|
|
||||||
@mark.edge
|
@skip
|
||||||
Scenario: Load test.io web page with edge
|
Scenario: Load test.io web page with edge
|
||||||
Given I have an edge driver
|
Given I have an edge driver
|
||||||
When I navigate to test.io
|
When I navigate to test.io
|
||||||
Then The page is displayed
|
Then The page is displayed
|
||||||
|
|
||||||
@skip
|
|
||||||
Scenario: Load test.io web page with safari
|
Scenario: Load test.io web page with safari
|
||||||
Given I have a safari driver
|
Given I have a safari driver
|
||||||
When I navigate to test.io
|
When I navigate to test.io
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
# pylint: disable=unused-argument
|
|
||||||
def before_all(context):
|
def before_all(context):
|
||||||
# -- SET LOG LEVEL: behave --logging-level=ERROR ...
|
# -- SET LOG LEVEL: behave --logging-level=ERROR ...
|
||||||
# on behave command-line or in "behave.ini".
|
# on behave command-line or in "behave.ini".
|
||||||
context.config.setup_logging()
|
context.config.setup_logging()
|
||||||
|
|
||||||
|
|
||||||
def after_scenario(context, scenario):
|
|
||||||
context.driver.quit()
|
|
||||||
|
@ -1,34 +1,34 @@
|
|||||||
# pylint: disable=no-name-in-module
|
|
||||||
from behave import then, when, given
|
from behave import then, when, given
|
||||||
|
|
||||||
from browserdriver import BrowserDriver
|
from browserdriver import BrowserDriver
|
||||||
|
|
||||||
|
|
||||||
@given('I have a firefox driver')
|
@given('I have a firefox driver')
|
||||||
def get_firefox_driver(context):
|
def step_impl(context):
|
||||||
context.driver = BrowserDriver.get("firefox")
|
context.driver = BrowserDriver.get("firefox")
|
||||||
|
|
||||||
|
|
||||||
@given('I have a chrome driver')
|
@given('I have a chrome driver')
|
||||||
def get_chrome_driver(context):
|
def step_impl(context):
|
||||||
context.driver = BrowserDriver.get("chrome")
|
context.driver = BrowserDriver.get("chrome")
|
||||||
|
|
||||||
|
|
||||||
@given('I have an edge driver')
|
@given(u'I have an edge driver')
|
||||||
def get_edge_driver(context):
|
def step_impl(context):
|
||||||
context.driver = BrowserDriver.get("edge")
|
context.driver = BrowserDriver.get("edge")
|
||||||
|
|
||||||
|
|
||||||
@given('I have a safari driver')
|
@given(u'I have a safari driver')
|
||||||
def get_safari_driver(context):
|
def step_impl(context):
|
||||||
context.driver = BrowserDriver.get("safari")
|
context.driver = BrowserDriver.get("safari")
|
||||||
|
|
||||||
|
|
||||||
@when('I navigate to test.io')
|
@when('I navigate to test.io')
|
||||||
def navigate_to_testio(context):
|
def step_impl(context):
|
||||||
context.driver.get("https://test.io")
|
context.driver.get("https://test.io")
|
||||||
|
print(context.driver.title)
|
||||||
|
|
||||||
|
|
||||||
@then('The page is displayed')
|
@then('The page is displayed')
|
||||||
def page_is_displayed(context):
|
def step_impl(context):
|
||||||
assert context.driver.title == "Home | Test IO"
|
assert context.driver.title == "QA Testing as a Service | test IO"
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
[dev]
|
[dev]
|
||||||
headless=true
|
headless = True
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
[pytest]
|
[pytest]
|
||||||
addopts = -s -v --durations=0
|
|
||||||
testpaths = pytests
|
testpaths = pytests
|
||||||
markers =
|
|
||||||
chrome: chrome tests only.
|
|
||||||
firefox: firefox tests only.
|
|
||||||
edge: msedge tests only.
|
|
||||||
|
@ -1,35 +1,31 @@
|
|||||||
|
from browserdriver import BrowserDriver
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from browserdriver import BrowserDriver
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.firefox
|
|
||||||
def test_firefox_browser(headless):
|
def test_firefox_browser(headless):
|
||||||
bd = BrowserDriver().get("firefox", headless=headless)
|
bd = BrowserDriver().get("firefox", headless=headless)
|
||||||
bd.get('https://test.io')
|
bd.get('https://test.io')
|
||||||
assert bd.title == "Home | Test IO"
|
assert "QA Testing as a Service | test IO" == bd.title
|
||||||
bd.quit()
|
bd.quit()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.chrome
|
|
||||||
def test_chrome_browser(headless):
|
def test_chrome_browser(headless):
|
||||||
bd = BrowserDriver().get("chrome", headless=headless)
|
bd = BrowserDriver().get("chrome", headless=headless)
|
||||||
bd.get('https://test.io')
|
bd.get('https://test.io')
|
||||||
assert bd.title == "Home | Test IO"
|
assert "QA Testing as a Service | test IO" == bd.title
|
||||||
bd.quit()
|
bd.quit()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skip(reason="Safari is not available")
|
def test_safari_browser(headless):
|
||||||
def test_safari_browser():
|
|
||||||
bd = BrowserDriver().get("safari", headless=False)
|
bd = BrowserDriver().get("safari", headless=False)
|
||||||
bd.get('https://test.io')
|
bd.get('https://test.io')
|
||||||
assert bd.title == "Home | Test IO"
|
assert "QA Testing as a Service | test IO" == bd.title
|
||||||
bd.quit()
|
bd.quit()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.edge
|
@pytest.mark.skip(reason="Edge has inconsistent implementations across platforms")
|
||||||
def test_edge_browser(headless):
|
def test_edge_browser(headless):
|
||||||
bd = BrowserDriver().get("edge", headless=headless)
|
bd = BrowserDriver().get("edge", headless=headless)
|
||||||
bd.get('https://test.io')
|
bd.get('https://test.io')
|
||||||
assert bd.title == "Home | Test IO"
|
assert "QA Testing as a Service | test IO" == bd.title
|
||||||
bd.quit()
|
bd.quit()
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
flask~=3.0.3
|
|
||||||
pytest~=8.3.1
|
|
||||||
pylint~=3.2.6
|
|
||||||
behave~=1.2.6
|
|
||||||
selenium~=4.23.0
|
|
||||||
webdriver-manager~=4.0.1
|
|
Loading…
Reference in New Issue
Block a user