2

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

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.

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)

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

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 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

I even referred the link Getting empty page running selenium in headless chrome 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?

iamstuck
  • 83
  • 1
  • 9
  • Did you try to disable certificate validation in your Docker container?? I am not sure if you can disable certificate verification. You can pass "--env PYTHONHTTPSVERIFY=0" for your docker run command and try to disable certificate errors. – bharath mamillapalli Mar 03 '21 at 12:41
  • @bharathmamillapalli, Actually I can't disable because my application uses "Identity Access Management" via keycloak/gatekeeper, so there would be Authentication issue. But indeed, I tried to Ignore ssl and certificates error as part of call method in the test case, and it didn't worked. – iamstuck Mar 04 '21 at 04:12

1 Answers1

2

I found a solution for the above problem statement.

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.

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

Below error as well,

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

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.

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}

Requirement text file:

#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

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']
iamstuck
  • 83
  • 1
  • 9