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

Playwright结合Selenium Grid时,下载文件无法通过GET API获取的问题

问题

使用Java开发基于Playwright + Selenium Grid的文件下载功能,通过Selenium Grid VNC确认文件已下载到节点机器,但调用GET请求http://localhost:4444/session/[session-id]/se/files时返回{"value":{"names":[]}},无法获取到文件。已配置SELENIUM_REMOTE_URL、se:downloadsEnabled等capability并传入Playwright启动选项,参考相关说明得知缺少ChromeOptions::CAPABILITY_W3C会导致返回空数组,但不知道如何在Playwright中传入该Chrome capability。

相关代码如下:

// 1. Set the SELENIUM_REMOTE_URL capability
capabilities.put("SELENIUM_REMOTE_URL", "<GridURL>");

// 2. Set the se:downloadsEnabled capability
JsonObject capabilities = new JsonObject();
capabilities.addProperty("se:downloadsEnabled", "true");
env.put("SELENIUM_REMOTE_CAPABILITIES", capabilities.toString());

// 3. Pass capability in Playwright options;
Playwright.CreateOptions options = new Playwright.CreateOptions();
options.setEnv(capabilities);

// 4. Start Playwright with option
playwright = Playwright.create(options);

// 5. Code to Navigate to page and perform download...

解决方案

1. 修正环境变量传递错误

你的代码存在变量传递逻辑错误:options.setEnv(capabilities)应该传入存储环境变量的env对象,而非capabilities本身;同时注意不要重复定义capabilities变量,避免覆盖之前的配置。

2. 正确配置Chrome的W3C Capability

在Playwright中,Chrome的特定capabilities需要通过BrowserType.launch()的LaunchOptions嵌套配置,而非Playwright初始化时的环境变量。需将W3C模式配置放在goog:chromeOptions节点下,同时确保se:downloadsEnabled和SELENIUM_REMOTE_URL正确传递给Selenium Grid。

3. 修正后的完整代码示例

import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Playwright;
import com.google.gson.JsonObject;
import java.util.HashMap;
import java.util.Map;

public class GridDownloadDemo {
    public static void main(String[] args) {
        // 1. 配置Selenium Grid地址
        String gridUrl = "<GridURL>";
        
        // 2. 定义Chrome专属配置,启用W3C模式
        JsonObject chromeOptions = new JsonObject();
        chromeOptions.addProperty("w3c", true);
        
        // 3. 整合所有Selenium Grid需要的capabilities
        JsonObject capabilities = new JsonObject();
        capabilities.addProperty("SELENIUM_REMOTE_URL", gridUrl);
        capabilities.addProperty("se:downloadsEnabled", true);
        capabilities.add("goog:chromeOptions", chromeOptions);
        
        // 4. 设置环境变量传递capabilities
        Map<String, String> env = new HashMap<>();
        env.put("SELENIUM_REMOTE_CAPABILITIES", capabilities.toString());
        
        // 5. 初始化Playwright并传入环境变量
        Playwright playwright = Playwright.create(new Playwright.CreateOptions().setEnv(env));
        
        // 6. 启动Chrome并连接到Selenium Grid
        Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
                .setChannel("chrome")
                .setHeadless(false)); // 根据需求调整无头模式
        
        // 7. 执行页面导航与下载操作
        // Page page = browser.newPage();
        // page.navigate("目标下载页面URL");
        // 触发下载的操作逻辑...
        
        // 8. 下载完成后,使用当前会话ID调用Grid接口获取文件
        // 注意:会话ID需从活跃的Playwright上下文/页面中获取
        
        // 资源清理
        // browser.close();
        // playwright.close();
    }
}

4. 额外检查项

  • 确认Selenium Grid节点的Chrome版本与Playwright支持的Chrome版本匹配,版本不兼容会导致capabilities无法生效。
  • 检查Grid节点的下载目录权限,确保Selenium进程拥有读写权限,避免文件无法被接口读取。
  • 调用/se/files接口时,使用的会话ID必须是当前活跃的会话,会话过期或关闭后无法获取文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:03:30