使用sendKeys()在Selenium中上传文件无法正常工作

3

我无法使用sendKeys()上传文件。以下是我的代码:

driver.findElement(By.xpath(Locators.browseFlagIconBtn)).sendKeys("D:\\Images\\icons.png");
我有一个文件上传的输入标签,类型为 file。
<input type="file" id="iconFlagFile" name="iconFile" onchange="setFlagIconFile()" value="" class=" file-input-opacity" style="position: absolute; z-index: 100; font-size: 200px; line-height: 200px; top: 0px; left: 0px; opacity: 0;">
然而,当我点击包含此输入字段的表单的提交按钮时,我被重定向到以下页面:enter image description here 造成此问题的原因是:使用sendKeys()方法传递路径时,它会正确地选择需要上传的文件。但是,实际的上传发生在用户点击提交按钮时。现在我不知道为什么它会在Chrome目录中搜索所选取的文件,例如:"C:\Program Files (x86)\Google\Chrome\Application\53.0.2785.116"。 显然,它将无法找到该文件。 问题:如何解决这个问题?如果需要提供更多信息,请告诉我。
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
请尝试以下JavaScript执行器代码。
String filePath = "D:\\Images\\icons.png";
JavascriptExecutor jsx = (JavascriptExecutor) driver;
jsx.executeScript("document.getElementById('iconFlagFile').value='" + filePath + "';");

如果这不起作用,请尝试以下操作:JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("document.getElementById('iconFlagFile').style.display = 'block';"); driver.findElement(By.id("iconFlagFile")).sendKeys("D:\\Images\\icons.png"); js.executeScript("document.getElementById('iconFlagFile').style.display = 'none';"); - FayazMd

0
根据您的解释,我猜测您拥有一个HTML标签,可以允许您从本地驱动器上传文件,但是它并没有被启用。除非您点击提交按钮,否则它不会允许您上传文件。 在这种情况下,尝试编辑表单标签以进行编辑,然后尝试调用sendKeys()方法,并且您可以使用JavaScript执行程序编辑HTML元素。

把想要放置路径的元素的HTML代码放在哪里会很好,它是输入文件类型吗? - FayazMd
我已经添加了HTML代码。我有一个文件上传的输入标签,类型为文件。 - Ubaid Ahmed

0
请尝试使用以下代码进行文件上传。
    String filename = "path of the file";
    File file = new File(filename);
    String path = file.getAbsolutePath();
    // give the URL to upload
    driver.findElement(By locator).sendKeys(path);

是的,我已经尝试过了。实际的文件上传是在用户点击提交按钮时进行的,而不是在选择文件上传框中选择文件时进行的。所以很遗憾,你给出的解决方案在我的情况下不起作用。 :( - Ubaid Ahmed
@UbaidAhmed 你可以发布实际的异常吗? - Chandra Shekhar
我没有收到任何异常。请参考附加的截图。我提供了 D:\ 的路径,但是当我提交表单时,它会在 C:\ 中查找文件。当我手动执行相同的步骤时,它可以正常工作。问题出现在自动化执行时。 - Ubaid Ahmed
@UbaidAhmed 这适用于输入类型为文件的所有情况。我没有太多你的数据可以在我的端上测试。但是你能否尝试将定位器从“xpath”更改为“name”或“id”,并仅使用路径作为字符串变量再次尝试? - Chandra Shekhar

0

使用 Clipboard 类和 Robot 类的组合

    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    StringSelection str = new StringSelection("File Path");
    clipboard.setContents(str, null);

    WebElement element = driver.findElement(By.xpath("elementXpath"));
    element.click();

    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    driverwait(1);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_V);
    driverwait(1);
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,