synapse-hub 2.2.4 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/agents/failure-analyst.md +11 -0
- package/.agents/agents/live-explorer.md +28 -0
- package/.agents/agents/orchestrator.md +23 -4
- package/.agents/agents/pom-crafter.md +15 -0
- package/.agents/agents/quality-gatekeeper.md +20 -4
- package/.agents/agents/test-runner.md +12 -0
- package/.agents/rules/communication-style.md +40 -0
- package/.agents/rules/context-engineering.md +23 -0
- package/.agents/rules/git-push-protocol.md +10 -16
- package/.agents/rules/graphify.md +14 -14
- package/.agents/rules/mandatory-playwright-live.md +29 -29
- package/.agents/rules/mobile_appium_rules.md +132 -0
- package/.agents/rules/performance_testing_rules.md +74 -0
- package/.agents/rules/systematic-debugging.md +6 -6
- package/.agents/skills/agent-orchestration-multi-agent-optimize/SKILL.md +64 -215
- package/.agents/skills/agent-orchestration-multi-agent-optimize/examples/swarm_workload_config.json +12 -0
- package/.agents/skills/antigravity-test-sentinel/SKILL.md +3 -3
- package/.agents/skills/antigravity-test-sentinel/examples/dod_gate_policy.json +11 -0
- package/.agents/skills/api-network-mocking-interception/SKILL.md +1 -1
- package/.agents/skills/api-network-mocking-interception/examples/network_route_stub.json +9 -0
- package/.agents/skills/api-spec-to-e2e-matrix/SKILL.md +9 -9
- package/.agents/skills/api-spec-to-e2e-matrix/examples/sample_openapi.json +19 -0
- package/.agents/skills/architecture-decision-records/SKILL.md +35 -412
- package/.agents/skills/architecture-decision-records/examples/0001-record-architecture-decisions.md +12 -0
- package/.agents/skills/auth-session-and-cookie-manager/SKILL.md +1 -1
- package/.agents/skills/auth-session-and-cookie-manager/examples/storage_state_sample.json +11 -0
- package/.agents/skills/backend-load-and-stress-patterns/SKILL.md +80 -186
- package/.agents/skills/backend-load-and-stress-patterns/examples/k6_load_test_sample.js +13 -0
- package/.agents/skills/bats-testing-patterns/SKILL.md +1 -1
- package/.agents/skills/bats-testing-patterns/examples/cli_runner_test.bats +6 -0
- package/.agents/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -614
- package/.agents/skills/clean-pom-crafter/SKILL.md +21 -3
- package/.agents/skills/clean-pom-crafter/examples/standard_test_case.groovy +28 -28
- package/.agents/skills/clean-pom-crafter/references/pom_patterns.groovy +138 -138
- package/.agents/skills/code-refactoring-refactor-clean/SKILL.md +2 -2
- package/.agents/skills/code-refactoring-refactor-clean/examples/refactored_page_sample.groovy +9 -0
- package/.agents/skills/db-state-verifier-and-seeder/SKILL.md +5 -5
- package/.agents/skills/db-state-verifier-and-seeder/examples/db_fixture_seed.json +12 -0
- package/.agents/skills/e2e-testing-patterns/SKILL.md +1 -1
- package/.agents/skills/e2e-testing-patterns/examples/playwright_sharded_config.ts +12 -0
- package/.agents/skills/e2e-testing-patterns/resources/implementation-playbook.md +522 -522
- package/.agents/skills/failure-autopsy-and-healing/SKILL.md +17 -3
- package/.agents/skills/failure-autopsy-and-healing/examples/sample_junit_failure.xml +8 -0
- package/.agents/skills/failure-autopsy-and-healing/references/healing_matrix.md +64 -64
- package/.agents/skills/failure-autopsy-and-healing/references/qa_investigation_protocol.md +56 -56
- package/.agents/skills/failure-autopsy-and-healing/scripts/triage_failures.sh +98 -98
- package/.agents/skills/file-and-report-validator/SKILL.md +1 -1
- package/.agents/skills/file-and-report-validator/examples/sample_export_schema.json +14 -0
- package/.agents/skills/flaky-test-sentinel-and-quarantine/SKILL.md +3 -3
- package/.agents/skills/flaky-test-sentinel-and-quarantine/examples/quarantine_registry.json +11 -0
- package/.agents/skills/gherkin-to-suite/SKILL.md +103 -0
- package/.agents/skills/gherkin-to-suite/examples/checkout.feature +39 -0
- package/.agents/skills/gherkin-to-suite/examples/suite_report_sample.json +334 -0
- package/.agents/skills/github-actions-templates/SKILL.md +47 -304
- package/.agents/skills/github-actions-templates/examples/matrix_test_pipeline.yml +8 -0
- package/.agents/skills/graphify-impact-analyzer/SKILL.md +6 -6
- package/.agents/skills/graphify-impact-analyzer/examples/dependency_blast_radius.json +8 -0
- package/.agents/skills/katalon-cli-runner/SKILL.md +2 -2
- package/.agents/skills/katalon-cli-runner/examples/headless_kre_exec.sh +3 -0
- package/.agents/skills/katalon-cli-runner/references/groovy-patterns.md +209 -209
- package/.agents/skills/katalon-cli-runner/references/katalon-api.md +155 -155
- package/.agents/skills/katalon-cli-runner/references/runner_commands.md +67 -67
- package/.agents/skills/lam-script-generator/SKILL.md +42 -1
- package/.agents/skills/lam-script-generator/examples/user_story_sample.md +8 -0
- package/.agents/skills/lean-code-ladder/SKILL.md +83 -0
- package/.agents/skills/lean-code-ladder/examples/ladder_walkthrough.md +37 -0
- package/.agents/skills/meta-prompt-crafter/SKILL.md +107 -0
- package/.agents/skills/meta-prompt-crafter/examples/qa_prompt_template.md +35 -0
- package/.agents/skills/persistent-planning-files/SKILL.md +108 -0
- package/.agents/skills/persistent-planning-files/examples/task_plan_example.md +56 -0
- package/.agents/skills/playwright-live-interaction/SKILL.md +49 -1
- package/.agents/skills/playwright-live-interaction/examples/live_probe_script.js +5 -0
- package/.agents/skills/playwright-live-interaction/references/advanced_superpowers.md +160 -160
- package/.agents/skills/playwright-live-interaction/references/compact_accessibility_snapshots.md +75 -75
- package/.agents/skills/playwright-live-interaction/references/recipes.md +388 -388
- package/.agents/skills/playwright-live-interaction/references/swarm_orchestration.md +134 -134
- package/.agents/skills/playwright-webapp-testing/SKILL.md +93 -0
- package/.agents/skills/playwright-webapp-testing/examples/server_lifecycle_playwright.py +63 -0
- package/.agents/skills/rbt-manual-testing/SKILL.md +150 -0
- package/.agents/skills/rbt-manual-testing/examples/checkout_rbt_manual_suite.md +25 -0
- package/.agents/skills/security-dast-sentinel/SKILL.md +54 -135
- package/.agents/skills/security-dast-sentinel/examples/dast_scan_config.json +10 -0
- package/.agents/skills/self-healing-locator/SKILL.md +24 -10
- package/.agents/skills/self-healing-locator/examples/aom_diff_sample.json +16 -0
- package/.agents/skills/skillspector-security-guard/SKILL.md +32 -90
- package/.agents/skills/skillspector-security-guard/examples/safe_mcp_config.json +12 -0
- package/.agents/skills/surgical-coding-principles/SKILL.md +89 -0
- package/.agents/skills/surgical-coding-principles/examples/surgical_vs_scope_creep.md +46 -0
- package/.agents/skills/synthetic-test-data-generator/SKILL.md +3 -3
- package/.agents/skills/synthetic-test-data-generator/examples/idempotent_data_recipe.json +9 -0
- package/.agents/skills/systematic-debugging/SKILL.md +100 -0
- package/.agents/skills/systematic-debugging/examples/four_phase_case.md +44 -0
- package/.agents/skills/test-driven-development/SKILL.md +114 -0
- package/.agents/skills/test-driven-development/examples/red_green_refactor_qa.md +78 -0
- package/.agents/skills/token-and-context-optimizer/SKILL.md +1 -1
- package/.agents/skills/token-and-context-optimizer/examples/distilled_log_sample.txt +3 -0
- package/.agents/skills/verification-before-completion/SKILL.md +100 -0
- package/.agents/skills/verification-before-completion/examples/evidence_log_example.md +46 -0
- package/.agents/skills/visual-regression-sentinel/SKILL.md +21 -1
- package/.agents/skills/visual-regression-sentinel/examples/visual_mask_rules.json +9 -0
- package/.agents/skills/wcag-audit-patterns/SKILL.md +3 -3
- package/.agents/skills/wcag-audit-patterns/examples/wcag_compliance_checklist.json +10 -0
- package/.agents/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -541
- package/.agents/skills/web-vitals-and-performance-profiler/SKILL.md +1 -1
- package/.agents/skills/web-vitals-and-performance-profiler/examples/cwv_budget_policy.json +6 -0
- package/.agents/templates/completion_report.md +57 -57
- package/.agents/workflows/analyze_requirement_document.md +18 -0
- package/.agents/workflows/export_testcases_excel.md +32 -0
- package/.agents/workflows/generate_combinatorial_test_data.md +28 -0
- package/.agents/workflows/generate_cross_module_test_plan.md +37 -0
- package/.agents/workflows/generate_manual_testcases_rbt.md +56 -0
- package/.agents/workflows/generate_requirements_from_website.md +25 -0
- package/.agents/workflows/generate_testcases_from_requirements.md +21 -0
- package/.agents/workflows/graphify.md +10 -10
- package/.agents/workflows/verify.md +2 -2
- package/.cursor/rules/language.mdc +7 -7
- package/.cursor/rules/synapse-qa.mdc +23 -0
- package/.cursorrules +7 -0
- package/.pre-commit-hooks.yaml +14 -0
- package/.windsurfrules +7 -0
- package/AGENTS.md +54 -15
- package/CLAUDE.md +35 -12
- package/LICENSE +30 -0
- package/NOTICE +180 -0
- package/README.en.md +331 -0
- package/README.md +252 -515
- package/action.yml +51 -0
- package/benchmarks/qa_eval/README.md +71 -0
- package/benchmarks/qa_eval/build_dataset.py +677 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-06_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-07_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-08_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-09_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-10_api_contract_drift.json +22 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-21_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-22_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-23_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-24_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-25_fake_pass_tautology.json +21 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-01_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-02_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-03_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-04_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-05_locator_drift.json +23 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-16_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-17_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-18_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-19_stale_and_mutation.json +22 -0
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-20_stale_and_mutation.json +23 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-11_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-12_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-13_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-14_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-15_timing_and_race.json +22 -0
- package/benchmarks/qa_eval/eval_runner.py +418 -0
- package/benchmarks/qa_eval/reports/AB_METHODOLOGY_REPORT.md +83 -0
- package/benchmarks/qa_eval/reports/BENCHMARK_REPORT.md +69 -0
- package/benchmarks/qa_eval/reports/eval_results.json +105 -0
- package/bin/agent-qa.js +16 -4
- package/docs/ARCHITECTURE.md +107 -0
- package/docs/CI_CD_INTEGRATION.md +94 -0
- package/docs/CLI_REFERENCE.md +157 -0
- package/docs/CONTRIBUTING.md +91 -0
- package/docs/PLUGIN_DEVELOPMENT_GUIDE.md +126 -0
- package/docs/TOKEN_QUOTA_PLAYBOOK.md +41 -0
- package/docs/adopted-ecosystem-tools.md +87 -0
- package/docs/schemas/synapse.config.schema.json +64 -0
- package/examples/cypress-ecommerce-suite/README.md +45 -0
- package/examples/cypress-ecommerce-suite/cypress/e2e/checkout.cy.js +17 -0
- package/examples/cypress-ecommerce-suite/cypress/pages/BasePage.js +29 -0
- package/examples/cypress-ecommerce-suite/cypress/pages/CartPage.js +51 -0
- package/examples/cypress-ecommerce-suite/cypress.config.js +13 -0
- package/examples/cypress-ecommerce-suite/package.json +13 -0
- package/examples/katalon-suite/Keywords/pages/BasePage.groovy +19 -0
- package/examples/katalon-suite/Keywords/pages/DashboardPage.groovy +29 -0
- package/examples/katalon-suite/Keywords/pages/LoginPage.groovy +45 -0
- package/examples/katalon-suite/Profiles/default.glbl +12 -0
- package/examples/katalon-suite/README.md +18 -0
- package/examples/katalon-suite/Scripts/Auth/TC_LoginSuccess/Script1234567890.groovy +12 -0
- package/examples/katalon-suite/Scripts/Dashboard/TC_ViewSummary/Script1234567891.groovy +15 -0
- package/examples/katalon-suite/katalon_suite.prj +21 -0
- package/examples/playwright-crm-suite/README.md +40 -0
- package/examples/playwright-crm-suite/package.json +14 -0
- package/examples/playwright-crm-suite/pages/BasePage.ts +37 -0
- package/examples/playwright-crm-suite/pages/CustomerPage.ts +57 -0
- package/examples/playwright-crm-suite/pages/LoginPage.ts +32 -0
- package/examples/playwright-crm-suite/playwright.config.ts +27 -0
- package/examples/playwright-crm-suite/tests/auth.spec.ts +22 -0
- package/examples/playwright-crm-suite/tests/customers.spec.ts +33 -0
- package/examples/plugins/sample-custom-plugin/README.md +14 -0
- package/examples/plugins/sample-custom-plugin/plugin.json +16 -0
- package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/SKILL.md +29 -0
- package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/examples/audit_fixture.json +8 -0
- package/examples/plugins/sample-custom-plugin/tools/custom_security_headers.py +125 -0
- package/examples/practices/README.md +22 -0
- package/examples/practices/requirements/crm/requirements_contracts.md +292 -0
- package/examples/practices/requirements/crm/requirements_customers.md +462 -0
- package/examples/practices/requirements/crm/requirements_login.md +202 -0
- package/examples/practices/requirements/crm/requirements_projects.md +396 -0
- package/examples/practices/requirements/crm/requirements_tasks.md +343 -0
- package/examples/practices/requirements/ecommerce/requirements_category_brand.txt +402 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-1/2026-04-03_04-28-27.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-1/KAN-1_requirement.md +52 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-19.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-57.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/KAN-4_requirement.md +119 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-5_overview.md +9 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-08.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-23.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/KAN-6_requirement.md +32 -0
- package/examples/practices/testcases/api/book_management_api_test_cases.md +144 -0
- package/examples/practices/testcases/api/user_management_api_test_cases.md +139 -0
- package/examples/practices/testcases/crm/test_cases_crm_login.md +148 -0
- package/examples/practices/testcases/crm/test_cases_customers.md +156 -0
- package/examples/pytest-api-suite/README.md +45 -0
- package/examples/pytest-api-suite/conftest.py +31 -0
- package/examples/pytest-api-suite/pages/user_api_client.py +36 -0
- package/examples/pytest-api-suite/requirements.txt +2 -0
- package/examples/pytest-api-suite/tests/test_user_api.py +44 -0
- package/examples/selenium-suite/README.md +18 -0
- package/examples/selenium-suite/pages/base_page.py +27 -0
- package/examples/selenium-suite/pages/login_page.py +29 -0
- package/examples/selenium-suite/pages/order_page.py +25 -0
- package/examples/selenium-suite/pytest.ini +6 -0
- package/examples/selenium-suite/requirements.txt +2 -0
- package/examples/selenium-suite/tests/test_login.py +10 -0
- package/examples/selenium-suite/tests/test_order.py +10 -0
- package/package.json +27 -12
- package/scripts/generate_skill_examples.py +244 -0
- package/scripts/install.ps1 +112 -0
- package/scripts/install_global_plugin.ps1 +94 -0
- package/scripts/install_global_plugin.sh +49 -0
- package/scripts/lint_skills.ps1 +57 -0
- package/scripts/package_dist.py +323 -0
- package/scripts/setup.sh +59 -0
- package/scripts/update_hub.ps1 +19 -0
- package/scripts/update_hub.sh +15 -0
- package/skills_manifest.json +209 -6
- package/synapse.config.json +30 -0
- package/templates/PROJECT_AI_GUIDE_TEMPLATE.md +7 -7
- package/templates/PROJECT_STATE_TEMPLATE.md +1 -1
- package/templates/ai_bridges/CLAUDE.md +33 -16
- package/templates/ai_bridges/copilot-instructions.md +14 -21
- package/templates/ai_bridges/cursor_synapse_qa.mdc +17 -20
- package/templates/ai_bridges/windsurfrules +21 -21
- package/templates/ci/github-actions-synapse.yml +71 -4
- package/templates/welcome.html.tmpl +1674 -0
- package/tools/.infer_baseline.json +1102 -0
- package/tools/TOOLS_RUNBOOK.md +98 -131
- package/tools/__init__.py +26 -0
- package/tools/agent_canary.py +501 -501
- package/tools/analyze_project.py +31 -17
- package/tools/api_fuzzer.py +278 -6
- package/tools/author_integrity.py +6 -6
- package/tools/auto_heal.py +1 -1
- package/tools/browser_helpers.js +105 -7
- package/tools/bug_reporter.py +31 -1
- package/tools/bump_version.py +30 -3
- package/tools/cache_resolver.py +248 -14
- package/tools/check_env.py +55 -14
- package/tools/check_version_sync.py +171 -0
- package/tools/ci_healing_hook.py +1 -1
- package/tools/cli.py +454 -42
- package/tools/count_tokens.py +1257 -0
- package/tools/dashboard_generator.py +2638 -0
- package/tools/db_sandbox.py +198 -20
- package/tools/e2e_flow_prober.ps1 +12 -64
- package/tools/e2e_flow_prober.py +99 -0
- package/tools/e2e_flow_prober.sh +4 -0
- package/tools/flaky_detector.py +4 -3
- package/tools/generate_allure_report.ps1 +12 -29
- package/tools/generate_allure_report.py +77 -0
- package/tools/generate_allure_report.sh +4 -0
- package/tools/generate_jmx_plan.py +257 -58
- package/tools/generate_test_reports.ps1 +12 -134
- package/tools/generate_test_reports.py +133 -0
- package/tools/generate_test_reports.sh +4 -0
- package/tools/gherkin_suite.py +758 -0
- package/tools/git_pre_commit_guard.py +12 -6
- package/tools/goldfish_review.py +366 -0
- package/tools/heal_pr_automator.py +1 -1
- package/tools/heuristic_locator_matcher.py +170 -21
- package/tools/infer_linter.py +612 -70
- package/tools/lint_ai_docs.py +64 -0
- package/tools/matrix_sharder.py +1 -1
- package/tools/mcp_excel_server.ps1 +12 -250
- package/tools/mcp_excel_server.py +249 -0
- package/tools/mcp_excel_server.sh +4 -0
- package/tools/mcp_server.py +368 -144
- package/tools/md_to_xlsx.py +307 -0
- package/tools/micro_mutator.py +302 -69
- package/tools/omni_transpiler.py +2 -2
- package/tools/output_formatter.py +128 -0
- package/tools/pinpoint_failure.py +88 -88
- package/tools/project_state.py +2 -2
- package/tools/repo_map.py +1 -1
- package/tools/safety_firewall.py +196 -45
- package/tools/setup_project.py +295 -31
- package/tools/skillspector.py +31 -0
- package/tools/spec_drift_sentinel.py +439 -0
- package/tools/sync_agent_rules.py +248 -0
- package/tools/telemetry_correlator.py +45 -0
- package/tools/test_impact.py +51 -12
- package/tools/tms_sync_bridge.py +21 -5
- package/tools/universal_ir.py +3 -0
- package/tools/update_sentinel.py +87 -15
- package/tools/verify_all.ps1 +13 -0
- package/tools/verify_all.py +479 -85
- package/tools/visual_diff_canvas.py +1 -0
- package/tools/visual_som_helper.py +1 -1
- package/tools/watch_mode.py +305 -0
- package/tools/welcome_page.py +291 -0
|
@@ -1,155 +1,155 @@
|
|
|
1
|
-
# Katalon Built-in Keywords API Reference
|
|
2
|
-
|
|
3
|
-
This document provides a reference for Katalon Studio's most commonly used built-in keywords.
|
|
4
|
-
|
|
5
|
-
## WebUI Keywords
|
|
6
|
-
|
|
7
|
-
Katalon's WebUI keywords are accessed via `com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords` (commonly imported as `WebUI`).
|
|
8
|
-
|
|
9
|
-
### Navigation Keywords
|
|
10
|
-
|
|
11
|
-
- `WebUI.openBrowser(url)` - Open a browser and navigate to URL
|
|
12
|
-
- `WebUI.navigateToUrl(url)` - Navigate to a URL in the current browser
|
|
13
|
-
- `WebUI.closeBrowser()` - Close the current browser
|
|
14
|
-
- `WebUI.back()` - Navigate back in browser history
|
|
15
|
-
- `WebUI.forward()` - Navigate forward in browser history
|
|
16
|
-
- `WebUI.refresh()` - Refresh the current page
|
|
17
|
-
- `WebUI.switchToWindowIndex(index)` - Switch to a browser window by index
|
|
18
|
-
- `WebUI.switchToWindowTitle(title)` - Switch to a browser window by title
|
|
19
|
-
- `WebUI.switchToWindowUrl(url)` - Switch to a browser window by URL
|
|
20
|
-
|
|
21
|
-
### Element Interaction Keywords
|
|
22
|
-
|
|
23
|
-
- `WebUI.click(testObject)` - Click on an element
|
|
24
|
-
- `WebUI.doubleClick(testObject)` - Double-click on an element
|
|
25
|
-
- `WebUI.rightClick(testObject)` - Right-click on an element
|
|
26
|
-
- `WebUI.setText(testObject, text)` - Set text for an input field
|
|
27
|
-
- `WebUI.sendKeys(testObject, text)` - Send keyboard input to an element
|
|
28
|
-
- `WebUI.clearText(testObject)` - Clear text from an input field
|
|
29
|
-
- `WebUI.selectOptionByValue(testObject, value, isRegex)` - Select dropdown option by value
|
|
30
|
-
- `WebUI.selectOptionByLabel(testObject, label, isRegex)` - Select dropdown option by label
|
|
31
|
-
- `WebUI.selectOptionByIndex(testObject, index)` - Select dropdown option by index
|
|
32
|
-
- `WebUI.check(testObject)` - Check a checkbox
|
|
33
|
-
- `WebUI.uncheck(testObject)` - Uncheck a checkbox
|
|
34
|
-
- `WebUI.uploadFile(testObject, filePath)` - Upload a file to a file input
|
|
35
|
-
|
|
36
|
-
### Wait Keywords
|
|
37
|
-
|
|
38
|
-
- `WebUI.waitForElementPresent(testObject, timeoutInSeconds)` - Wait for element to be present in DOM
|
|
39
|
-
- `WebUI.waitForElementVisible(testObject, timeoutInSeconds)` - Wait for element to be visible
|
|
40
|
-
- `WebUI.waitForElementClickable(testObject, timeoutInSeconds)` - Wait for element to be clickable
|
|
41
|
-
- `WebUI.waitForElementNotPresent(testObject, timeoutInSeconds)` - Wait for element to not be present
|
|
42
|
-
- `WebUI.waitForElementNotVisible(testObject, timeoutInSeconds)` - Wait for element to not be visible
|
|
43
|
-
- `WebUI.waitForPageLoad(timeoutInSeconds)` - Wait for page to fully load
|
|
44
|
-
- `WebUI.delay(timeInSeconds)` - Pause execution for specified seconds
|
|
45
|
-
|
|
46
|
-
### Verification Keywords
|
|
47
|
-
|
|
48
|
-
- `WebUI.verifyElementPresent(testObject, timeoutInSeconds)` - Verify element is present
|
|
49
|
-
- `WebUI.verifyElementVisible(testObject)` - Verify element is visible
|
|
50
|
-
- `WebUI.verifyElementClickable(testObject)` - Verify element is clickable
|
|
51
|
-
- `WebUI.verifyElementNotPresent(testObject, timeoutInSeconds)` - Verify element is not present
|
|
52
|
-
- `WebUI.verifyElementText(testObject, expectedText)` - Verify element contains expected text
|
|
53
|
-
- `WebUI.verifyTextPresent(text, isRegex)` - Verify text is present on the page
|
|
54
|
-
- `WebUI.verifyElementAttributeValue(testObject, attribute, expectedValue, timeoutInSeconds)` - Verify element attribute value
|
|
55
|
-
|
|
56
|
-
### Get Keywords
|
|
57
|
-
|
|
58
|
-
- `WebUI.getText(testObject)` - Get text content of an element
|
|
59
|
-
- `WebUI.getAttribute(testObject, attribute)` - Get attribute value of an element
|
|
60
|
-
- `WebUI.getCSSValue(testObject, propertyName)` - Get CSS property value
|
|
61
|
-
- `WebUI.getUrl()` - Get current page URL
|
|
62
|
-
- `WebUI.getWindowTitle()` - Get current window title
|
|
63
|
-
|
|
64
|
-
### Screenshot Keywords
|
|
65
|
-
|
|
66
|
-
- `WebUI.takeScreenshot(filePath)` - Take a screenshot and save to file
|
|
67
|
-
- `WebUI.takeFullPageScreenshot(filePath)` - Take a full-page screenshot
|
|
68
|
-
|
|
69
|
-
## Mobile Keywords
|
|
70
|
-
|
|
71
|
-
Katalon's Mobile keywords are accessed via `com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords` (commonly imported as `Mobile`).
|
|
72
|
-
|
|
73
|
-
### Common Mobile Keywords
|
|
74
|
-
|
|
75
|
-
- `Mobile.startApplication(appPath)` - Start a mobile application
|
|
76
|
-
- `Mobile.closeApplication()` - Close the current application
|
|
77
|
-
- `Mobile.tap(testObject, timeout)` - Tap on a mobile element
|
|
78
|
-
- `Mobile.setText(testObject, text, timeout)` - Set text in a mobile input
|
|
79
|
-
- `Mobile.getText(testObject, timeout)` - Get text from a mobile element
|
|
80
|
-
- `Mobile.verifyElementExist(testObject, timeout)` - Verify mobile element exists
|
|
81
|
-
- `Mobile.scrollToText(text)` - Scroll until specified text is visible
|
|
82
|
-
- `Mobile.swipe(startX, startY, endX, endY)` - Perform a swipe gesture
|
|
83
|
-
|
|
84
|
-
## Web Service (API) Keywords
|
|
85
|
-
|
|
86
|
-
Katalon's Web Service keywords are accessed via `com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords` (commonly imported as `WS`).
|
|
87
|
-
|
|
88
|
-
### API Keywords
|
|
89
|
-
|
|
90
|
-
- `WS.sendRequest(requestObject)` - Send a web service request
|
|
91
|
-
- `WS.verifyResponseStatusCode(response, statusCode)` - Verify HTTP response status code
|
|
92
|
-
- `WS.verifyElementPropertyValue(response, locator, expectedValue)` - Verify JSON/XML element value
|
|
93
|
-
- `WS.getElementPropertyValue(response, locator)` - Get value from JSON/XML response
|
|
94
|
-
- `WS.verifyElementsCount(response, locator, expectedCount)` - Verify count of elements in response
|
|
95
|
-
|
|
96
|
-
## Utility Keywords
|
|
97
|
-
|
|
98
|
-
### Checkpoint Keywords
|
|
99
|
-
|
|
100
|
-
- `findCheckpoint(checkpointName)` - Find a checkpoint by name
|
|
101
|
-
|
|
102
|
-
### Test Case Keywords
|
|
103
|
-
|
|
104
|
-
- `findTestCase(testCasePath)` - Find a test case by path
|
|
105
|
-
- `WebUI.callTestCase(testCase, variables)` - Call another test case
|
|
106
|
-
|
|
107
|
-
### Test Data Keywords
|
|
108
|
-
|
|
109
|
-
- `findTestData(testDataName)` - Find test data by name
|
|
110
|
-
|
|
111
|
-
### Object Repository Keywords
|
|
112
|
-
|
|
113
|
-
- `findTestObject(objectPath)` - Find a test object from Object Repository
|
|
114
|
-
- `findTestObject(objectPath, variables)` - Find a test object with variable bindings
|
|
115
|
-
|
|
116
|
-
## Global Variables
|
|
117
|
-
|
|
118
|
-
Access global variables defined in profiles using `internal.GlobalVariable`:
|
|
119
|
-
|
|
120
|
-
```groovy
|
|
121
|
-
import internal.GlobalVariable
|
|
122
|
-
|
|
123
|
-
// Access a global variable
|
|
124
|
-
String url = GlobalVariable.baseUrl
|
|
125
|
-
String username = GlobalVariable.username
|
|
126
|
-
int timeout = GlobalVariable.waitTimeout
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Failure Handling
|
|
130
|
-
|
|
131
|
-
Control how test execution handles failures using `com.kms.katalon.core.model.FailureHandling`:
|
|
132
|
-
|
|
133
|
-
- `FailureHandling.STOP_ON_FAILURE` - Stop test execution on failure (default)
|
|
134
|
-
- `FailureHandling.CONTINUE_ON_FAILURE` - Continue execution even if step fails
|
|
135
|
-
- `FailureHandling.OPTIONAL` - Mark step as optional, continue regardless of result
|
|
136
|
-
|
|
137
|
-
Example:
|
|
138
|
-
```groovy
|
|
139
|
-
WebUI.verifyElementPresent(findTestObject('optionalElement'), 5, FailureHandling.OPTIONAL)
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## Annotations for Custom Keywords
|
|
143
|
-
|
|
144
|
-
When creating custom keywords, use the `@Keyword` annotation:
|
|
145
|
-
|
|
146
|
-
```groovy
|
|
147
|
-
import com.kms.katalon.core.annotation.Keyword
|
|
148
|
-
|
|
149
|
-
class MyKeywords {
|
|
150
|
-
@Keyword
|
|
151
|
-
def myCustomKeyword(String param) {
|
|
152
|
-
// Implementation
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
```
|
|
1
|
+
# Katalon Built-in Keywords API Reference
|
|
2
|
+
|
|
3
|
+
This document provides a reference for Katalon Studio's most commonly used built-in keywords.
|
|
4
|
+
|
|
5
|
+
## WebUI Keywords
|
|
6
|
+
|
|
7
|
+
Katalon's WebUI keywords are accessed via `com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords` (commonly imported as `WebUI`).
|
|
8
|
+
|
|
9
|
+
### Navigation Keywords
|
|
10
|
+
|
|
11
|
+
- `WebUI.openBrowser(url)` - Open a browser and navigate to URL
|
|
12
|
+
- `WebUI.navigateToUrl(url)` - Navigate to a URL in the current browser
|
|
13
|
+
- `WebUI.closeBrowser()` - Close the current browser
|
|
14
|
+
- `WebUI.back()` - Navigate back in browser history
|
|
15
|
+
- `WebUI.forward()` - Navigate forward in browser history
|
|
16
|
+
- `WebUI.refresh()` - Refresh the current page
|
|
17
|
+
- `WebUI.switchToWindowIndex(index)` - Switch to a browser window by index
|
|
18
|
+
- `WebUI.switchToWindowTitle(title)` - Switch to a browser window by title
|
|
19
|
+
- `WebUI.switchToWindowUrl(url)` - Switch to a browser window by URL
|
|
20
|
+
|
|
21
|
+
### Element Interaction Keywords
|
|
22
|
+
|
|
23
|
+
- `WebUI.click(testObject)` - Click on an element
|
|
24
|
+
- `WebUI.doubleClick(testObject)` - Double-click on an element
|
|
25
|
+
- `WebUI.rightClick(testObject)` - Right-click on an element
|
|
26
|
+
- `WebUI.setText(testObject, text)` - Set text for an input field
|
|
27
|
+
- `WebUI.sendKeys(testObject, text)` - Send keyboard input to an element
|
|
28
|
+
- `WebUI.clearText(testObject)` - Clear text from an input field
|
|
29
|
+
- `WebUI.selectOptionByValue(testObject, value, isRegex)` - Select dropdown option by value
|
|
30
|
+
- `WebUI.selectOptionByLabel(testObject, label, isRegex)` - Select dropdown option by label
|
|
31
|
+
- `WebUI.selectOptionByIndex(testObject, index)` - Select dropdown option by index
|
|
32
|
+
- `WebUI.check(testObject)` - Check a checkbox
|
|
33
|
+
- `WebUI.uncheck(testObject)` - Uncheck a checkbox
|
|
34
|
+
- `WebUI.uploadFile(testObject, filePath)` - Upload a file to a file input
|
|
35
|
+
|
|
36
|
+
### Wait Keywords
|
|
37
|
+
|
|
38
|
+
- `WebUI.waitForElementPresent(testObject, timeoutInSeconds)` - Wait for element to be present in DOM
|
|
39
|
+
- `WebUI.waitForElementVisible(testObject, timeoutInSeconds)` - Wait for element to be visible
|
|
40
|
+
- `WebUI.waitForElementClickable(testObject, timeoutInSeconds)` - Wait for element to be clickable
|
|
41
|
+
- `WebUI.waitForElementNotPresent(testObject, timeoutInSeconds)` - Wait for element to not be present
|
|
42
|
+
- `WebUI.waitForElementNotVisible(testObject, timeoutInSeconds)` - Wait for element to not be visible
|
|
43
|
+
- `WebUI.waitForPageLoad(timeoutInSeconds)` - Wait for page to fully load
|
|
44
|
+
- `WebUI.delay(timeInSeconds)` - Pause execution for specified seconds
|
|
45
|
+
|
|
46
|
+
### Verification Keywords
|
|
47
|
+
|
|
48
|
+
- `WebUI.verifyElementPresent(testObject, timeoutInSeconds)` - Verify element is present
|
|
49
|
+
- `WebUI.verifyElementVisible(testObject)` - Verify element is visible
|
|
50
|
+
- `WebUI.verifyElementClickable(testObject)` - Verify element is clickable
|
|
51
|
+
- `WebUI.verifyElementNotPresent(testObject, timeoutInSeconds)` - Verify element is not present
|
|
52
|
+
- `WebUI.verifyElementText(testObject, expectedText)` - Verify element contains expected text
|
|
53
|
+
- `WebUI.verifyTextPresent(text, isRegex)` - Verify text is present on the page
|
|
54
|
+
- `WebUI.verifyElementAttributeValue(testObject, attribute, expectedValue, timeoutInSeconds)` - Verify element attribute value
|
|
55
|
+
|
|
56
|
+
### Get Keywords
|
|
57
|
+
|
|
58
|
+
- `WebUI.getText(testObject)` - Get text content of an element
|
|
59
|
+
- `WebUI.getAttribute(testObject, attribute)` - Get attribute value of an element
|
|
60
|
+
- `WebUI.getCSSValue(testObject, propertyName)` - Get CSS property value
|
|
61
|
+
- `WebUI.getUrl()` - Get current page URL
|
|
62
|
+
- `WebUI.getWindowTitle()` - Get current window title
|
|
63
|
+
|
|
64
|
+
### Screenshot Keywords
|
|
65
|
+
|
|
66
|
+
- `WebUI.takeScreenshot(filePath)` - Take a screenshot and save to file
|
|
67
|
+
- `WebUI.takeFullPageScreenshot(filePath)` - Take a full-page screenshot
|
|
68
|
+
|
|
69
|
+
## Mobile Keywords
|
|
70
|
+
|
|
71
|
+
Katalon's Mobile keywords are accessed via `com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords` (commonly imported as `Mobile`).
|
|
72
|
+
|
|
73
|
+
### Common Mobile Keywords
|
|
74
|
+
|
|
75
|
+
- `Mobile.startApplication(appPath)` - Start a mobile application
|
|
76
|
+
- `Mobile.closeApplication()` - Close the current application
|
|
77
|
+
- `Mobile.tap(testObject, timeout)` - Tap on a mobile element
|
|
78
|
+
- `Mobile.setText(testObject, text, timeout)` - Set text in a mobile input
|
|
79
|
+
- `Mobile.getText(testObject, timeout)` - Get text from a mobile element
|
|
80
|
+
- `Mobile.verifyElementExist(testObject, timeout)` - Verify mobile element exists
|
|
81
|
+
- `Mobile.scrollToText(text)` - Scroll until specified text is visible
|
|
82
|
+
- `Mobile.swipe(startX, startY, endX, endY)` - Perform a swipe gesture
|
|
83
|
+
|
|
84
|
+
## Web Service (API) Keywords
|
|
85
|
+
|
|
86
|
+
Katalon's Web Service keywords are accessed via `com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords` (commonly imported as `WS`).
|
|
87
|
+
|
|
88
|
+
### API Keywords
|
|
89
|
+
|
|
90
|
+
- `WS.sendRequest(requestObject)` - Send a web service request
|
|
91
|
+
- `WS.verifyResponseStatusCode(response, statusCode)` - Verify HTTP response status code
|
|
92
|
+
- `WS.verifyElementPropertyValue(response, locator, expectedValue)` - Verify JSON/XML element value
|
|
93
|
+
- `WS.getElementPropertyValue(response, locator)` - Get value from JSON/XML response
|
|
94
|
+
- `WS.verifyElementsCount(response, locator, expectedCount)` - Verify count of elements in response
|
|
95
|
+
|
|
96
|
+
## Utility Keywords
|
|
97
|
+
|
|
98
|
+
### Checkpoint Keywords
|
|
99
|
+
|
|
100
|
+
- `findCheckpoint(checkpointName)` - Find a checkpoint by name
|
|
101
|
+
|
|
102
|
+
### Test Case Keywords
|
|
103
|
+
|
|
104
|
+
- `findTestCase(testCasePath)` - Find a test case by path
|
|
105
|
+
- `WebUI.callTestCase(testCase, variables)` - Call another test case
|
|
106
|
+
|
|
107
|
+
### Test Data Keywords
|
|
108
|
+
|
|
109
|
+
- `findTestData(testDataName)` - Find test data by name
|
|
110
|
+
|
|
111
|
+
### Object Repository Keywords
|
|
112
|
+
|
|
113
|
+
- `findTestObject(objectPath)` - Find a test object from Object Repository
|
|
114
|
+
- `findTestObject(objectPath, variables)` - Find a test object with variable bindings
|
|
115
|
+
|
|
116
|
+
## Global Variables
|
|
117
|
+
|
|
118
|
+
Access global variables defined in profiles using `internal.GlobalVariable`:
|
|
119
|
+
|
|
120
|
+
```groovy
|
|
121
|
+
import internal.GlobalVariable
|
|
122
|
+
|
|
123
|
+
// Access a global variable
|
|
124
|
+
String url = GlobalVariable.baseUrl
|
|
125
|
+
String username = GlobalVariable.username
|
|
126
|
+
int timeout = GlobalVariable.waitTimeout
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Failure Handling
|
|
130
|
+
|
|
131
|
+
Control how test execution handles failures using `com.kms.katalon.core.model.FailureHandling`:
|
|
132
|
+
|
|
133
|
+
- `FailureHandling.STOP_ON_FAILURE` - Stop test execution on failure (default)
|
|
134
|
+
- `FailureHandling.CONTINUE_ON_FAILURE` - Continue execution even if step fails
|
|
135
|
+
- `FailureHandling.OPTIONAL` - Mark step as optional, continue regardless of result
|
|
136
|
+
|
|
137
|
+
Example:
|
|
138
|
+
```groovy
|
|
139
|
+
WebUI.verifyElementPresent(findTestObject('optionalElement'), 5, FailureHandling.OPTIONAL)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Annotations for Custom Keywords
|
|
143
|
+
|
|
144
|
+
When creating custom keywords, use the `@Keyword` annotation:
|
|
145
|
+
|
|
146
|
+
```groovy
|
|
147
|
+
import com.kms.katalon.core.annotation.Keyword
|
|
148
|
+
|
|
149
|
+
class MyKeywords {
|
|
150
|
+
@Keyword
|
|
151
|
+
def myCustomKeyword(String param) {
|
|
152
|
+
// Implementation
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
# CLI Runner Commands & Enterprise Test Suites Registry
|
|
2
|
-
|
|
3
|
-
Reference documentation for the `katalon-cli-runner` skill.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 1. Environment Variable Configuration (.env)
|
|
8
|
-
```bash
|
|
9
|
-
KATALON_API_KEY="your_actual_api_key_here"
|
|
10
|
-
KATALON_PROJECT_PATH="/path/to/project"
|
|
11
|
-
TELEGRAM_BOT_TOKEN="your_bot_token"
|
|
12
|
-
TELEGRAM_CHAT_ID="your_chat_id"
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 2. Platform-Specific Execution Commands (KRE CLI)
|
|
18
|
-
|
|
19
|
-
### 2.1. Windows Environment (PowerShell Runner)
|
|
20
|
-
```powershell
|
|
21
|
-
# Run Test Suite with API Key
|
|
22
|
-
powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/07_QuanTriDuLieu" -ApiKey $env:KATALON_API_KEY
|
|
23
|
-
|
|
24
|
-
# Run single Test Suite for debugging:
|
|
25
|
-
powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/Group_07_01_CumCongNghiep"
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### 2.2. macOS / Linux CLI (Headless Full HD)
|
|
29
|
-
```bash
|
|
30
|
-
# Run Test Suite
|
|
31
|
-
katalonc \
|
|
32
|
-
-noSplash \
|
|
33
|
-
-runMode=console \
|
|
34
|
-
-projectPath="$(pwd)/project.prj" \
|
|
35
|
-
-retry=0 \
|
|
36
|
-
-testSuitePath="Test Suites/07_QuanTriDuLieu" \
|
|
37
|
-
-browserType="Chrome (headless)" \
|
|
38
|
-
-executionProfile="default" \
|
|
39
|
-
-apiKey="$KATALON_API_KEY" \
|
|
40
|
-
--args="-headless --window-size=1920,1080 --disable-gpu --no-sandbox --disable-dev-shm-usage"
|
|
41
|
-
|
|
42
|
-
# Run single Test Case (Debug Mode):
|
|
43
|
-
katalonc \
|
|
44
|
-
-noSplash \
|
|
45
|
-
-runMode=console \
|
|
46
|
-
-projectPath="$(pwd)/project.prj" \
|
|
47
|
-
-testCasePath="Test Cases/TC-1 Kiểm tra tạo mới thành công" \
|
|
48
|
-
-browserType="Chrome (headless)" \
|
|
49
|
-
-apiKey="$KATALON_API_KEY"
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
## 3. Standard Enterprise Test Suite Registry
|
|
55
|
-
|
|
56
|
-
| Test Suite Name | Scale | Target Functional Module |
|
|
57
|
-
| :--- | :---: | :--- |
|
|
58
|
-
| `Test Suites/All_Tests` | Full Suite | All functional modules |
|
|
59
|
-
| `Test Suites/01_QuanLyChiTieu` | 7 TCs | Target Planning |
|
|
60
|
-
| `Test Suites/02_XacThucNguoiDung` | 5 TCs | User Authentication & Profiles |
|
|
61
|
-
| `Test Suites/03_QuanTriHeThong` | 4 TCs | System Administration & Users |
|
|
62
|
-
| `Test Suites/04_DanhMucDungChung` | 12 TCs | Common Categories (Departments, Roles) |
|
|
63
|
-
| `Test Suites/05_DanhMucNganhCongThuong` | 64 TCs | 16 Industry Sub-Categories |
|
|
64
|
-
| `Test Suites/06_QuyHoachCongThuong` | 30 TCs | Sector Planning |
|
|
65
|
-
| `Test Suites/07_QuanTriDuLieu` | 125 TCs | Data Mining & GIS Maps |
|
|
66
|
-
| `Test Suites/08_BaoCaoThongKe` | 2 TCs | Statistical Reports (Data & Permits) |
|
|
67
|
-
| `Test Suites/09_ChiaSeDuLieu` | 10 TCs | Data Sharing & API Token Lifecycle |
|
|
1
|
+
# CLI Runner Commands & Enterprise Test Suites Registry
|
|
2
|
+
|
|
3
|
+
Reference documentation for the `katalon-cli-runner` skill.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Environment Variable Configuration (.env)
|
|
8
|
+
```bash
|
|
9
|
+
KATALON_API_KEY="your_actual_api_key_here"
|
|
10
|
+
KATALON_PROJECT_PATH="/path/to/project"
|
|
11
|
+
TELEGRAM_BOT_TOKEN="your_bot_token"
|
|
12
|
+
TELEGRAM_CHAT_ID="your_chat_id"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 2. Platform-Specific Execution Commands (KRE CLI)
|
|
18
|
+
|
|
19
|
+
### 2.1. Windows Environment (PowerShell Runner)
|
|
20
|
+
```powershell
|
|
21
|
+
# Run Test Suite with API Key
|
|
22
|
+
powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/07_QuanTriDuLieu" -ApiKey $env:KATALON_API_KEY
|
|
23
|
+
|
|
24
|
+
# Run single Test Suite for debugging:
|
|
25
|
+
powershell -ExecutionPolicy Bypass -File .\run_tests_windows.ps1 -Suite "Test Suites/Group_07_01_CumCongNghiep"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 2.2. macOS / Linux CLI (Headless Full HD)
|
|
29
|
+
```bash
|
|
30
|
+
# Run Test Suite
|
|
31
|
+
katalonc \
|
|
32
|
+
-noSplash \
|
|
33
|
+
-runMode=console \
|
|
34
|
+
-projectPath="$(pwd)/project.prj" \
|
|
35
|
+
-retry=0 \
|
|
36
|
+
-testSuitePath="Test Suites/07_QuanTriDuLieu" \
|
|
37
|
+
-browserType="Chrome (headless)" \
|
|
38
|
+
-executionProfile="default" \
|
|
39
|
+
-apiKey="$KATALON_API_KEY" \
|
|
40
|
+
--args="-headless --window-size=1920,1080 --disable-gpu --no-sandbox --disable-dev-shm-usage"
|
|
41
|
+
|
|
42
|
+
# Run single Test Case (Debug Mode):
|
|
43
|
+
katalonc \
|
|
44
|
+
-noSplash \
|
|
45
|
+
-runMode=console \
|
|
46
|
+
-projectPath="$(pwd)/project.prj" \
|
|
47
|
+
-testCasePath="Test Cases/TC-1 Kiểm tra tạo mới thành công" \
|
|
48
|
+
-browserType="Chrome (headless)" \
|
|
49
|
+
-apiKey="$KATALON_API_KEY"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 3. Standard Enterprise Test Suite Registry
|
|
55
|
+
|
|
56
|
+
| Test Suite Name | Scale | Target Functional Module |
|
|
57
|
+
| :--- | :---: | :--- |
|
|
58
|
+
| `Test Suites/All_Tests` | Full Suite | All functional modules |
|
|
59
|
+
| `Test Suites/01_QuanLyChiTieu` | 7 TCs | Target Planning |
|
|
60
|
+
| `Test Suites/02_XacThucNguoiDung` | 5 TCs | User Authentication & Profiles |
|
|
61
|
+
| `Test Suites/03_QuanTriHeThong` | 4 TCs | System Administration & Users |
|
|
62
|
+
| `Test Suites/04_DanhMucDungChung` | 12 TCs | Common Categories (Departments, Roles) |
|
|
63
|
+
| `Test Suites/05_DanhMucNganhCongThuong` | 64 TCs | 16 Industry Sub-Categories |
|
|
64
|
+
| `Test Suites/06_QuyHoachCongThuong` | 30 TCs | Sector Planning |
|
|
65
|
+
| `Test Suites/07_QuanTriDuLieu` | 125 TCs | Data Mining & GIS Maps |
|
|
66
|
+
| `Test Suites/08_BaoCaoThongKe` | 2 TCs | Statistical Reports (Data & Permits) |
|
|
67
|
+
| `Test Suites/09_ChiaSeDuLieu` | 10 TCs | Data Sharing & API Token Lifecycle |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lam-script-generator
|
|
3
|
-
description: "Transform user stories and acceptance criteria into Clean POM automation scripts."
|
|
3
|
+
description: "Transform user stories and acceptance criteria into Clean POM automation scripts. Use when the user provides a user story, acceptance criteria, or requirement document that must become a runnable script."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# LAM Script Generator — Large Action Model for Test Automation
|
|
@@ -80,3 +80,44 @@ IndustryDataPage.deleteRecordByCode(uniqueCode)
|
|
|
80
80
|
- Zero raw XPaths, CSS selectors, or `findTestObject` in the generated script.
|
|
81
81
|
- Always generate dynamic identifiers with prefixes via `BasePage.uniqueCode()`.
|
|
82
82
|
- Always generate mandatory teardown cleanup for created entities.
|
|
83
|
+
|
|
84
|
+
## 4. Proven-vs-Owed Traceability Pipeline
|
|
85
|
+
|
|
86
|
+
> *Borrowed and adapted from the Kane CLI generate→execute→prove workflow (Apache-2.0, lambdatest/kane-cli).*
|
|
87
|
+
|
|
88
|
+
Generated scripts must be traceable to the acceptance criteria they prove.
|
|
89
|
+
For every user story, maintain the chain:
|
|
90
|
+
|
|
91
|
+
```mermaid
|
|
92
|
+
flowchart LR
|
|
93
|
+
Story["<b>User Story</b>"] --> UC["<b>Use Cases</b><br/>(each cites its source line)"]
|
|
94
|
+
UC --> AC["<b>Acceptance Criteria</b><br/>(Given/When/Then, testable)"]
|
|
95
|
+
AC --> SC["<b>Scenarios</b><br/>(happy + negative + boundary)"]
|
|
96
|
+
SC --> TC["<b>Automation Scripts</b><br/>(Clean POM, 0 raw XPath)"]
|
|
97
|
+
TC --> EV["<b>Proven vs Owed</b><br/>coverage per criterion"]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Rules:
|
|
101
|
+
|
|
102
|
+
1. **Every generated script cites its criterion** — keep the AC id in the test
|
|
103
|
+
case name or a comment header; a script nobody can trace back is a liability.
|
|
104
|
+
2. **Report coverage as proven vs owed, not test counts** — a criterion with no
|
|
105
|
+
passing automated script is *owed*; N scripts proving one criterion is waste.
|
|
106
|
+
3. **Reconcile on requirement change** — when a story changes, re-run the chain
|
|
107
|
+
and mark stale scripts before trusting any green run.
|
|
108
|
+
4. For BDD inputs, the `gherkin-to-suite` skill performs the AC→scenario
|
|
109
|
+
expansion deterministically (0-token); feed its Universal IR here for
|
|
110
|
+
codification.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 5. Boundary vs `clean-pom-crafter` and `gherkin-to-suite`
|
|
115
|
+
|
|
116
|
+
- **This skill** = natural-language story → action-sequence script skeleton
|
|
117
|
+
(the "what steps, in what order" reasoning layer).
|
|
118
|
+
- **`clean-pom-crafter`** owns the Page Classes and locator discipline that the
|
|
119
|
+
skeleton's business-flow calls resolve against — never inline raw selectors
|
|
120
|
+
here.
|
|
121
|
+
- **`gherkin-to-suite`** is the deterministic (0-token) alternative when
|
|
122
|
+
requirements already exist as `.feature` files; use it first, and feed its
|
|
123
|
+
Universal IR here only when story-level reasoning must fill the gaps.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# User Story: User Password Reset Flow
|
|
2
|
+
As a registered customer,
|
|
3
|
+
I want to request a password reset email,
|
|
4
|
+
So that I can regain access if I forget my password.
|
|
5
|
+
|
|
6
|
+
## Acceptance Criteria:
|
|
7
|
+
1. Submitting registered email displays "Reset link dispatched".
|
|
8
|
+
2. Submitting empty email highlights field in red with validation error.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lean-code-ladder
|
|
3
|
+
description: "Apply a 7-rung reuse-first ladder so every new test-automation code path is the smallest complete change that fully solves the task. Use when adding helpers, Page Class methods, dependencies, or any new code where a shorter existing option might already exist."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Lean Code Ladder — Enterprise Reuse-First Standard
|
|
7
|
+
|
|
8
|
+
Specialized skill for minimizing newly written code in test automation projects: solve the whole problem with the least new code, then finish the change completely (callers, fixtures, and the small test that proves it).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. The 7-Rung Ladder
|
|
13
|
+
|
|
14
|
+
Before writing any new code, descend the ladder and take the **first rung that fully works**:
|
|
15
|
+
|
|
16
|
+
| Rung | Question | Action |
|
|
17
|
+
|:---:|---|---|
|
|
18
|
+
| 0 | Does it need to exist? | Skip features, options, and flexibility nobody asked for; name what you skipped in one line. A vague request gets the smallest version that does the core job. |
|
|
19
|
+
| 1 | Already in the codebase? | A helper, Page Class method, or fixture exists? Use it the way the surrounding code does. |
|
|
20
|
+
| 2 | Standard library? | Use the language stdlib unless the project has its own equivalent. |
|
|
21
|
+
| 3 | Platform / framework native? | A built-in of the test framework beats a hand-rolled widget (e.g. Playwright auto-waiting, `expect` web-first assertions). |
|
|
22
|
+
| 4 | Installed dependency? | Use it. Never add a new dependency for a few lines. |
|
|
23
|
+
| 5 | One line? | Can it be one line a reader gets at a glance? Then one line. |
|
|
24
|
+
| 6 | Minimum new code | Write the minimum that works, and no more. |
|
|
25
|
+
|
|
26
|
+
## 2. Reading Order Before Writing
|
|
27
|
+
|
|
28
|
+
- Read the task and the code it touches. List every place the change must reach: callers, tests, fixtures, config, exports.
|
|
29
|
+
- Check what the change could break: data it would destroy or expose, callers that stop working. That is scope. Extra features are not.
|
|
30
|
+
|
|
31
|
+
## 3. Completeness Rules (Be Lazy About the Solution, Never About the Change)
|
|
32
|
+
|
|
33
|
+
- Finish every part the task needs, including the callers, tests, and fixtures the change affects.
|
|
34
|
+
- No abstraction, wrapper, option, config, or "for later" code nobody asked for. Keep values in the form the platform already gives. Deletion beats addition; keep the structure the codebase already has.
|
|
35
|
+
- The shortest working diff wins, once everything it must touch is known. A one-liner that needs decoding is not short.
|
|
36
|
+
- Comment only the "why" the code cannot show, in one line.
|
|
37
|
+
- Bug fix: grep every caller of the touched function first, then fix the root cause once in the shared code (pair with `systematic-debugging`).
|
|
38
|
+
- Code that is moved or merged keeps its error handling and validation.
|
|
39
|
+
- Between options of equal size, take the one that is correct on edge cases.
|
|
40
|
+
- New non-trivial logic (a branch, loop, parser, money/security path, or a whole new script) leaves one small test or assert-based self-check before it counts as finished; trivial changes need none.
|
|
41
|
+
- A shortcut with a known limit gets a code comment: `shortcut: <the limit>, <when to upgrade>`.
|
|
42
|
+
|
|
43
|
+
## 4. Never Cut (Hard Floor)
|
|
44
|
+
|
|
45
|
+
The ladder minimizes code, never safety. The following are never removed or skipped in the name of leanness:
|
|
46
|
+
|
|
47
|
+
- Validation at trust boundaries
|
|
48
|
+
- Error handling that prevents data loss
|
|
49
|
+
- Security checks (credential handling, authorization assertions)
|
|
50
|
+
- Accessibility behavior
|
|
51
|
+
- Anything the user explicitly asked for
|
|
52
|
+
|
|
53
|
+
## 5. Evidence of Leanness
|
|
54
|
+
|
|
55
|
+
- Run `python3 tools/infer_linter.py` after the change: zero fake-pass findings confirms the lean diff did not trade rigor for brevity.
|
|
56
|
+
- Run the affected subset from `python3 tools/test_impact.py --git-diff` to prove the shortest diff still reaches everything it had to reach.
|
|
57
|
+
- Lean code without its check is unfinished: Gate 8 (`tools/micro_mutator.py`, Mutation Score >= 80%) remains the floor for any assertion logic written on this ladder.
|
|
58
|
+
|
|
59
|
+
## 6. Worked Comparison
|
|
60
|
+
|
|
61
|
+
| Situation | Bloated answer | Lean answer |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| Need a date picker in a form test | 300-line custom calendar component | Native `<input type="date">` via the existing form helper (Rung 3) |
|
|
64
|
+
| Need retry around a flaky API call | New generic retry framework with policy classes | The installed HTTP client's retry option (Rung 4) + one test |
|
|
65
|
+
| Need a formatted timestamp in test data | New utility module | One line with the stdlib formatter (Rung 2) |
|
|
66
|
+
|
|
67
|
+
## 7. Boundary vs Sibling Skills (Do Not Confuse)
|
|
68
|
+
|
|
69
|
+
| Sibling | Owns | Hand-off |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `surgical-coding-principles` | Diff discipline (every line traces to the request) | The ladder chooses the solution shape; surgical principles keep the diff clean |
|
|
72
|
+
| `code-refactoring-refactor-clean` | Deliberate SOLID refactors of existing debt | Refactoring is not ladder work; only new/changed code descends the ladder |
|
|
73
|
+
| `clean-pom-crafter` | Page Class architecture and locator tiers | Ladder applies inside and around Page Classes, not to their architecture contract |
|
|
74
|
+
|
|
75
|
+
## 8. Reference Documentation
|
|
76
|
+
|
|
77
|
+
- `python3 tools/infer_linter.py` — fake-pass scan for the new logic.
|
|
78
|
+
- `python3 tools/test_impact.py --git-diff` — confirm the lean diff still covers all impacted tests.
|
|
79
|
+
- `python3 tools/micro_mutator.py` — Gate 8 mutation floor (>= 80%) for non-trivial new logic.
|
|
80
|
+
|
|
81
|
+
## 9. Attribution
|
|
82
|
+
|
|
83
|
+
Adapted from **ponytail** (https://github.com/DietrichGebert/ponytail) — MIT License, Copyright (c) 2026 DietrichGebert. The lazy-senior ladder, completeness rules, and never-cut floor are re-scoped for enterprise test automation in Synapse Hub; wording, structure, and examples modified.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Example: Walking the Ladder for a Real Request
|
|
2
|
+
|
|
3
|
+
Request: "In the login test suite, when login fails we need a readable message that includes the actual error returned by the app."
|
|
4
|
+
|
|
5
|
+
## Descent
|
|
6
|
+
|
|
7
|
+
| Rung | Checked | Result |
|
|
8
|
+
|:---:|---|---|
|
|
9
|
+
| 0 | Does it need to exist? | Yes — failure messages currently say only `Login failed`, which hides the app's actual error. Core job: include the returned error text. |
|
|
10
|
+
| 1 | Already in the codebase? | YES — the login Page Class already builds an error context object with the app message; the assertion just never prints it. |
|
|
11
|
+
| 2-4 | stdlib / platform / dependency | Not needed — rung 1 already solves it. |
|
|
12
|
+
| 5-6 | One line / minimum | The fix becomes a one-line assertion change reusing the existing context object. |
|
|
13
|
+
|
|
14
|
+
## Lean diff (the whole change)
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
- expect(page).toHaveText('Login failed');
|
|
18
|
+
+ expect(page).toHaveText(`Login failed: ${errorContext.message}`);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Plus the completeness rule: one new test asserts the message embeds the app
|
|
22
|
+
error for a rejected-credentials fixture, so the non-trivial path is covered.
|
|
23
|
+
|
|
24
|
+
## Anti-example (what the ladder forbids)
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
+ class RetryableErrorContextFormatterFactory { ... } // Rung 0 violation
|
|
28
|
+
+ npm install fancy-string-utils // Rung 4 violation
|
|
29
|
+
+ config option: errorMessageTemplateStyle: 'verbose' | 'compact' // nobody asked
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Never-cut check (Rung floor)
|
|
33
|
+
|
|
34
|
+
The shorter assertion still validates at the trust boundary (the app's
|
|
35
|
+
returned error is rendered before being asserted), leaks no credentials into
|
|
36
|
+
the failure message, and the fixture error text is sanitized synthetic data.
|
|
37
|
+
Leanness changed the size of the diff, not the safety of the test.
|