如何将Sikuli与Selenoid集成 处理Docker中Chrome的非HTML文件上传窗口
你遇到的失效问题核心原因是:Selenoid运行的Chrome容器默认使用Xvfb虚拟显示器,所有UI画面都在容器内部的虚拟显示层,不会输出到宿主机的物理屏幕,本地运行的Sikuli默认捕获的是宿主机屏幕,自然找不到容器内弹出的文件上传窗口。
集成方案:SikuliX + 带VNC的Selenoid容器
核心逻辑是使用自带VNC服务的Selenoid Chrome镜像,让Sikuli通过VNC协议远程捕获容器内的屏幕画面,完成非HTML元素的识别和操作。
前置准备
- 拉取对应版本的带VNC的Selenoid Chrome镜像,示例使用110版本,可自行替换为你需要的版本:
docker pull selenoid/vnc_chrome:110.0 - 本地安装SikuliX 2.0.5及以上版本,确保已安装VNC相关依赖
- 安装脚本依赖:Selenium对应语言SDK、SikuliX对应语言绑定
配置&运行步骤
- 启动Selenoid会话时开启VNC参数,Selenoid会自动为容器启动VNC服务并映射端口到宿主机
- 调用Selenoid状态API获取当前会话的VNC连接地址,传递给Sikuli作为远程屏幕捕获源
- 提前将需要上传的文件所在目录挂载到Selenoid容器内,确保容器内可以访问到目标文件
- 从VNC画面中截取要识别的元素截图(比如文件路径输入框、确认按钮),供Sikuli匹配使用
可运行Python示例
注意:提前将要上传的文件放到宿主机的
/tmp/files目录下,运行脚本前替换示例中的Selenoid地址、测试页面地址、元素定位参数为你自己的实际值
from selenium import webdriver from selenium.webdriver.common.by import By from sikuli import * import requests import time # 配置Selenoid启动参数 capabilities = { "browserName": "chrome", "browserVersion": "110.0", "selenoid:options": { "enableVNC": True, # 挂载宿主机文件目录到容器,只读权限 "volumes": ["/tmp/files:/tmp/upload:ro"] } } # 连接Selenoid启动Chrome driver = webdriver.Remote( command_executor="http://你的Selenoid服务IP:4444/wd/hub", desired_capabilities=capabilities ) # 获取当前会话的VNC端口 session_id = driver.session_id session_info = requests.get(f"http://你的Selenoid服务IP:4444/status/{session_id}").json() vnc_port = session_info["state"]["ports"]["5900/tcp"][0]["HostPort"] vnc_conn_addr = f"你的Selenoid服务IP:{vnc_port}" # 配置Sikuli连接远程VNC屏幕,Selenoid VNC默认密码为selenoid Screen().setRemote("VNC", vnc_conn_addr, "selenoid") # 打开测试页面触发上传弹窗 driver.get("你的测试页面地址") driver.find_element(By.ID, "upload-trigger-btn").click() time.sleep(2) # Sikuli识别并操作上传窗口 # 提前将从VNC画面截取的路径输入框、确认按钮截图放在脚本同目录,命名为path_input.png、confirm_btn.png wait(Pattern("path_input.png").similar(0.8), 10) click("path_input.png") type("/tmp/upload/要上传的文件名.pdf") click(Pattern("confirm_btn.png").similar(0.8)) # 后续上传结果验证逻辑可自行补充 time.sleep(3) driver.quit()
常见优化点
- 所有用于识别的截图必须从Selenoid容器的VNC画面中截取,不要用本地Chrome的截图,避免分辨率、样式差异导致识别失败
- 可根据实际情况调整Sikuli的匹配相似度阈值,平衡识别准确率和容错率
- 如上传操作频繁,可将常用元素截图封装为公共资源,减少重复截图工作量
内容的提问来源于stack exchange,提问作者Rajesh Guduru
相关产品推荐
相关产品推荐

