You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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对应语言绑定

配置&运行步骤

  1. 启动Selenoid会话时开启VNC参数,Selenoid会自动为容器启动VNC服务并映射端口到宿主机
  2. 调用Selenoid状态API获取当前会话的VNC连接地址,传递给Sikuli作为远程屏幕捕获源
  3. 提前将需要上传的文件所在目录挂载到Selenoid容器内,确保容器内可以访问到目标文件
  4. 从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:21:02