求助:无需远程调试,用Selenium连接动态端口的Chrome 138已打开页面
连接已打开Chrome页面的Selenium代码问题及解决
问题需求
- 目标:编写代码直接连接动态端口上已打开的Chrome 138页面,无需启动新Chrome实例
- 核心错误:无法创建新会话,响应码500,提示
unknown error: unable to discover open window in chrome
错误详情
抛出异常:
org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: unknown error: unable to discover open window in chrome (Session info: chrome=138.0.7204.15)
现有代码
System.setProperty("webdriver.http.factory", "jdk-http-client"); System.setProperty("webdriver.chrome.driver","I:\EToolsAuto\WD_Utils\Drivers"+driverVersion); ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-debugging-port="+portNum); options.addArguments("--remote-allow-origins=*"); options.addArguments("--disable-extensions"); options.addArguments("--no-sandbox"); ChromeDriver driver = new ChromeDriver( options);
环境信息
- Selenium版本:4.23.0(修订版:4df0a231af)
- 操作系统:Windows Server 2019(amd64,版本10.0)
- Java版本:11.0.12
- Chrome版本:138.0.7204.15
- ChromeDriver版本:对应Chrome 138的适配版本
解决方案
你的代码核心错误是:直接用ChromeDriver(options)会强制启动新Chrome实例,而非连接已打开的实例。正确做法是通过调试地址创建远程连接,步骤如下:
前置条件
已打开的Chrome必须通过--remote-debugging-port=xxx参数启动(这是连接已存实例的必要前提,所谓"无需远程调试"是指不启动新实例,但目标实例必须开启调试端口)
修正后的代码
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.RemoteWebDriver; import java.net.URL; public class AttachToRunningChrome { public static void main(String[] args) throws Exception { int portNum = 54475; // 替换为实际的动态端口号 String driverVersion = "chromedriver.exe"; // 替换为对应Chrome 138的驱动文件名 // 配置驱动路径(注意转义反斜杠) System.setProperty("webdriver.chrome.driver", "I:\\EToolsAuto\\WD_Utils\\Drivers\\" + driverVersion); System.setProperty("webdriver.http.factory", "jdk-http-client"); ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); options.addArguments("--disable-extensions"); options.addArguments("--no-sandbox"); // 连接到已打开的Chrome实例的调试地址 WebDriver driver = new RemoteWebDriver(new URL("http://localhost:" + portNum), options); // 测试连接:打印当前页面标题 System.out.println("当前页面标题:" + driver.getTitle()); // 后续业务操作... // 注意:调用driver.quit()会关闭整个已打开的Chrome实例,仅断开连接可忽略此方法 } }
关键说明
- 路径中的反斜杠必须转义为
\\,否则会被当作转义字符导致路径识别错误 - 使用
RemoteWebDriver而非ChromeDriver来连接已存在的实例,ChromeDriver默认行为是启动新实例 - 如果不需要关闭原Chrome实例,不要调用
driver.quit(),仅关闭当前标签页可使用driver.close()
内容的提问来源于stack exchange,提问作者Vani S.K.
相关产品推荐
相关产品推荐

