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

使用RemoteWebDriver上传文件失败,抛出WebDriverException求助

解决RemoteWebDriver文件上传时的WebDriverException错误

你遇到的异常核心原因很明确:你代码里的driver是本地EdgeDriver实例,并非真正的RemoteWebDriver实例,强制类型转换后调用setFileDetector就会触发这个错误——因为setFileDetector仅适用于远程WebDriver场景(比如Selenium Grid、云测试服务),本地驱动不需要这个配置。

方案1:本地测试场景(无需RemoteWebDriver)

直接删除((RemoteWebDriver) driver).setFileDetector(new LocalFileDetector());这行代码即可。本地WebDriver可以直接通过sendKeys传入本地文件路径完成上传,这也是你之前用普通WebDriver成功的原因。

修改后的完整代码:

import java.io.File;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class UsingRemoteWebDriver {
    WebDriver driver;
    String url = "https://practice-cybertekschool.herokuapp.com/upload";
    By browseButton = By.id("file-upload");
    By uploadButton = By.id("file-submit");

    @BeforeTest
    public void setUp() {
        driver = new EdgeDriver();
        driver.manage().window().maximize();
        driver.get(url);
    }

    @Test
    public void uploadFile() throws InterruptedException {
        File uploadFile = new File("C:\\Users\\ACER\\Desktop\\test.au3");
        WebElement browseElement = driver.findElement(browseButton);
        browseElement.sendKeys(uploadFile.getAbsolutePath());
        // 补充点击上传按钮的逻辑,之前代码遗漏了这一步
        driver.findElement(uploadButton).click();
        Thread.sleep(5000);
    }

    @AfterTest
    public void tearDown() {
        driver.quit();
    }
}

方案2:远程执行场景(需要连接Selenium Grid等)

如果确实需要用RemoteWebDriver(比如在Selenium Grid上运行测试),你需要正确初始化RemoteWebDriver实例,而不是用本地EdgeDriver。步骤如下:

  1. 配置Edge浏览器的Capabilities
  2. 初始化RemoteWebDriver,传入Grid的地址和配置
  3. 再设置LocalFileDetector

示例代码:

import java.io.File;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.remote.LocalFileDetector;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.net.URL;

public class UsingRemoteWebDriver {
    RemoteWebDriver driver;
    String url = "https://practice-cybertekschool.herokuapp.com/upload";
    By browseButton = By.id("file-upload");
    By uploadButton = By.id("file-submit");

    @BeforeTest
    public void setUp() throws Exception {
        // 配置Edge浏览器选项
        EdgeOptions edgeOptions = new EdgeOptions();
        // 连接到Selenium Grid的默认地址,可根据实际部署修改
        driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), edgeOptions);
        driver.manage().window().maximize();
        driver.get(url);
    }

    @Test
    public void uploadFile() throws InterruptedException {
        File uploadFile = new File("C:\\Users\\ACER\\Desktop\\test.au3");
        // 此时driver是真正的RemoteWebDriver实例,可正常设置FileDetector
        driver.setFileDetector(new LocalFileDetector());
        WebElement browseElement = driver.findElement(browseButton);
        browseElement.sendKeys(uploadFile.getAbsolutePath());
        driver.findElement(uploadButton).click();
        Thread.sleep(5000);
    }

    @AfterTest
    public void tearDown() {
        driver.quit();
    }
}

补充说明

  • 本地驱动直接和浏览器进程交互,能直接访问本地文件系统,所以不需要FileDetector。
  • 远程场景下,测试代码运行在本地,但浏览器驱动运行在远程节点,此时需要LocalFileDetector把本地文件上传到远程节点,才能完成文件上传操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:32:52