You need to enable JavaScript to run this app. C# Selenium3.141适配Opera58.x、operadriver2.42时报Opera不可达
优惠活动
大模型
产品
解决方案
定价
更多

C# Selenium3.141适配Opera58.x、operadriver2.42时报Opera不可达

根因定位

你日志里的「每个套接字地址仅允许使用一次」TCP报错是核心故障点,本质是照搬老版Presto内核Opera的自动化写法,适配Chromium内核的Opera 58后触发了端口双重占用:

  • OperaDriverService启动后已经将自身分配的服务端口完成系统绑定
  • 你又通过OperaOptions把同一个端口手动传给Opera作为DevTools调试端口
  • 最终Opera尝试绑定已被OperaDriver占用的端口,直接触发系统套接字限制,DevTools服务启动失败,Opera进程随即退出。
修复步骤
  • 删除手动传入--remote-debugging-port的冗余代码。适配Opera 58的OperaDriver 2.42会自动完成驱动服务端口和Opera DevTools通道的映射,手动传参完全多余,直接删除operaOptions.AddArgument("--remote-debugging-port=" + port.ToString());这行即可。
  • 取消手动调用service_opera.Start()的逻辑。Selenium 3.141的驱动构造函数会自动完成服务的启动、端口绑定流程,手动提前启动服务会造成初始化流程重复,进一步加剧端口占用风险。
  • 调整用户数据目录配置。不要复用Chrome目录下的路径存放Opera用户数据,这类路径下如果存在常驻Chrome进程,会触发目录文件锁冲突,建议为自动化测试单独分配独立空目录,比如localappdata + @"\OperaAuto\Profile",启动前确保没有残留Opera进程占用该目录。
修正后的可运行参考代码
string localappdata = Environment.GetEnvironmentVariable("LocalAppData");
var operadriverDir = Directory.GetCurrentDirectory();
var operadriverExe = "operadriver.exe";

var operaOptions = new OperaOptions
{
    LeaveBrowserRunning = false,
    BinaryLocation = localappdata + @"\Programs\Opera\58.0.3135.127\opera.exe"
};
// 配置独立的自动化专用用户数据目录
operaOptions.AddArgument($"--user-data-dir={localappdata}\\OperaAuto\\Profile");

// 仅创建服务实例,不手动触发启动
var service_opera = OperaDriverService.CreateDefaultService(operadriverDir, operadriverExe);
service_opera.EnableVerboseLogging = true;

// 由驱动内部完成服务启动、浏览器拉起全流程
driver = new OperaDriver(service_opera, operaOptions);
残留问题兜底排查方向
  • 运行测试前用netstat -ano | findstr <OperaDriver分配的端口号> 检查端口占用情况,如果存在其他进程占用,可手动在创建服务时指定无冲突的固定空闲端口,避免动态分配碰到已占用端口。
  • 不要用管理员身份运行NUnit测试,普通用户权限下启动的Opera进程不会触发系统权限导致的端口绑定异常。
  • 检查Opera浏览器的设置,关闭「关闭浏览器后继续运行后台应用」的选项,这类后台常驻进程会提前锁住用户数据目录和调试端口,导致自动化拉起的新实例无法正常初始化。

内容的提问来源于stack exchange,提问作者JB4Cycling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 03:15:03