无需任何输入即可使用 selenide webdriver 上传文件

Upload file with selenide webdriver without any input

我正在尝试使用 java selenide 自动化测试上传文件。

我写测试的地方使用上传框,附近没有任何输入值。

上传框为id='file'

我尝试使用:

$(By.cssSelector("[id='file']")).uploadFile(new File("myfilePackage" + File.separator + "picture.jpg"))

但这并没有帮助,因为没有用于文件上传的输入框。

然后我尝试使用:

WebElement elem = getWebDriver().findElement(By.cssSelector("[id='file']"));
String js = "arguments[0].style.height='auto'; arguments[0].style.visibility='visible';";

((JavascriptExecutor) getWebDriver()).executeScript(js, elem);
elem.sendKeys("wholePath\picture.png");

使元素可见但出现未知错误:无法聚焦 element\n ...

我得到了它,但这不是我想要的:

WebElement elem = getWebDriver().findElement(By.cssSelector("[id='file']"));

((RemoteWebElement) elem ).setFileDetector(new LocalFileDetector());

elem.sendKeys("C:FullPath\picture.png");

有没有其他方法可以从这种上传中获取文件?我想从 Intellij 包上传它

WebDriver 仅在 inputtype=file 的情况下允许使用 sendKeys 进行文件上传。由于 Selenide 只是一个 WebDriver 包装器,它使用相同的技术:https://github.com/codeborne/selenide/blob/8d545daa1286936e2041c1e8dd01801734c7fa39/src/main/java/com/codeborne/selenide/commands/UploadFile.java#L52

如果存在隐藏输入,您可以尝试询问您的开发人员。或者如果是自定义上传器,您可以尝试其他几个选项:

  • SikuliX 等 OCR 工具;
  • 创建一个带有隐藏输入的后门(向开发人员询问),这会复制原始上传者的行为。

我会选择第二个选项,对于 FE-devs 这应该是一个简单的选项。他们可能会自动删除生产版本中的相应后门。

一个解决方案非常有趣 - Selenide 无法解析 "Evaluate Code Fragment" 模式下的上传。基本上,我的问题也有了答案。