Docker环境下Robot Framework+Sikuli报AttributeError问题求助
Docker中Robot Framework结合Sikuli UI自动化测试报错排查
我在Docker环境使用Robot Framework结合Sikuli进行UI自动化测试,本地Windows环境测试可正常通过,但在Docker中运行时,所有测试用例及Suite Teardown均报错:AttributeError: 'NoneType' object has no attribute 'run_keyword'。以下是相关文件及报错信息,请求帮忙排查问题。
Dockerfile
FROM python:3.8-slim-buster # Update packages and install dependencies RUN apt-get update && apt-get install -y \ wget \ openjdk-11-jre-headless \ && rm -rf /var/lib/apt/lists/* # Install Robot Framework and Sikuli library RUN pip install robotframework RUN pip install robotframework-SikuliLibrary # Download and install SikuliX RUN wget https://launchpad.net/sikuli/sikulix/2.0.4/+download/sikulixide-2.0.4.jar -O /root/sikulix.jar # Set environment variables for SikuliX ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64/ ENV SIKULIX_HOME /root ENV SIKULIX_JAR /root/sikulix.jar # Copy test files into the container COPY . /tests # Set working directory WORKDIR /tests # Execute tests with Robot Framework CMD ["robot", "--outputdir", "results", "test.robot"]
测试脚本
*** Settings *** Documentation Test d'IHM par sikuli et robot framework Library SikuliLibrary port=4119 timeout=3.0 mode=REMOTE Library Process Library OperatingSystem Suite Setup Start Sikuli Process Suite Teardown Run Keywords Close Application ${APP_PATH} AND Stop Remote Server *** Variables *** ${IMAGES_PATH} //tests/SikuliImages ${APP_PATH} //tests/FHF_App.exe ***Test Cases*** Open IHM Open IHM Application Read Images Read Images From Path Navigate IHM Application Buttons Navigate Buttons *** Keywords *** Start Sikuli Process ${port}= Set Environment Variable SIKULI_SERVER_PORT 4119 # Port souhaité, par exemple 4119 Run java -jar sikulix.jar -p ${port} Sleep 3s # Attendre que le processus Sikuli démarre Read Images From Path Add Image Path ${IMAGES_PATH} Open IHM Application Open Application ${APP_PATH} Navigate Buttons Wait Until Screen Contain pauseButtonPull.png timeout=30 Click pauseButtonPull.png Wait Until Screen Contain pausePanel.png timeout=40 Click pauseButtonDown.png Click PexpButtonPull.png Wait Until Screen Contain PexpPanel.png timeout=10 Click PexpButtonDown.png
报错信息
Test :: Test d'IHM par sikuli et robot framework Open IHM | FAIL | AttributeError: 'NoneType' object has no attribute 'run_keyword' Read Images | FAIL | AttributeError: 'NoneType' object has no attribute 'run_keyword' Navigate IHM Application Buttons | FAIL | AttributeError: 'NoneType' object has no attribute 'run_keyword' Test :: Test d'IHM par sikuli et robot framework | FAIL | Suite teardown failed: Several failures occurred: AttributeError: 'NoneType' object has no attribute 'run_keyword' AttributeError: 'NoneType' object has no attribute 'run_keyword' 3 tests, 0 passed, 3 failed
问题排查及解决方案
1. 核心:Windows程序无法在Linux容器运行
测试目标FHF_App.exe是Windows可执行文件,当前Docker镜像基于Linux(python:3.8-slim-buster),Linux无法直接运行Windows exe程序,这是所有操作失败的根本原因之一。
- 可选解决方向:
- 使用Windows Docker镜像作为基础镜像,在Windows容器中运行测试;
- 在Linux容器中安装Wine来模拟Windows环境运行exe;
- 调整架构:将Sikuli服务部署在Windows主机上,Docker中的Robot Framework通过远程模式连接该服务执行测试。
2. Sikuli无头环境缺失图形支持
Sikuli依赖图形界面进行屏幕捕获,当前Docker镜像未安装X11相关组件,导致Sikuli服务启动失败,SikuliLibrary无法连接到有效服务实例,触发NoneType错误。
- 修改Dockerfile,添加X11依赖:
RUN apt-get update && apt-get install -y \ wget \ openjdk-11-jre-headless \ xvfb \ x11vnc \ libx11-dev \ libxtst-dev \ libpng-dev \ && rm -rf /var/lib/apt/lists/* - 修改
Start Sikuli Process关键字,启动虚拟图形环境:Start Sikuli Process ${port}= Set Environment Variable SIKULI_SERVER_PORT 4119 # 启动虚拟X服务器 Run Xvfb :1 -screen 0 1920x1080x24 & Set Environment Variable DISPLAY :1 # 启动Sikuli服务 Run java -jar ${SIKULIX_JAR} -p ${port} # 等待服务就绪(需导入Telnet库) Wait Until Keyword Succeeds 10x 2s Telnet.Ping localhost ${port} - 在测试脚本的Settings部分添加
Library Telnet。
3. 路径格式错误
测试脚本中使用Windows风格的双斜杠路径//tests/...,在Linux环境下应改为单斜杠/tests/...,否则会导致路径解析失败:
*** Variables *** ${IMAGES_PATH} /tests/SikuliImages ${APP_PATH} /tests/FHF_App.exe # 注意:此exe仍需解决Linux运行问题
4. Suite Teardown异常处理
当Sikuli服务未正常启动时,Teardown中的关键字调用会因SikuliLibrary实例为None而报错。可添加异常捕获,避免Teardown报错:
Suite Teardown Run Keywords ${TRY} Close Application ${APP_PATH} ${EXCEPT} Log Close Application failed WARN ${END} AND ${TRY} Stop Remote Server ${EXCEPT} Log Stop Remote Server failed WARN ${END}
需要先导入BuiltIn库,在Settings里加Library BuiltIn,并定义TRY/EXCEPT/END变量:
*** Variables *** ${TRY} Run Keyword And Continue On Failure ${EXCEPT} Run Keyword And Continue On Failure ${END} # 占位符
内容的提问来源于stack exchange,提问作者Youness ELQADERY
相关产品推荐
相关产品推荐

