使用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。步骤如下:
- 配置Edge浏览器的Capabilities
- 初始化RemoteWebDriver,传入Grid的地址和配置
- 再设置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
相关产品推荐
相关产品推荐

