Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
name: Python Selenium Tests with Allure Report

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
build:
name: 'Run Pytest + Generate Allure Report'
runs-on: ubuntu-latest

steps:
# 1 Checkout repository
- name: Checkout repository
uses: actions/checkout@v4.2.2

# 2 Set up Python
- name: Set up Python
uses: actions/setup-python@v5.2.0
with:
python-version: '3.12'

# 3 Set up Chrome for Selenium
- name: Set up Chrome and Chromedriver
uses: browser-actions/setup-chrome@v1

# 4 Install dependencies
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install allure-pytest

# 5 Verify installed packages
- name: Verify installed packages
run: pip freeze

# 6 Run tests with Allure results
- name: Run tests
run: |
pytest --alluredir=allure-results --disable-warnings -q

- name: Install Allure
run: |
sudo apt-add-repository ppa:qameta/allure -y
sudo apt-get update
sudo apt-get install allure -y

# 7 Generate Allure report
- name: Generate Allure report
run: |
allure generate allure-results --clean -o allure-report

# 8 Upload screenshots (optional)
- name: Upload screenshots
if: always()
uses: actions/upload-artifact@v4
with:
name: screenshots
path: screenshots

# 9 Upload Allure report as artifact
- name: Upload Allure report
if: always()
uses: actions/upload-artifact@v4
with:
name: allure-report
path: allure-report

# 10 Get previous Allure history for gh-pages
- name: Get Allure history
uses: actions/checkout@v4
if: always()
continue-on-error: true
with:
ref: gh-pages
path: gh-pages

# 11 Build Allure report for Pages
- name: Build Allure report for GitHub Pages
if: always()
uses: simple-elf/allure-report-action@master
id: allure-report
with:
allure_results: allure-results
gh_pages: gh-pages
allure_report: allure-report
allure_history: allure-history
ref: gh-pages
path: gh-pages
keep_reports: 30

# 12 Publish Allure report to GitHub Pages
- name: Publish Allure report to GitHub Pages
if: always()
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: allure-history
force_orphan: true

# 13 Save logs if not-success
- name: Save test logs
if: failure()
run: |
pytest --log-cli-level=INFO --capture=tee-sys --disable-warnings > pytest.log || true
shell: bash

# 14 Loading logs as artifacts
- name: Upload logs
if: failure()
uses: actions/upload-artifact@v4.4.3
with:
name: pytest-logs
path: pytest.log
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
.venv
.idea
.idea/
*.log
__pycache__
allure-results
Expand Down
74 changes: 32 additions & 42 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 40 additions & 6 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import shutil
import tempfile

import os

import pytest
from selenium import webdriver
Expand All @@ -7,17 +11,47 @@

@pytest.fixture(scope="function")
def driver():
# === BEFORE test ===
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--window-size = 1400, 1080")
service_properties = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service_properties, options=chrome_options)
chrome_options = webdriver.ChromeOptions() # <-- исправлено

# Check run in CI (GitHub Actions)
is_ci = os.environ.get("CI") == "true"

if is_ci:
# === For CI ===
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--disable-software-rasterizer")
chrome_options.add_argument("--remote-debugging-port=9222")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument("--disable-browser-side-navigation")
chrome_options.add_argument("--disable-features=VizDisplayCompositor")

# uniq profile
user_data_dir = tempfile.mkdtemp()
chrome_options.add_argument(f"--user-data-dir={user_data_dir}")
else:
# === Local run ===
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--window-size=1400,1080")

# Create driver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.set_page_load_timeout(60)
driver.implicitly_wait(10)

yield driver

driver.quit()

if is_ci:
shutil.rmtree(user_data_dir, ignore_errors=True)


# === AFTER test ===
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
Expand Down
1 change: 0 additions & 1 deletion pages/elements/text_box_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ def submit_data(self):
def check_result(self):
self.driver.implicitly_wait(6)
get_text_name = self.driver.find_element(By.ID, LocatorsTextBox.name).text
# self.wait5().until(lambda _ : get_text_name.is_displayed())

return get_text_name

Expand Down
5 changes: 4 additions & 1 deletion pytest.ini
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[pytest]
addopts = --alluredir allure-results
--clean-alluredir
--clean-alluredir
markers =
smoke: marker for smoke
regression: marker for regression tests
Loading
Loading