t.me/atinfo_chat Telegram группа по автоматизации тестирования

Конфигурация файла gitlab-ci для запуска GUI тестов Selenium Server + Python + Pytest

gitlab-ci
selenium
python
Теги: #<Tag:0x00007fb2f6f3b1e0> #<Tag:0x00007fb2f6f3b0a0> #<Tag:0x00007fb2f6f3af60>

(Артём Кузьменко) #1

Здравствуйте. Настало время прикрутить GUI тесты в gitlab-ci. Был ли у кого-то опыт? Подскажите как сделать. Данная статья не особо то помогла (https://docs.gitlab.com/ee/ci/examples/end_to_end_testing_webdriverio/index.html) т.к. тут разворачивают образ node. А я все базировал на образе Python. Конфиг запуска API тестов будет ниже.

Подскажите как мне составить конфиг? Может как-то в образ node можно инсталлировать python и использовать запуск тестов из образа node? Может у кого-то есть готовые примеры как настроить конфиг для запуска тестов ?

Конфиг для API тестов

image: python:3.7

stages:
  - test
    
test:
  stage: test
  
  before_script:
    - echo "Install environment"
    - apt-get update -q -y
    - pip3 install -r requirements.txt
    - echo "Changed users"
    - python3 "./scripts/change_users_for_gitlab_runner.py" # подменяем аккаунты в конфиге для запуска в gitlab
    - echo "Clear teams for all users"
    - python3 "./scripts/clear_all_users.py"
    
  script:
    - echo "Run all tests"
    - py.test -s -v --html=report.html --self-contained-html "./tests"

    # Отправка отчетов о тестах в группу
    - EXIT_CODE=$?
    - echo $EXIT_CODE
    - echo "Send report to chat"
    - python3 ./scripts/send_tests_report.py $CI_JOB_ID $EXIT_CODE

  artifacts:
    paths:
      - /builds/report.html
    expire_in: 1 month

(Артём Кузьменко) #3

Пока разобрался с тем, что можно в конфиге прописать как сервис установку standalone server

image: python:3.7
services:
  - name: selenium/standalone-chrome
    alias: selenium

(Артём Кузьменко) #4

Ссылка на сервер в конфиге тестов:

selenium_full_url: "selenium__standalone-chrome:4444/wd/hub/"

Вот так создаю драйвер в тестах:

    def setup_method(self):
        desired_capabilities = None
        if self.browser == 'Chrome':
            desired_capabilities = DesiredCapabilities.CHROME
        if self.browser == 'Firefox':
            desired_capabilities = DesiredCapabilities.FIREFOX
        self.driver = webdriver.Remote(
            command_executor=self.selenium_full_url,
            desired_capabilities=desired_capabilities)

Вот так выглядит ошибка в gitlab runner:

tests/web/test_auth.py::TestsAuth::test_login ERROR

==================================== ERRORS ====================================
____________________ ERROR at setup of TestsAuth.test_login ____________________

self = <tests.web.test_auth.TestsAuth object at 0x7fea70a2e5d0>

    def setup_method(self):
        desired_capabilities = None
        if self.browser == 'Chrome':
            desired_capabilities = DesiredCapabilities.CHROME
        if self.browser == 'Firefox':
            desired_capabilities = DesiredCapabilities.FIREFOX
        self.driver = webdriver.Remote(
            command_executor=self.selenium_full_url,
>           desired_capabilities=desired_capabilities)

tests/web/test_auth.py:35: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py:157: in __init__
    self.start_session(capabilities, browser_profile)
/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py:252: in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7fea70e1ded0>
response = {'status': 404, 'value': '{\n  "sessionId": null,\n  "value": {\n    "error": "unknown command",\n    "message": "Unable to find command matching POST to \\u002f\\u002fsession",\n    "stacktrace": ""\n  },\n  "status": 9\n}'}

Видимо как-то иначе нужно создавать драйвер, чтобы тесты ходили в gitla-ci. По ка не могу разобраться.


(Артём Кузьменко) #5

Удалось запустить тесты в GitLab CI в браузере Firefox. Для браузера Chrome постоянно ошибка: stacktrace": "org.openqa.selenium.SessionNotCreatedException: Unable t…: ‘1.8.0_222’\nDriver info: driver.version: unknown"

Пробовал разные версии chromedriver, но так и не удалось запустить хром.

Адреса для standalone серверов:

gitlab_chrome_url: "http://selenium__standalone-chrome:4444/wd/hub"
gitlab_firefox_url: "http://selenium__standalone-firefox:4444/wd/hub"

Конфиг:

image: python:3.7

stages:
  - test

test:
  stage: test

  services:
    - name: selenium/standalone-firefox
    #- name: selenium/standalone-chrome

  before_script:
    # Установка окружения
    - echo "Install environment"
    - apt-get update -q -y
    - pip3 install -r requirements.txt

    # скачиваем и подготавливаем к работе webdriver firefox
    - echo "Get geckodriver"
    - wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
    - tar -xvzf geckodriver-v0.26.0-linux64.tar.gz
    - chmod +x geckodriver

    # скачиваем и подготавливаем к работе webdriver chrome
    #- echo "Get chromdriver"
    #- wget https://chromedriver.storage.googleapis.com/78.0.3904.70/chromedriver_linux64.zip
    #- unzip chromedriver_linux64.zip
    #- chmod +x chromedriver

  script:
    - echo "Run all tests"
    - pytest -s -v --html=report.html --self-contained-html "./tests"


  artifacts:
    paths:
      - /builds/report.html
    expire_in: 1 month

Для отчетов в html используется библиотека pytest-html==2.0.0 и собственно отчетик потом сохраняется в артефакты джобы.


(Lev Yarushin) #6

Возьмите docker-runner, сделайте образ с окружением для тестов и chrome, как вариант - только окружение а браузеры отдельно на другой машине(например через selenoid).
Как пример https://github.com/joyzoursky/docker-python-chromedriver