当 运行 基于 selenium 库的测试用例在 DOCKER 容器内具有无头 chrome 时,Robot Framework 测试用例失败并显示“找不到元素”

Robot Framework test case fails with “Element not found” when running selenium library based test case with headless chrome inside a DOCKER container

下面是我试图在 docker 容器内执行的测试用例。

Login To GUI
    [Documentation]  To open GUI and login with valid credentials
    ${chrome_options}=  Evaluate  sys.modules['selenium.webdriver'].ChromeOptions()  sys, selenium.webdriver
    Call Method    ${chrome_options}    add_argument    --no-sandbox
    Call Method    ${chrome_options}    add_argument    --headless
    Call Method    ${chrome_options}    add_argument    --disable-dev-shm-usage
    Call Method    ${chrome_options}    add_argument    --ignore-certificate-errors-spki-list
    Call Method    ${chrome_options}    add_argument    --ignore-ssl-errors
    Open Browser    ${url}    chrome    options=${chrome_options}      executable_path=/usr/lib/chromium/chromedriver
    Set Browser Implicit Wait    5
    Input Text    id=username    ${username}
    Input Text    id=password    ${password}
    Click Button    //input[@value='Sign in']

当我试图在MAC终端中直接从IDE(Pycharm)执行时测试用例成功通过。但是,当我尝试通过 docker 容器执行相同操作时,它失败并出现错误“找不到带有定位器 'id=username' 的元素”,并且在日志中附加了一个空白屏幕作为屏幕截图的一部分。我请求的页面应该被重定向到带有用户名密码字段的身份验证页面(密钥斗篷),但我在 docker 容器中得到空白页面。

我检查了容器“/usr/lib/chromium/chrome_debug.log”中的日志文件

[0302/115225.286372:WARNING:dns_config_service_posix.cc(342)] Failed to read DnsConfig.
[0302/115226.149284:ERROR:cert_issuer_source_aia.cc(32)] Error parsing cert retrieved from AIA (as DER):
ERROR: Failed parsing Certificate SEQUENCE
ERROR: Failed parsing Certificate

[0302/115226.345313:ERROR:cert_issuer_source_aia.cc(32)] Error parsing cert retrieved from AIA (as DER):
ERROR: Failed parsing Certificate SEQUENCE
ERROR: Failed parsing Certificate

[0302/115226.345462:ERROR:cert_issuer_source_aia.cc(104)] AiaRequest::OnFetchCompleted got error -301
[0302/115226.346040:ERROR:ssl_client_socket_impl.cc(960)] handshake failed; returned -1, SSL error code 1, net_error -202

然后我在容器中尝试了以下命令,我得到了:

