From fde3886a791c39a61fdef3272489a7b72b988d67 Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Wed, 14 Jan 2026 19:43:25 +0100 Subject: [PATCH 1/4] added CI secrets --- locators/base_locators.py | 3 + pages/base_configuration_page.py | 7 +- tests/folder_project/conftest.py | 116 +++++++++--------- ...est_accessibility_folders_health_metric.py | 54 ++++++-- .../test_button_add_healt_metric.py | 18 --- .../test_configuration_dublicat_ns.py | 16 --- 6 files changed, 113 insertions(+), 101 deletions(-) delete mode 100644 tests/folder_project/test_button_add_healt_metric.py delete mode 100644 tests/folder_project/test_configuration_dublicat_ns.py diff --git a/locators/base_locators.py b/locators/base_locators.py index 335fa818..8991acb6 100644 --- a/locators/base_locators.py +++ b/locators/base_locators.py @@ -12,3 +12,6 @@ class BaseConfigurationPageLocators: TOGGLE_LABEL = "label[for='enable-disable-project']" DISABLED_MESSAGE_TEXT = "This project is currently disabled" DISABLED_MESSAGE_TEXT_LOC = "form#enable-project" + + # Side menu + HEALTH_METRICS = "button[data-section-id='health-metrics']" \ No newline at end of file diff --git a/pages/base_configuration_page.py b/pages/base_configuration_page.py index 6c561015..ee1a7d04 100644 --- a/pages/base_configuration_page.py +++ b/pages/base_configuration_page.py @@ -1,4 +1,5 @@ import allure +from playwright.sync_api import expect from data.data import BaseConfigurationPageData from pages.base_page import BasePage @@ -42,4 +43,8 @@ def assert_disable_text(self, actual_text): self.assertion.assert_text( expected_text=self.data.DISABLED_MESSAGE_TEXT, actual_text=actual_text - ) \ No newline at end of file + ) + + def expect_locator_enabled(self, loc): + with allure.step("Expect locator is enabled"): + expect(self.page.locator(loc)).to_be_enabled() \ No newline at end of file diff --git a/tests/folder_project/conftest.py b/tests/folder_project/conftest.py index 8b369fdd..a3b2d108 100644 --- a/tests/folder_project/conftest.py +++ b/tests/folder_project/conftest.py @@ -1,58 +1,58 @@ -import os -import pytest -from playwright.sync_api import expect -import random -from conftest import BASE_URL - - -@pytest.fixture -def new_folder(page): - new_folder_name = f"Test_folder_{random.randint(0, 999999)}" - - new_item_link_loc = "a[href='/view/all/newJob']" - item_name_field_loc = "input[class='jenkins-input']" - item_type_text = "Folder" - ok_btn_loc = "button[id='ok-button']" - save_btn_loc = "button[name='Submit']" - folder_title_loc = "h1.job-index-headline" - - page.goto("/") - page.locator(new_item_link_loc).click() - page.locator(item_name_field_loc).fill(new_folder_name) - page.get_by_text(item_type_text, exact=True).click() - page.locator(ok_btn_loc).click() - page.locator(save_btn_loc).click() - - folder_title = page.locator(folder_title_loc) - expect(folder_title).to_have_text(new_folder_name) - - return new_folder_name - - -@pytest.fixture -def new_view(page, new_folder): - - new_name = f"New_name_{random.randint(0, 999999)}" - - new_view_link_loc = page.locator(f"a[href='/job/{new_folder}/newView']") - view_name_input_loc = page.locator("input[name='name']") - global_view_type_loc = page.get_by_text("Include a global view") - create_btn_loc = page.get_by_role("button", name="Create") - save_btn_loc = page.get_by_role("button", name="Save") - - new_view_link_loc.click() - - view_name_input_loc.fill(new_name) - - global_view_type_loc.check() - - create_btn_loc.click() - expected_url = f"{BASE_URL}/job/{new_folder}/view/{new_name}/configure" - expect(page).to_have_url(expected_url) - - save_btn_loc.click() - expect(page).to_have_url(f"{BASE_URL}/job/{new_folder}/view/{new_name}/?") - - expect(page.get_by_text(new_name)).to_be_visible() - - return new_name +# import os +# import pytest +# from playwright.sync_api import expect +# import random +# from conftest import BASE_URL +# +# +# @pytest.fixture +# def new_folder(page): +# new_folder_name = f"Test_folder_{random.randint(0, 999999)}" +# +# new_item_link_loc = "a[href='/view/all/newJob']" +# item_name_field_loc = "input[class='jenkins-input']" +# item_type_text = "Folder" +# ok_btn_loc = "button[id='ok-button']" +# save_btn_loc = "button[name='Submit']" +# folder_title_loc = "h1.job-index-headline" +# +# page.goto("/") +# page.locator(new_item_link_loc).click() +# page.locator(item_name_field_loc).fill(new_folder_name) +# page.get_by_text(item_type_text, exact=True).click() +# page.locator(ok_btn_loc).click() +# page.locator(save_btn_loc).click() +# +# folder_title = page.locator(folder_title_loc) +# expect(folder_title).to_have_text(new_folder_name) +# +# return new_folder_name +# +# +# @pytest.fixture +# def new_view(page, new_folder): +# +# new_name = f"New_name_{random.randint(0, 999999)}" +# +# new_view_link_loc = page.locator(f"a[href='/job/{new_folder}/newView']") +# view_name_input_loc = page.locator("input[name='name']") +# global_view_type_loc = page.get_by_text("Include a global view") +# create_btn_loc = page.get_by_role("button", name="Create") +# save_btn_loc = page.get_by_role("button", name="Save") +# +# new_view_link_loc.click() +# +# view_name_input_loc.fill(new_name) +# +# global_view_type_loc.check() +# +# create_btn_loc.click() +# expected_url = f"{BASE_URL}/job/{new_folder}/view/{new_name}/configure" +# expect(page).to_have_url(expected_url) +# +# save_btn_loc.click() +# expect(page).to_have_url(f"{BASE_URL}/job/{new_folder}/view/{new_name}/?") +# +# expect(page.get_by_text(new_name)).to_be_visible() +# +# return new_name diff --git a/tests/folder_project/test_accessibility_folders_health_metric.py b/tests/folder_project/test_accessibility_folders_health_metric.py index 347144da..95bf9267 100644 --- a/tests/folder_project/test_accessibility_folders_health_metric.py +++ b/tests/folder_project/test_accessibility_folders_health_metric.py @@ -1,11 +1,49 @@ +import time +from enum import EnumType +import allure +from playwright.sync_api import expect -def test_05_002_01(page, new_folder): - folder_name = new_folder - configure_loc = "svg[class='icon-gear icon-md']" - health_metric_button_loc = "button[data-section-id='health-metrics']" +from data.endpoints import Endpoints +from data.enums import ItemType +from pages.base_configuration_page import BaseConfigurationPage +from locators.base_locators import BaseLocators +from utils.generators.project_generator import ProjectGenerator - page.goto(f"/job/{folder_name}/") - page.click(configure_loc) - button_hm = page.locator(health_metric_button_loc) - assert button_hm.is_enabled(), "Кнопка недоступна" +@allure.epic("Folder") +@allure.feature("Essential features in folder") +class TestAccessibilityFoldersHealthMetrics: + generator = ProjectGenerator() + endpoints = Endpoints() + locators = BaseLocators() + item_type = ItemType + + @allure.story("Health metrics") + def test_click_health_metrics_05_002_01(self,page, create_job, open_page): + folder_job = create_job(self.generator.generate_folder_name(), self.item_type.FOLDER) + configuration_page = open_page(BaseConfigurationPage, + self.endpoints.JOB_CONFIGURE_URL(folder_job)) + button_hm = self.locators.BaseConfigurationPageLocators.HEALTH_METRICS + configuration_page.click(button_hm) + configuration_page.expect_locator_enabled(button_hm) + + @allure.story("Health metrics") + def test_tc_05_002_02(page, new_folder): + pass + # folder_name = new_folder + # """Метрики выпадающего списка из acceptance Criteria""" + # metric = ["Child item with the given name", "Child item with worst health"] + # + # health_metric_button_loc = "button[data-section-id='health-metrics']" + # health_metric_dropdown_button_loc = "button[class*='advancedButton']" + # add_metric_button_loc = "button[class*='hetero-list-add']" + # dropdown_text_loc = "button.jenkins-dropdown__item" + # + # page.goto(f"/job/{folder_name}/configure") + # page.click(health_metric_button_loc) + # page.click(health_metric_dropdown_button_loc) + # page.click(add_metric_button_loc) + # """Получить все опции выпадающего меню""" + # all_options_button = page.locator(dropdown_text_loc).all_inner_texts() + # """Проверка, что все опции из Acceptance Criteria присутствуют в выпадающем меню""" + # assert all_options_button == metric \ No newline at end of file diff --git a/tests/folder_project/test_button_add_healt_metric.py b/tests/folder_project/test_button_add_healt_metric.py deleted file mode 100644 index 563e4213..00000000 --- a/tests/folder_project/test_button_add_healt_metric.py +++ /dev/null @@ -1,18 +0,0 @@ -def test_tc_05_002_02(page,new_folder): - folder_name = new_folder - """Метрики выпадающего списка из acceptance Criteria""" - metric = ["Child item with the given name", "Child item with worst health"] - - health_metric_button_loc = "button[data-section-id='health-metrics']" - health_metric_dropdown_button_loc = "button[class*='advancedButton']" - add_metric_button_loc = "button[class*='hetero-list-add']" - dropdown_text_loc = "button.jenkins-dropdown__item" - - page.goto(f"/job/{folder_name}/configure") - page.click(health_metric_button_loc) - page.click(health_metric_dropdown_button_loc) - page.click(add_metric_button_loc) - """Получить все опции выпадающего меню""" - all_options_button = page.locator(dropdown_text_loc).all_inner_texts() - """Проверка, что все опции из Acceptance Criteria присутствуют в выпадающем меню""" - assert all_options_button == metric diff --git a/tests/folder_project/test_configuration_dublicat_ns.py b/tests/folder_project/test_configuration_dublicat_ns.py deleted file mode 100644 index 44cc61be..00000000 --- a/tests/folder_project/test_configuration_dublicat_ns.py +++ /dev/null @@ -1,16 +0,0 @@ -from data.enums import ItemType - - -class TestConfigurationDuplicate: - NAME_FOLDER = "smoke_test1" - DESCRIPTION = "KAK KAK KAK" - - def test_configuration_duplicate(self, create_job, base_configuration_page, page, base_project_page): - - create_job(self.NAME_FOLDER ,ItemType.FOLDER ) - base_configuration_page.go_to_configuration_page(self.NAME_FOLDER) - base_configuration_page.set_or_change_description(self.DESCRIPTION) - base_configuration_page.save_configuration() - text_description = base_project_page.description_text(self.DESCRIPTION) - - assert text_description == self.DESCRIPTION From 9bdd9a9abce4e820cb1aff480a6b5128088a445f Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Tue, 20 Jan 2026 22:08:43 +0100 Subject: [PATCH 2/4] refactor to POM with fixture tc_05_002_02 --- locators/base_locators.py | 8 +++- pages/base_configuration_page.py | 8 +++- ...est_accessibility_folders_health_metric.py | 37 ++++++++----------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/locators/base_locators.py b/locators/base_locators.py index 8991acb6..089685ce 100644 --- a/locators/base_locators.py +++ b/locators/base_locators.py @@ -2,7 +2,7 @@ class BaseLocators: NEW_ITEM_BUTTON = "a[href='/view/all/newJob']" OK_BUTTON = "button#ok-button" SAVE_BUTTON = "button[name='Submit']" - NAME_OF_CREATED_PROJECT = lambda job_name: f"td a[href='job/{job_name}/']" + NAME_OF_CREATED_PROJECT = lambda job_name: f"td a[href='job/{job_name}/']" class BaseConfigurationPageLocators: TEXTAREA_DESCRIPTION = "//div[normalize-space()='Description']/following-sibling::div[1]//textarea" @@ -14,4 +14,8 @@ class BaseConfigurationPageLocators: DISABLED_MESSAGE_TEXT_LOC = "form#enable-project" # Side menu - HEALTH_METRICS = "button[data-section-id='health-metrics']" \ No newline at end of file + HEALTH_METRICS = "button[data-section-id='health-metrics']" + HEALTH_METRICS_DROPDOWN_BUTTON_LOC = "button[class*='advancedButton']" + ADD_METRIC_BUTTON_LOC = "button[class*='hetero-list-add']" + DROPDOWN_TEXT_LOC = "//button[@class = 'jenkins-dropdown__item ']" + diff --git a/pages/base_configuration_page.py b/pages/base_configuration_page.py index ee1a7d04..90e3c975 100644 --- a/pages/base_configuration_page.py +++ b/pages/base_configuration_page.py @@ -47,4 +47,10 @@ def assert_disable_text(self, actual_text): def expect_locator_enabled(self, loc): with allure.step("Expect locator is enabled"): - expect(self.page.locator(loc)).to_be_enabled() \ No newline at end of file + expect(self.page.locator(loc)).to_be_enabled() + + def get_inner_text(self, loc): + with allure.step(f"Inner text"): + text = self.page.locator(loc).all_inner_texts() + + return text \ No newline at end of file diff --git a/tests/folder_project/test_accessibility_folders_health_metric.py b/tests/folder_project/test_accessibility_folders_health_metric.py index 95bf9267..6bc511f2 100644 --- a/tests/folder_project/test_accessibility_folders_health_metric.py +++ b/tests/folder_project/test_accessibility_folders_health_metric.py @@ -2,6 +2,7 @@ from enum import EnumType import allure +import pytest from playwright.sync_api import expect from data.endpoints import Endpoints @@ -10,6 +11,7 @@ from locators.base_locators import BaseLocators from utils.generators.project_generator import ProjectGenerator + @allure.epic("Folder") @allure.feature("Essential features in folder") class TestAccessibilityFoldersHealthMetrics: @@ -19,31 +21,22 @@ class TestAccessibilityFoldersHealthMetrics: item_type = ItemType @allure.story("Health metrics") - def test_click_health_metrics_05_002_01(self,page, create_job, open_page): + def test_click_health_metrics_05_002_01(self, create_job, open_page): folder_job = create_job(self.generator.generate_folder_name(), self.item_type.FOLDER) configuration_page = open_page(BaseConfigurationPage, - self.endpoints.JOB_CONFIGURE_URL(folder_job)) - button_hm = self.locators.BaseConfigurationPageLocators.HEALTH_METRICS + self.endpoints.JOB_CONFIGURE_URL(folder_job)) + button_hm = self.locators.BaseConfigurationPageLocators.HEALTH_METRICS configuration_page.click(button_hm) configuration_page.expect_locator_enabled(button_hm) @allure.story("Health metrics") - def test_tc_05_002_02(page, new_folder): - pass - # folder_name = new_folder - # """Метрики выпадающего списка из acceptance Criteria""" - # metric = ["Child item with the given name", "Child item with worst health"] - # - # health_metric_button_loc = "button[data-section-id='health-metrics']" - # health_metric_dropdown_button_loc = "button[class*='advancedButton']" - # add_metric_button_loc = "button[class*='hetero-list-add']" - # dropdown_text_loc = "button.jenkins-dropdown__item" - # - # page.goto(f"/job/{folder_name}/configure") - # page.click(health_metric_button_loc) - # page.click(health_metric_dropdown_button_loc) - # page.click(add_metric_button_loc) - # """Получить все опции выпадающего меню""" - # all_options_button = page.locator(dropdown_text_loc).all_inner_texts() - # """Проверка, что все опции из Acceptance Criteria присутствуют в выпадающем меню""" - # assert all_options_button == metric \ No newline at end of file + def test_click_health_metrics_tc_05_002_02(self, create_job, open_page): + folder_job = create_job(self.generator.generate_folder_name(), self.item_type.FOLDER) + configuration_page = open_page(BaseConfigurationPage, + self.endpoints.JOB_CONFIGURE_URL(folder_job)) + configuration_page.click(self.locators.BaseConfigurationPageLocators.HEALTH_METRICS) + configuration_page.click(self.locators.BaseConfigurationPageLocators.HEALTH_METRICS_DROPDOWN_BUTTON_LOC) + configuration_page.click(self.locators.BaseConfigurationPageLocators.ADD_METRIC_BUTTON_LOC) + inner_text = configuration_page.get_inner_text(self.locators.BaseConfigurationPageLocators.DROPDOWN_TEXT_LOC) + + assert inner_text == ['Child item with the given name', 'Child item with worst health'] From c391028a87b5591967a2270f1ad9c767c5eb8850 Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Tue, 20 Jan 2026 22:17:45 +0100 Subject: [PATCH 3/4] refactor to POM with fixture tc_05_002_02 --- tests/folder_project/conftest.py | 58 -------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 tests/folder_project/conftest.py diff --git a/tests/folder_project/conftest.py b/tests/folder_project/conftest.py deleted file mode 100644 index a3b2d108..00000000 --- a/tests/folder_project/conftest.py +++ /dev/null @@ -1,58 +0,0 @@ -# import os -# import pytest -# from playwright.sync_api import expect -# import random -# from conftest import BASE_URL -# -# -# @pytest.fixture -# def new_folder(page): -# new_folder_name = f"Test_folder_{random.randint(0, 999999)}" -# -# new_item_link_loc = "a[href='/view/all/newJob']" -# item_name_field_loc = "input[class='jenkins-input']" -# item_type_text = "Folder" -# ok_btn_loc = "button[id='ok-button']" -# save_btn_loc = "button[name='Submit']" -# folder_title_loc = "h1.job-index-headline" -# -# page.goto("/") -# page.locator(new_item_link_loc).click() -# page.locator(item_name_field_loc).fill(new_folder_name) -# page.get_by_text(item_type_text, exact=True).click() -# page.locator(ok_btn_loc).click() -# page.locator(save_btn_loc).click() -# -# folder_title = page.locator(folder_title_loc) -# expect(folder_title).to_have_text(new_folder_name) -# -# return new_folder_name -# -# -# @pytest.fixture -# def new_view(page, new_folder): -# -# new_name = f"New_name_{random.randint(0, 999999)}" -# -# new_view_link_loc = page.locator(f"a[href='/job/{new_folder}/newView']") -# view_name_input_loc = page.locator("input[name='name']") -# global_view_type_loc = page.get_by_text("Include a global view") -# create_btn_loc = page.get_by_role("button", name="Create") -# save_btn_loc = page.get_by_role("button", name="Save") -# -# new_view_link_loc.click() -# -# view_name_input_loc.fill(new_name) -# -# global_view_type_loc.check() -# -# create_btn_loc.click() -# expected_url = f"{BASE_URL}/job/{new_folder}/view/{new_name}/configure" -# expect(page).to_have_url(expected_url) -# -# save_btn_loc.click() -# expect(page).to_have_url(f"{BASE_URL}/job/{new_folder}/view/{new_name}/?") -# -# expect(page.get_by_text(new_name)).to_be_visible() -# -# return new_name From 81304fe553b0f10f86001011d2c3cbae7ffb6058 Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Tue, 20 Jan 2026 22:20:07 +0100 Subject: [PATCH 4/4] refactor to POM with fixture tc_05_002_02 --- .../test_accessibility_folders_health_metric.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/folder_project/test_accessibility_folders_health_metric.py b/tests/folder_project/test_accessibility_folders_health_metric.py index 6bc511f2..8a1c82c7 100644 --- a/tests/folder_project/test_accessibility_folders_health_metric.py +++ b/tests/folder_project/test_accessibility_folders_health_metric.py @@ -1,9 +1,4 @@ -import time -from enum import EnumType - import allure -import pytest -from playwright.sync_api import expect from data.endpoints import Endpoints from data.enums import ItemType @@ -39,4 +34,4 @@ def test_click_health_metrics_tc_05_002_02(self, create_job, open_page): configuration_page.click(self.locators.BaseConfigurationPageLocators.ADD_METRIC_BUTTON_LOC) inner_text = configuration_page.get_inner_text(self.locators.BaseConfigurationPageLocators.DROPDOWN_TEXT_LOC) - assert inner_text == ['Child item with the given name', 'Child item with worst health'] + assert inner_text == ['Child item with the given name', 'Child item with worst health'] \ No newline at end of file