当在DOCKER容器中运行带有无头铬的基于硒库的测试用例时,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

查看:71
本文介绍了当在DOCKER容器中运行带有无头铬的基于硒库的测试用例时,Robot Framework测试用例失败并显示“找不到元素"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Below is the test case that I am trying to execute inside the docker container.

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容器中得到空白页面.

The test case passed successfully when I tried to execute it directly from IDE (Pycharm) in the MAC terminal. But, When I tried to perform the same via docker container, it fails with error "Element with locator 'id=username' not found" and a blank white screen is attached as part of screenshot in logs. The page I request should get redirected to an authentication page (key cloak) with the username password field, but I am getting blank page in the docker container.

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

I checked the log file inside container "/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

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

Then I tried the below command inside the container and I got:

/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中下载了Chrome浏览器,并尝试打开它正常运行的URL.

I even download the chromium browser in my MAC and tried opening the URL it works fine.

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

Docker File [Reference: 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文件内容:

Requirements.txt file contents:

#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

我什至引用了链接在无头的镀铬Docker .

我不知道可能是什么问题.确实是重定向问题或证书问题还是混合内容?我很困惑.有什么想法吗?

I could not figure out what could be the issue. Is it really a redirect issue or certificate issue or Mixed content? I am quite confused. Any ideas?

推荐答案

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

I found a solution for the above problem statement.

首先,我尝试使用chrome和firefox代替铬.但是apline没有chrome,因此将基本图像切换为ubuntu.另外,通常,建议使用ubuntu [参考:https://pythonspeed.com/articles/base-image-python-docker-images/]作为运行Python应用程序的最佳Docker基础映像.

First I tried using chrome and firefox instead of chromium. But apline doesn't had chrome and so switched my base image to ubuntu. Also, in general, ubuntu is suggested [Reference: https://pythonspeed.com/articles/base-image-python-docker-images/] as a best docker base image for running Python Applications.

但是即使使用chrome和firefox将ubuntu更改为新的docker基本映像后,它也是相同的错误(空白页白屏).

But even after changing to ubuntu as new docker base image with chrome and firefox, it is the same error (blank page white screen).

在错误下方,

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服务器上的浏览器测试),同时还可以拍摄屏幕截图.]提供以下所有内容供参考.

Then I tried the same with Xvfb [Xvfb (short for X virtual framebuffer) is an in-memory display server for UNIX-like operating system (e.g., Linux). It enables you to run graphical applications without a display (e.g., browser tests on a CI server) while also having the ability to take screenshots.] This worked. Giving all the contents below for reference.

如下所示修改了docker文件:

Modified the docker file as below:

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测试用例:

New Robot FW test case with Xvfb:

*** 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']

这篇关于当在DOCKER容器中运行带有无头铬的基于硒库的测试用例时,Robot Framework测试用例失败并显示“找不到元素"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