Запуск поведения/селена в контейнере Docker

Я создал контейнер Docker, из которого можно запускать тесты поведения/селена. Образ Docker основан на Oracle Linux 9 и включает в себя:

/bdds/driver/chromedriver --version
ChromeDriver 114.0.5735.90 (386bc09e8f4f2e025eddae123f36f6263096ae49-refs/branch-heads/5735@{#1052})

 /usr/lib64/chromium-browser/chromium-browser --version
Chromium 122.0.6261.128 Fedora Project

У меня есть файл Environment.py, который настраивает драйвер:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lib import ohaitestutl as ohai

def before_scenario(context, scenario):
    base_url = ohai.config_property(config_section='url', config_property='base_url')
    context.base_url = base_url
    options = Options()
    headless_browser = context.config.userdata.get('headless')
    if headless_browser and headless_browser.lower() == 'true':
        options.add_argument('--headless')
        context.headless = True
    else:
        context.headless = False
    context.driver = webdriver.Chrome(options=options)
    context.driver.maximize_window()

def after_scenario(context, scenario):
    # Close the browser session after each scenario
    if context.driver:
        context.driver.quit()

В контейнер установлен скрипт bdds.sh:

#!/usr/bin/env bash
# D-Bus initialization command
DBUS=$(ps -ef | grep "dbus-daemon" | grep -v grep)
if [ -z "${DBUS}" ]
then
  mkdir -p /run/dbus
  dbus-daemon --system &
fi
export PATH=$PATH:/bdds/driver:/usr/lib64/chromium-browser
echo behave -D headless=true features/foreg_login.feature
behave -D headless=true features/foreg_login.feature

При выполнении происходит задержка около минуты, а затем я получаю следующее:

PS C:\Development\CICD\UITests> docker run --name TBDDS bdds
behave -D headless=true features/foreg_login.feature

Feature: Login credentials validation for front office registration 
HOOK-ERROR in before_scenario: WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/chromium-browser is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x55a3ff7ff4e3 <unknown>
#1 0x55a3ff52ec76 <unknown>
#2 0x55a3ff557d78 <unknown>
#3 0x55a3ff554029 <unknown>
#4 0x55a3ff592ccc <unknown>
#5 0x55a3ff59247f <unknown>
#6 0x55a3ff589de3 <unknown>
#7 0x55a3ff55f2dd <unknown>
#8 0x55a3ff56034e <unknown>
#9 0x55a3ff7bf3e4 <unknown>
#10 0x55a3ff7c33d7 <unknown>
#11 0x55a3ff7cdb20 <unknown>
#12 0x55a3ff7c4023 <unknown>
#13 0x55a3ff7921aa <unknown>
#14 0x55a3ff7e86b8 <unknown>
#15 0x55a3ff7e8847 <unknown>
#16 0x55a3ff7f8243 <unknown>
#17 0x7fa57fa82812 start_thread

Мой Докерфайл:

# =============================================================================
# Selenium Python BDDS Automated Testing
# Date: 25 Mar 2024
#
# This docker file must be run via the BDDS docker_build.sh script.
# =============================================================================

# Stage 1: Use Oracle Linux 9 base image
FROM oraclelinux:9

# Update package lists
RUN dnf update -y
# Enable EPEL repository for Chromium
RUN yum -y update && yum -y install epel-release 
RUN yum -y install chromium

# Install D-Bus package
RUN yum install -y dbus dbus-daemon

# Start D-Bus server at container startup
CMD ["dbus-daemon", "--system"]

# Install dependencies
RUN dnf install -y --setopt=timeout=60000 python3.11 python3-pip wget unzip vim nss-tools libX11

# Create a directory for the bdds framework files and features
RUN mkdir -p /bdds/driver
WORKDIR /bdds/driver

# Deploy the Selenium Chrome driver
COPY chromedriver_linux64.zip /bdds/driver 
RUN unzip -o chromedriver_linux64.zip

RUN python3.11 -m ensurepip
RUN python3.11 -m pip install behave

WORKDIR /bdds
# Install the required Python dependencies
COPY requirements.txt /bdds/
RUN python3.11 -m pip install -r requirements.txt

# Copy the run.sh script
COPY run.sh /etc
COPY bdds.sh /bdds
RUN chmod 755 /bdds/bdds.sh

COPY bdds_temp.zip /bdds/bdds.zip
RUN unzip -o bdds.zip

# Set working directory
WORKDIR /bdds

# Set execute permissions for bash scripts.
RUN chmod 755 /bdds/*.sh
RUN chmod 755 /etc/run.sh


ENTRYPOINT ["/bdds/bdds.sh"]

Любая помощь приветствуется. Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трудно точно определить, в чем проблема, но я подозреваю, что у вас нет совместимых версий Chrome и ChromeDriver в образе или отсутствуют зависимости.

Вот упрощенно Dockerfile:

FROM oraclelinux:9

RUN dnf update -y && \
    dnf install -y \
        wget \
        unzip \
        python3.11 \
        python3-pip \
        dbus-x11 \
        gtk3 \
        nss \
        atk \
        at-spi2-atk \
        cups-libs \
        libdrm \
        libxkbcommon \
        libXcomposite \
        libXdamage \
        libXrandr && \
    dnf clean all

RUN wget -q -O chrome-linux64.zip https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/121.0.6167.85/linux64/chrome-linux64.zip && \
    unzip chrome-linux64.zip && \
    rm chrome-linux64.zip && \
    mv chrome-linux64 /opt/chrome/ && \
    ln -s /opt/chrome/chrome /usr/local/bin/ && \
    wget -q -O chromedriver-linux64.zip https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/121.0.6167.85/linux64/chromedriver-linux64.zip && \
    unzip -j chromedriver-linux64.zip chromedriver-linux64/chromedriver && \
    rm chromedriver-linux64.zip && \
    mv chromedriver /usr/local/bin/

WORKDIR /bdds

COPY requirements.txt .
RUN pip3 install -r requirements.txt

COPY bdds.sh .
COPY features ./features

RUN chmod 755 bdds.sh

CMD ["./bdds.sh"]

ИМХО, наиболее важным компонентом этого является обеспечение согласованности и совместимости версий Chrome и ChromeDriver. Chrome также имеет кучу зависимостей, которые необходимо установить, иначе браузер не запустится.

Вот содержимое моей тестовой установки:

├── bdds.sh
├── Dockerfile
├── features
│   ├── open_browser.feature
│   └── steps
│       └── browser_steps.py
└── requirements.txt

🗎 requirements.txt

behave==1.2.6
selenium==4.19.0

🗎 open_browser.feature

Feature: Open web browser
  Scenario: Visit Google
    Given I have a web browser
    When I navigate to "http://www.google.com"
    Then I can see the Google search page

🗎 browser_steps.py

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from behave import given, when, then

@given('I have a web browser')
def step_impl(context):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-gpu")
    
    context.browser = webdriver.Chrome(options=chrome_options)

@when('I navigate to "{url}"')
def step_impl(context, url):
    context.browser.get(url)

@then('I can see the Google search page')
def step_impl(context):
    assert "Google" in context.browser.title
    context.browser.quit()

🗎 bdds.sh

#!/usr/bin/env bash

dbus-uuidgen > /var/lib/dbus/machine-id
mkdir -p /var/run/dbus
dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address

chrome --version
chromedriver --version

behave

Я не уверен, что команды DBUS строго обязательны, но они подавляют несколько предупреждающих сообщений, поэтому я рад их оставить. Команды для получения версий Chrome и ChromeDriver также можно удалить. Просто хотел подтвердить, что у них есть последовательная версия.

Его можно обновить, чтобы использовать файл среды.

🗎 environment.py

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def before_scenario(context, scenario):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-gpu")

    context.driver = webdriver.Chrome(options=chrome_options)
    context.driver.maximize_window()

def after_scenario(context, scenario):
    if context.driver:
        context.driver.quit()

🗎 browser_steps.py

from behave import given, when, then

@given("I have a web browser")
def step_impl(context):
    pass

@when('I navigate to "{url}"')
def step_impl(context, url):
    context.driver.get(url)

@then("I can see the Google search page")
def step_impl(context):
    assert "Google" in context.driver.title
    context.driver.quit()

Спасибо, посмотрю, учитывая ваши отзывы. Я включил DBUS, потому что получил еще одну ошибку, которая, казалось, подразумевала наличие зависимости.

avalon20 07.04.2024 10:25

Привет, датавуки. Я решал проблему на основе вашего примера. Основная проблема, по-видимому, вызвана использованием файла Features/environment.py. Если я перенесу логику в файл шагов, проблема исчезнет. Несколько разочаровывает, поскольку на рабочем столе Windows он работает нормально. Я тестирую через Rancher, поэтому не уверен, имеет ли это значение. У меня в офисе стоит Linux, так что я могу просто посмотреть, будет ли он там вести себя по-другому. Я буду обновлять дальше, когда закончу поиск.

avalon20 07.04.2024 17:46

Ага! Я работал над Linux. Но на самом деле это не должно иметь значения. Я обновил свой ответ, чтобы использовать файл environment.py.

datawookie 08.04.2024 07:01

Спасибо за новость - интересно. Я как раз собираюсь проверить это на Linux Mint. Возможно, это как-то связано с Rancher для Windows, который находится поверх WSL2.

avalon20 08.04.2024 10:59

Привет, датавуки. В конце концов, это был не Ранчер. Мне не хватало этой строки в исходном коде в файле Environment.py: options.add_argument("--no-sandbox") Большое спасибо за вашу помощь.

avalon20 08.04.2024 14:54

Превосходно! Отличные новости.

datawookie 08.04.2024 15:12

Другие вопросы по теме