From 32ff499e0c1b1e261dbd1f46305ad7f5878149e6 Mon Sep 17 00:00:00 2001 From: tauqirsarwar1 Date: Mon, 18 Mar 2024 15:28:41 +0500 Subject: [PATCH] Docker first commit --- .github/workflows/docker_workflow.yml | 224 ++++++++++++++++++++++++++ bp_core/frontend/frontend_plugin.py | 22 ++- configs/docker_chrome.json | 10 ++ configs/docker_edge.json | 10 ++ configs/docker_firefox.json | 10 ++ docker-compose.yml | 42 +++++ web_local_run.sh | 4 + 7 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/docker_workflow.yml create mode 100644 configs/docker_chrome.json create mode 100644 configs/docker_edge.json create mode 100644 configs/docker_firefox.json create mode 100644 docker-compose.yml create mode 100755 web_local_run.sh diff --git a/.github/workflows/docker_workflow.yml b/.github/workflows/docker_workflow.yml new file mode 100644 index 00000000..b825db50 --- /dev/null +++ b/.github/workflows/docker_workflow.yml @@ -0,0 +1,224 @@ +name: Docker Web UI Tests + +env: + TAGS: web_tests + BASE_URL: https://opensource-demo.orangehrmlive.com + HRM_USER_NAME: ${{ secrets.HRM_USER_NAME }} + HRM_PASSWORD: ${{ secrets.HRM_PASSWORD }} + USING_DOCKER: True + +on: + schedule: + - cron: '30 22 * * *' + workflow_dispatch: + inputs: + tags: + description: Gherkin Tags + required: true + default: web_tests + + baseurl: + description: Base URL + required: true + type: choice + default: https://opensource-demo.orangehrmlive.com + options: + - https://opensource-demo.orangehrmlive.com + - other + + inputurl: + description: Other than default Base URL (e.g portal url) + required: true + default: https://opensource-demo.orangehrmlive.com + + browser: + description: Browser Name + required: true + type: choice + default: chrome + options: + - chrome + - firefox + - edge + +jobs: + web-scheduled-regression: + if: github.event_name == 'schedule' + strategy: + max-parallel: 1 + fail-fast: false + matrix: + include: + - name: Linux Chrome + baseurl: https://opensource-demo.orangehrmlive.com + tags: web_tests + config_file: ./configs/docker_chrome.json + html_report: linux-chrome + concurrent_thread: 1 + + - name: Linux Firefox + baseurl: https://opensource-demo.orangehrmlive.com + tags: web_tests + config_file: ./configs/docker_firefox.json + html_report: linux-firefox + concurrent_thread: 1 + + - name: Linux Edge + baseurl: https://opensource-demo.orangehrmlive.com + tags: web_tests + config_file: ./configs/docker_edge.json + html_report: linux-edge + concurrent_thread: 1 + + name: ${{ matrix.name }} - Regression + runs-on: ubuntu-latest + steps: + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.9" + + - name: Set up Docker + id: docker_env_setup + if: steps.validate_input.outcome == 'success' + uses: docker/setup-buildx-action@v3 + + - name: Build and start Docker Compose services + id: docker_compose + if: steps.docker_env_setup.outcome == 'success' + run: | + docker-compose -f docker-compose.yml up -d + + - name: Wait for services to start + run: sleep 30 + + - name: Check out code + id: co_code + if: steps.docker_compose.outcome == 'success' + uses: actions/checkout@v4 + + - name: Setup dependencies + run: | + sh install.sh + + - name: Run All Tests + run: | + env + source $HOME/.bp-venv/bin/activate + + python -m pytest -v --driver Remote --selenium-host 'localhost' --selenium-port '4444' \ + --variables ${{ matrix.config_file }} --tags="${{ matrix.tags }}" \ + --base-url="${{ matrix.baseurl }}" \ + --reruns 1 --reruns-delay 5 \ + --html=report.html \ + --self-contained-html \ + + - name: Upload HTML run report in the Artifacts Folder + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.html_report }} + path: | + ./*.html + ./output/ + ./assets/ + if: ${{ always() }} + + docker-web-manual-run: + if: github.event_name != 'schedule' + name: Manual - ${{ inputs.browser }} - ${{ inputs.tags }} - ${{ inputs.baseurl }} + runs-on: ubuntu-latest + steps: + - name: Validate Input Parameter + id: validate_input + run: | + if [[ -z "${{ github.event.inputs.tags }}" ]]; then + echo "Invalid input: 'tags' is required but not provided." + exit 1 + fi + + if [[ -z "${{ github.event.inputs.baseurl }}" ]]; then + echo "Invalid input: 'baseurl' is required but not provided." + exit 1 + fi + + if [[ -z "${{ github.event.inputs.browser }}" ]]; then + echo "Invalid input: 'browser' is required but not provided." + exit 1 + fi + + - name: Setup Python + id: setup_python + if: steps.validate_input.outcome == 'success' + uses: actions/setup-python@v5 + with: + python-version: "3.9" + + - name: Set up Docker + id: docker_env_setup + if: steps.validate_input.outcome == 'success' + uses: docker/setup-buildx-action@v3 + + - name: Build and start Docker Compose services + id: docker_compose + if: steps.docker_env_setup.outcome == 'success' + run: | + docker-compose -f docker-compose.yml up -d + + - name: Wait for services to start + run: sleep 30 + + - name: Check out code + id: co_code + if: steps.docker_compose.outcome == 'success' + uses: actions/checkout@v4 + + - name: Setup dependencies + id: setup_dependencies + if: steps.docker_compose.outcome == 'success' + run: | + sh install.sh + + - name: Run Manual Job Tests + id: run_manual_job + if: steps.setup_dependencies.outcome == 'success' + run: | + TAGS="${{ github.event.inputs.tags }}" + + if [[ "${{ github.event.inputs.baseurl }}" == "other" ]]; then + BASE_URL="${{ github.event.inputs.inputurl }}" + else + BASE_URL="${{ github.event.inputs.baseurl }}" + fi + + number_of_threads=1 + + if [[ "${{ github.event.inputs.browser }}" == "chrome" ]]; then + BROWSER=./configs/docker_chrome.json + fi + + if [[ "${{ github.event.inputs.browser }}" == "firefox" ]]; then + BROWSER=./configs/docker_firefox.json + fi + if [[ "${{ github.event.inputs.browser }}" == "edge" ]]; then + BROWSER=./configs/docker_edge.json + fi + + env + source $HOME/.bp-venv/bin/activate + python -m pytest -v --driver Remote \ + --selenium-host 'localhost' --selenium-port '4444' \ + --variables "$BROWSER" \ + --reruns 1 --reruns-delay 5 \ + --tags="$TAGS" --base-url="$BASE_URL" --html=report.html \ + --self-contained-html + + + - name: Upload HTML run report in the Artifacts Folder + uses: actions/upload-artifact@v4 + with: + name: pytest-html-results + path: | + ./*.html + ./output/ + ./assets/ + if: ${{ always() }} diff --git a/bp_core/frontend/frontend_plugin.py b/bp_core/frontend/frontend_plugin.py index 41969a23..b6b1d37a 100644 --- a/bp_core/frontend/frontend_plugin.py +++ b/bp_core/frontend/frontend_plugin.py @@ -125,7 +125,7 @@ def chrome_options(chrome_options, variables, proxy_url, env_variables, request) chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--window-size=1367,768") - if os.environ.get("USING_DOCKER", False) and os.environ.get("SERVER", "") == "Docker": + if os.environ.get("USING_DOCKER", False) == 'True': chrome_options.add_argument("--ignore-certificate-errors") if proxy_url: chrome_options.add_argument("--ignore-certificate-errors") @@ -272,6 +272,26 @@ def driver_kwargs(capabilities, host, port, **kwargs): appium.driver_kwargs = driver_kwargs + elif os.environ.get("USING_DOCKER", "False") == 'True': + value, options = driver_options_factory + for k, v in session_capabilities.items(): + options.set_capability(k, v) + + def driver_kwargs(capabilities, host, port, **kwargs): # noqa + _ = capabilities + if value in ("chrome", "edge", "firefox"): + browser_options = kwargs.get(f"{value}_options", None) + browser_options_arguments = getattr(browser_options, "arguments", []) + browser_options_capabilities = getattr(browser_options, "capabilities", {}) + options.capabilities.update(browser_options_capabilities) + options.arguments.extend([x for x in browser_options_arguments if x not in options.arguments]) + + executor = f"http://{host}:{port}/wd/hub" + kwargs = {"command_executor": executor, "options": options} + + return kwargs + + remote.driver_kwargs = driver_kwargs # Define selenium generics as a fixture # This is UI specific implementation diff --git a/configs/docker_chrome.json b/configs/docker_chrome.json new file mode 100644 index 00000000..70a37f6d --- /dev/null +++ b/configs/docker_chrome.json @@ -0,0 +1,10 @@ +{ + "capabilities": { + "browserName": "chrome", + "timeouts": { + "implicit": 30000, + "pageLoad": 30000, + "script": 30000 + } + } +} diff --git a/configs/docker_edge.json b/configs/docker_edge.json new file mode 100644 index 00000000..eb476613 --- /dev/null +++ b/configs/docker_edge.json @@ -0,0 +1,10 @@ +{ + "capabilities": { + "browserName": "MicrosoftEdge", + "timeouts": { + "implicit": 30000, + "pageLoad": 30000, + "script": 30000 + } + } +} \ No newline at end of file diff --git a/configs/docker_firefox.json b/configs/docker_firefox.json new file mode 100644 index 00000000..ac66bd5d --- /dev/null +++ b/configs/docker_firefox.json @@ -0,0 +1,10 @@ +{ + "capabilities": { + "browserName": "firefox", + "timeouts": { + "implicit": 30000, + "pageLoad": 30000, + "script": 30000 + } + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..a00adbd9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,42 @@ +# To execute this docker-compose yml file use `docker-compose -f docker-compose.yml up` +# Add the `-d` flag at the end for detached execution +# To stop the execution, hit Ctrl+C, and then `docker-compose -f docker-compose.yml down` +version: "3" +services: + chrome: + image: selenium/node-chrome:4.18.0-20240220 + shm_size: 2gb + depends_on: + - selenium-hub + environment: + - SE_EVENT_BUS_HOST=selenium-hub + - SE_EVENT_BUS_PUBLISH_PORT=4442 + - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 + + edge: + image: selenium/node-edge:4.18.0-20240220 + shm_size: 2gb + depends_on: + - selenium-hub + environment: + - SE_EVENT_BUS_HOST=selenium-hub + - SE_EVENT_BUS_PUBLISH_PORT=4442 + - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 + + firefox: + image: selenium/node-firefox:4.18.0-20240220 + shm_size: 2gb + depends_on: + - selenium-hub + environment: + - SE_EVENT_BUS_HOST=selenium-hub + - SE_EVENT_BUS_PUBLISH_PORT=4442 + - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 + + selenium-hub: + image: selenium/hub:4.18.0-20240220 + container_name: selenium-hub + ports: + - "4442:4442" + - "4443:4443" + - "4444:4444" \ No newline at end of file diff --git a/web_local_run.sh b/web_local_run.sh new file mode 100755 index 00000000..fe6ebd97 --- /dev/null +++ b/web_local_run.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +# Run API tests +python -m pytest -v -s --gherkin-terminal-reporter --driver=Chrome --html="./output/reports/" --self-contained-html --capability headless True --reruns 1 --reruns-delay 2 --tags="web_tests" -n 2 \ No newline at end of file