/usr/lib/chromium # chromium-browser --headless --no-sandbox --ignore-certificate-errors --ignore-ssl-errors https://<url>
[0302/115903.090501:ERROR:bus.cc(393)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
[0302/115903.091302:WARNING:dns_config_service_posix.cc(342)] Failed to read DnsConfig.
[0302/115903.152546:WARNING:dns_config_service_posix.cc(342)] Failed to read DnsConfig.
[0302/115903.631311:ERROR:cert_issuer_source_aia.cc(32)] Error parsing cert retrieved from AIA (as DER):
ERROR: Failed parsing Certificate SEQUENCE
ERROR: Failed parsing Certificate

[0302/115903.633207:ERROR:cert_issuer_source_aia.cc(32)] Error parsing cert retrieved from AIA (as DER):
ERROR: Failed parsing Certificate SEQUENCE
ERROR: Failed parsing Certificate

[0302/115903.633315:ERROR:cert_issuer_source_aia.cc(104)] AiaRequest::OnFetchCompleted got error -301
[0302/115904.273717:INFO:CONSOLE(27)] "Mixed Content: The page at 'https://<url>/auth/realms/ml/protocol/openid-connect/auth?client_id=ml-client&redirect_uri=https%3A%2F%2F<url>%2Foauth%2Fcallback&response_type=code&scope=ml-scope+openid+email+profile&state=6d35f7-add8-40b-a8e7-b169876cfc' was loaded over a secure connection, but contains a form that targets an insecure endpoint 'http://ml-sec-access-mgmt-http:8080/auth/realms/ml/login-actions/authenticate?session_code=mrjXrpjeadGywFIIgkHhddBag74tDnWV6FHA3Qk&execution=f19849-6670-406c-a1b0-139bb1f1dc05&client_id=ml-client&tab_id=vGTrJ7OI8'. This endpoint should be made available over a secure connection.", source: https://<url>/auth/realms/ml/protocol/openid-connect/auth?client_id=ml-client&redirect_uri=https%3A%2F%2F<url>%2Foauth%2Fcallback&response_type=code&scope=ml-scope+openid+email+profile&state=6d85f7-add8-40db-a8e7-b16239876cfc (27)

我什至在 MAC 中下载了 chromium 浏览器并尝试打开 URL 它工作正常。

Docker 文件[参考:https://github.com/ppodgorsek/docker-robot-framework/blob/master/Dockerfile]:

#Base image
FROM python:3.9.0-alpine3.12

# Set the reports directory environment variable
ENV ROBOT_REPORTS_DIR /opt/robotframework/reports

# Set the tests directory environment variable
ENV ROBOT_TESTS_DIR /opt/robotframework/tests

# Set the working directory environment variable
ENV ROBOT_WORK_DIR /opt/robotframework/temp

# Set number of threads for parallel execution
# By default, no parallelisation
ENV ROBOT_THREADS 1

# Install system dependencies
RUN apk update \
  && apk --no-cache upgrade \
  && apk --no-cache --virtual .build-deps add \
    gcc \
    libffi-dev \
    linux-headers \
    make \
    musl-dev \
    openssl-dev \
    which \
    wget \
    curl \
    vim \
    ca-certificates \
    git \
    jq \
    chromium \
    chromium-chromedriver

#Install robotframework and required libraries from the requirements file
ADD requirements.txt /
RUN pip3 install \
    --no-cache-dir \
    -r requirements.txt

# Create the default report and work folders with the default user to avoid runtime issues
# These folders are writeable by anyone, to ensure the user can be changed on the command line.
RUN mkdir -p ${ROBOT_REPORTS_DIR} \
  && mkdir -p ${ROBOT_WORK_DIR} \
  && chmod ugo+w ${ROBOT_REPORTS_DIR} ${ROBOT_WORK_DIR}

# Installing product related utilities inside the container
XXXXX<contents are hidden as it is not relevant to this query>

# Allow any user to write logs
RUN chmod ugo+w /var/log

# Update system path
ENV PATH=/opt/robotframework/bin:$PATH

# A dedicated work folder to allow for the creation of temporary files
WORKDIR ${ROBOT_WORK_DIR}

Requirements.txt 文件内容:

#Required robot framework packages
robotframework==3.2.2
robotframework-requests==0.7.2
robotframework-seleniumlibrary==4.5.0
robotframework-jsonlibrary==0.3.1
robotframework-kubelibrary==0.2.0

我什至提到了 link Getting empty page running selenium in headless chrome Docker

我想不出可能是什么问题。这真的是重定向问题或证书问题或混合内容吗?我很困惑。有什么想法吗?

我找到了上述问题陈述的解决方案。

首先我尝试使用 chrome 和 firefox 而不是 chromium。但是 apline 没有 chrome,因此将我的基本图像切换为 ubuntu。此外,一般来说,建议 ubuntu [参考:https://pythonspeed.com/articles/base-image-python-docker-images/] 作为 运行ning Python 的最佳 docker 基础图像申请。

但即使在 chrome 和 firefox 更改为 ubuntu 作为新的 docker 基本图像后,它仍然是相同的错误(空白页面白屏)。

也低于错误,

oot@a4ac8fd9a950:/opt/google/chrome# google-chrome --headless --no-sandbox https://<URL>

[0306/152227.264852:WARNING:headless_content_main_delegate.cc(530)] Cannot create Pref Service with no user data dir.

[0306/152227.265234:WARNING:discardable_shared_memory_manager.cc(194)] Less than 64MB of free space in temporary directory for shared memory files: 63

[0306/152227.269687:ERROR:bus.cc(393)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory

[0306/152228.160231:ERROR:cert_issuer_source_aia.cc(32)] Error parsing cert retrieved from AIA (as DER):

ERROR: Failed parsing Certificate SEQUENCE

ERROR: Failed parsing Certificate

[0306/152228.363766:ERROR:cert_issuer_source_aia.cc(32)] Error parsing cert retrieved from AIA (as DER):

ERROR: Failed parsing Certificate SEQUENCE

ERROR: Failed parsing Certificate

[0306/152228.363958:ERROR:cert_issuer_source_aia.cc(104)] AiaRequest::OnFetchCompleted got error -301

[0306/152228.364625:ERROR:ssl_client_socket_impl.cc(924)] handshake failed; returned -1, SSL error code 1, net_error -202

然后我对 Xvfb 进行了同样的尝试 [Xvfb(X 虚拟帧缓冲区的缩写)是一种用于类 UNIX 操作系统(例如,Linux)的内存显示服务器。它使您能够 运行 无需显示的图形应用程序(例如,在 CI 服务器上进行浏览器测试),同时还能够截取屏幕截图。] 这行得通。提供以下所有内容以供参考。

修改 docker 文件如下:

FROM ubuntu:20.04

# Set the reports directory environment variable

ENV ROBOT_REPORTS_DIR /opt/robotframework/reports


# Set the tests directory environment variable

ENV ROBOT_TESTS_DIR /opt/robotframework/tests


# Set the working directory environment variable

ENV ROBOT_WORK_DIR /opt/robotframework/temp


# Set number of threads for parallel execution

# By default, no parallelisation

ENV ROBOT_THREADS 1


ENV DEBIAN_FRONTEND=noninteractive


# Install system dependencies

RUN apt-get update \

  && apt-get install --quiet --assume-yes \

    python3-pip \

    unzip \

    firefox \

    wget \

    curl \

    vim \

    ca-certificates \

    git \

    jq \

    xvfb


# Install chrome package

RUN wget --no-verbose https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

RUN dpkg --install google-chrome-stable_current_amd64.deb; apt-get --fix-broken --assume-yes install


#Install robotframework and required libraries from the requirements file

ADD requirements.txt /

RUN pip3 install \

    --no-cache-dir \

    -r requirements.txt


# Install webdrivers for chrome and firefox

RUN CHROMEDRIVER_VERSION=`wget --no-verbose --output-document - https://chromedriver.storage.googleapis.com/LATEST_RELEASE` && \

    wget --no-verbose --output-document /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \

    unzip -qq /tmp/chromedriver_linux64.zip -d /opt/chromedriver && \

    chmod +x /opt/chromedriver/chromedriver && \

    ln -fs /opt/chromedriver/chromedriver /usr/local/bin/chromedriver


RUN GECKODRIVER_VERSION=`wget --no-verbose --output-document - https://api.github.com/repos/mozilla/geckodriver/releases/latest | grep tag_name | cut -d '"' -f 4` && \

    wget --no-verbose --output-document /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-linux64.tar.gz && \

    tar --directory /opt -zxf /tmp/geckodriver.tar.gz && \

    chmod +x /opt/geckodriver && \

    ln -fs /opt/geckodriver /usr/local/bin/geckodriver


# Create the default report and work folders with the default user to avoid runtime issues

# These folders are writeable by anyone, to ensure the user can be changed on the command line.

RUN mkdir -p ${ROBOT_REPORTS_DIR} \

  && mkdir -p ${ROBOT_WORK_DIR} \

  && chmod ugo+w ${ROBOT_REPORTS_DIR} ${ROBOT_WORK_DIR}


# Installing product related utilities inside the container

XXXXXXXX


# Allow any user to write logs

RUN chmod ugo+w /var/log


# Update system path

ENV PATH=/opt/robotframework/bin:$PATH


# A dedicated work folder to allow for the creation of temporary files

WORKDIR ${ROBOT_WORK_DIR}

需求文本文件:

#Required robot framework packages
robotframework==3.2.2
robotframework-requests==0.7.2
robotframework-seleniumlibrary==4.5.0
robotframework-jsonlibrary==0.3.1
robotframework-kubelibrary==0.2.0
robotframework-xvfb==1.2.2

带有 Xvfb 的新 Robot FW 测试用例:

*** Settings ***
Library    SeleniumLibrary
Library    XvfbRobot

*** Test Cases ***
Login To GUI
    [Documentation]  To open GUI and login with valid credentials
    Start Virtual Display    1920    1080
    Open Browser    ${URL}
    Set Window Size    1920    1080
    Set Browser Implicit Wait    5
    Input Text    id=username    ${username}
    Input Text    id=password    ${password}
    Click Button    //input[@value='Sign in']