如何通过自动化无头浏览器中的 window 弹出窗口将文件上传到网络浏览器(selenium webdriver)

How to upload the file into web browser through window popup in headless browser in automation (selenium webdriver)

我需要通过硒中的 Window 弹出窗口将文本文件上传到我的网页(通过单击浏览)。

我已经使用下面的机器人 class 来做到这一点。

public void uploadFileUsingRobot(String filePath) throws AWTException,Exception{

          StringSelection path = new StringSelection(filePath);
          Toolkit.getDefaultToolkit().getSystemClipboard().setContents(path, null);

              Robot r = new Robot();

              r.keyPress(KeyEvent.VK_ENTER);
              r.keyRelease(KeyEvent.VK_ENTER);

              r.keyPress(KeyEvent.VK_CONTROL);    
              r.keyPress(KeyEvent.VK_V);

              r.keyRelease(KeyEvent.VK_V);    
              r.keyRelease(KeyEvent.VK_CONTROL);

              r.keyPress(KeyEvent.VK_ENTER);
              r.keyRelease(KeyEvent.VK_ENTER);

       }

它在我的本地运行良好。但是当我 运行 通过 bamboo 计划时,它并没有像 bamboo 运行 宁 headless browser 中的代码那样工作。

任何人都可以建议我如何上传文件 headless browser

当您在 bamboo 上执行代码时,您可能使用了远程驱动程序。要上传文件,您可以使用 sendKeys 将文件路径设置为文件输入字段并使用 fileDetector。

解法:

如果你有文件输入框

<input id="fileinputfield" type="file">

然后下面的代码将设置文件路径

remoteWebDriver.setFileDetector(new LocalFileDetector());
WebElement input = remoteWebDriver.findElement(By.id("fileinputfield"));
input.sendKeys(filePath);

Here you have an article 描述解决方案。

您可能会遇到的问题:

  1. 正在获取 remoteWebDriver。这是您可以尝试的一种方法

    RemoteWebDriver remoteWebDriver = (RemoteWebDriver) ((WebDriverFacade) getDriver()).getProxiedDriver();
    
  2. 隐藏(不显示)文件输入字段。如果 html 是:

    <input id="fileinputfield" style="display:none;" type="file">
    

    那么执行代码设置文件路径的时间需要显示:

    JavascriptExecutor js = (JavascriptExecutor) getDriver();
    js.executeScript("document.getElementById('filedata').style.display='inline-block';");
    
    // RemoteWebDriver remoteWebDriver = (RemoteWebDriver) ((WebDriverFacade) getDriver()).getProxiedDriver();
    // remoteWebDriver.setFileDetector(new LocalFileDetector());
    // WebElement input = remoteWebDriver.findElement(By.id("fileinputfield"));
    // input.sendKeys(filePath);
    
    js.executeScript("document.getElementById('filedata').style.display='none';");
    

Java 脚本执行器和使用的机器人没有 robust.They 正常工作但有时会失败。我试过 AutoIt,即使在 headless/remote 浏览器中也能正常工作。