Gitlab CI - функциональные тесты Django - осколок - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу запустить некоторые тесты автоматизации на github для моего проекта с каркасом Django.Поэтому я использую функциональный тест Django.Хотя выполнение теста на моем локальном компьютере работает нормально, мой конвейер всегда терпит неудачу с этими тестами.

Я предположил, что chromedriver не работал должным образом, и после некоторых исследований в Интернете я обнаружил, что мне нужно установить Chrome в качестве браузера, поэтому я изменил свой файл require.txt для pip следующим образом:

applescript==2018.11.19
astroid==2.1.0
autopep8==1.4.3
chromedriver==2.24.1
decorator==4.3.0
detect==2018.11.19
Django==2.1.3
flake8==3.6.0
google-chrome==2018.11.19
google-chrome-cli==2018.11.19
isort==4.3.4
lazy-object-proxy==1.3.1
mccabe==0.6.1
only==2018.11.20
psutil==5.4.8
public==2018.11.20
pycodestyle==2.4.0
pyflakes==2.0.0
pylint==2.2.1
pytz==2018.7
runcmd==2018.11.20
selenium==3.141.0
six==1.11.0
splinter==0.10.0
temp==2018.11.20
urllib3==1.24.1
wrapt==1.10.11

.gitlab-ci.yml

image: python:latest

before_script:
  - pip install virtualenv
  - virtualenv --python=python3 venv/
  - source venv/bin/activate
  - pip install -r requirements.txt
  - cd src/
  - python manage.py migrate

stages:
  - quality
  - tests

flake8:
  stage: quality
  script:
    - flake8 ./

test:
  stage: tests
  script:
    - python manage.py test

test_functional.py

def setUp(self):

        # LINUX x64
        executable_path = {'executable_path': settings.CHROMEDRIVER_PATH_LINUX64}

        # chrome
        self.browser_chrome = Browser('chrome', **executable_path)
        [..]

При этом установлен браузер Chrome, но теперь я получаю этоошибка:

selenium.common.exceptions.WebDriverException: 
Message: Service /builds/mitfahrzentrale/mitfahrzentrale/venv/chromedriver unexpectedly exited. 
Status code was: 127

Что мне нужно изменить, чтобы использовать chromedriver для gitlab?

1 Ответ

0 голосов
/ 11 декабря 2018

Я не думаю, что пакет google-chrome делает то, что вы думаете, что он делает. Глядя на его исходный код , это оболочка Python для набора команд AppleScript вокруг браузера Chrome на MacOS и, конечно, не будет устанавливать браузер в Linux.

Для справки, вот(раздетый) Конвейер Gitlab CI, который мы используем с Django и Selenium для запуска тестов с Firefox и Chrome:

stages:
    - test

.test:
    coverage: '/TOTAL.*\s+(\d+%)$/'

test-linux_x86_64:
    extends: .test
    image: python:3.7.1-stretch
    stage: test
    tags:
        - linux_x86_64
    script:
        - apt -qq update
        - DEBIAN_FRONTEND=noninteractive apt -qq -y install xvfb firefox-esr chromium chromedriver
        # download geckodriver as no distro offers a package
        - apt install -qq -y jq  # I don't want to parse JSON with regexes
        - curl -s https://api.github.com/repos/mozilla/geckodriver/releases/latest | jq -r '.assets[].browser_download_url | select(contains("linux64"))' | xargs -n1 curl -sL | tar -xz -C /usr/local/bin
        - chmod +x /usr/local/bin/geckodriver
        # prepare Django installation
        - python -m venv /opt/testing
        # bundled pip and setuptools are outdated
        - /opt/testing/bin/pip install --quiet --upgrade pip setuptools
        - /opt/testing/bin/pip install --quiet -r requirements.txt
        - xvfb-run /opt/testing/bin/python manage.py test

Некоторые примечания:

  • , если присмотреться к работевсе этапы, кроме двух последних, являются этапами подготовки;перемещение их в пользовательский образ Docker сократит время выполнения теста и количество шаблонов в вашем конвейере.
  • здесь, xvfb используется для запуска браузера на виртуальном дисплее;современные браузеры могут работать в автономном режиме (добавьте --headless к параметрам chromedriver), что делает ненужным виртуальное отображение.Если вам не нужно поддерживать старые версии браузера, вы можете пропустить установку xvfb и использование xvfb-run.
  • Тесты будут выполняться как root в контейнере;сначала мы получили ошибку

    E       selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
    E         (unknown error: DevToolsActivePort file doesn't exist)
    E         (The process started from chrome location /usr/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
    E         (Driver info: chromedriver=2.41,platform=Linux 4.15.10-300.fc27.x86_64 x86_64)
    

    Если вы столкнулись с этим, вам нужно передать дополнительный флаг --no-sandbox в Chrome, потому что он отказывается работать как root без него:

    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--no-sandbox')
    ds = DesiredCapabilities.CHROME
    ds['loggingPrefs'] = {'browser': 'ALL'}
    driver = webdriver.Chrome(desired_capabilities=ds, options=chrome_options)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...