在Selenium Grid执行Playwright时启动两个浏览器(含空白窗口)问题
问题分析与解决
环境信息
- Playwright版本:1.23.0
- 操作系统:Windows
- 浏览器:Chrome/Edge
- Selenium Server版本:4.4.0
代码片段
public static void main( String[] args ) throws InterruptedException { Map<String,String> env = new HashMap<>(); env.put("DEBUG","pw:browser*"); env.put("SELENIUM_REMOTE_URL","http://192.168.1.103:4444"); Playwright playwright = Playwright.create(new Playwright.CreateOptions().setEnv(env)); Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setChannel("chrome").setHeadless(false)); Page page = browser.newPage(); page.navigate("https://playwright.dev/docs/selenium-grid"); Thread.sleep(5000); // other actions... page.context().browser().close(); playwright.close(); }
问题描述
本地搭建了Selenium 4 Grid环境,Hub和Node均运行在本地系统中。执行Playwright脚本时,本该启动1个浏览器,实际却启动了2个,其中一个是空白窗口。
调试日志:
2022-09-17T05:40:12.196Z pw:browser <selenium> 连接到 http://192.168.1.103:4444/ 2022-09-17T05:40:16.386Z pw:browser <selenium> 已连接到sessionId=624ba9e3aa78bdea3f2c987c67574550 2022-09-17T05:40:16.386Z pw:browser <selenium> 使用selenium v4 2022-09-17T05:40:16.387Z pw:browser <selenium> 为sessionId=624ba9e3aa78bdea3f2c987c67574550获取到端点ws://192.168.1.103:4444/session/624ba9e3aa78bdea3f2c987c67574550/se/cdp 2022-09-17T05:40:16.392Z pw:browser <ws connecting> ws://192.168.1.103:4444/session/624ba9e3aa78bdea3f2c987c67574550/se/cdp 2022-09-17T05:40:16.442Z pw:browser <ws connected> ws://192.168.1.103:4444/session/624ba9e3aa78bdea3f2c987c67574550/se/cdp 2022-09-17T05:40:23.829Z pw:browser <ws disconnecting> ws://192.168.1.103:4444/session/624ba9e3aa78bdea3f2c987c67574550/se/cdp 2022-09-17T05:40:23.841Z pw:browser <ws disconnected> ws://192.168.1.103:4444/session/624ba9e3aa78bdea3f2c987c67574550/se/cdp code=1005 reason= 2022-09-17T05:40:23.893Z pw:browser <selenium> 断开与sessionId=624ba9e3aa78bdea3f2c987c67574550的连接 2022-09-17T05:40:24.638Z pw:browser <selenium> 已断开与sessionId=624ba9e3aa78bdea3f2c987c67574550的连接
问题原因
你同时触发了两种浏览器启动逻辑:
- 设置
SELENIUM_REMOTE_URL环境变量后,Playwright会自动通过Selenium Grid创建一个远程浏览器会话(对应日志里的selenium连接流程)。 - 代码里又调用了
playwright.chromium().launch(),这会在本地直接启动一个新的Chrome浏览器。
两者叠加导致出现两个浏览器窗口,其中通过Selenium Grid创建的会话因为没有被代码接管,呈现为空白窗口。
解决方案
去掉本地launch()调用,改用connect()方法连接到Selenium Grid提供的CDP端点,或者直接依赖环境变量让Playwright自动处理连接。推荐修正后的代码如下:
方案一:手动指定CDP连接
public static void main( String[] args ) throws InterruptedException { Map<String,String> env = new HashMap<>(); env.put("DEBUG","pw:browser*"); env.put("SELENIUM_REMOTE_URL","http://192.168.1.103:4444"); Playwright playwright = Playwright.create(new Playwright.CreateOptions().setEnv(env)); // 连接到Selenium Grid的CDP端点 Browser browser = playwright.chromium().connectOverCDP("http://192.168.1.103:4444"); Page page = browser.newPage(); page.navigate("https://playwright.dev/docs/selenium-grid"); Thread.sleep(5000); // other actions... browser.close(); playwright.close(); }
方案二:依赖环境变量自动连接
public static void main( String[] args ) throws InterruptedException { Map<String,String> env = new HashMap<>(); env.put("DEBUG","pw:browser*"); env.put("SELENIUM_REMOTE_URL","http://192.168.1.103:4444"); Playwright playwright = Playwright.create(new Playwright.CreateOptions().setEnv(env)); // 当设置SELENIUM_REMOTE_URL时,chromium.connect()会自动连接到Grid Browser browser = playwright.chromium().connect(); Page page = browser.newPage(); page.navigate("https://playwright.dev/docs/selenium-grid"); Thread.sleep(5000); // other actions... browser.close(); playwright.close(); }
说明
- 当设置
SELENIUM_REMOTE_URL后,Playwright会自动与Selenium Grid交互,获取CDP端点并建立连接,此时不需要再调用launch()(这是本地启动浏览器的方法)。 - 使用
connect()或connectOverCDP()可以正确接管Selenium Grid创建的浏览器会话,避免重复启动窗口。
内容的提问来源于stack exchange,提问作者Pabitra Kumar Swain
相关产品推荐
相关产品推荐

