【问题标题】:upload file Classloader/selenium to HTML-element type="file"上传文件 Classloader/selenium 到 HTML-element type="file"
【发布时间】:2013-07-23 14:21:34
【问题描述】:

我正在使用 Selenium、java 和 classloader 将 pdf 文件上传到带有元素的 HTML 页面

type="file"

我的代码是:

    String fileURI = ClassLoader.getSystemResource("file.pdf").getFile();

    setText(DOCUMENTATION_FILE_FIELD, fileURI);

    public void setText(Locator textField, String text) throws Exception {
         HtmlInput htmlInput = (HtmlInput) getElement(textField);
        pageUtils.page = (HtmlPage) htmlInput.setValueAttribute(text);
    }

当我按下页面上的“上传”按钮时,没有任何反应。没有错误,没有文件上传。 当我从DOCUMENTATION_FILE_FIELD 获取文本时,会显示正确的路径。 谷歌搜索时,我在论坛上读到,由于安全原因,无法自动上传文件。它是否正确?如果是这种情况,有没有其他方法可以做到这一点。

【问题讨论】:

标签: java selenium classloader htmlunit gargoyle


【解决方案1】:

我认为您可以使用 sendkeys() 方法并输入文件的整个路径并点击提交按钮。识别文件对象并针对它使用 sendkeys 方法。

【讨论】:

  • 感谢您的回复。我无法找到 sendkeys() 方法。我认为我的系统不支持它。我正在使用硒,石像鬼(htmlUnit)。
  • 嗯,如何在文本框中输入内容?
  • public void setText(Locator textField, String text) throws Exception { HtmlInput htmlInput = (HtmlInput) getElement(textField); pageUtils.page = (HtmlPage) htmlInput.setValueAttribute(text); }
  • 您能否将文件上传对话框的定位器和路径作为字符串文本传递?这可能有效。
  • 如果我的理解是正确的,那不是我在我的问题中尝试过的吗?
【解决方案2】:

要设置<input type="file"> 字段,您无需设置其文本,而是设置其值!因此,不要使用setText() 方法(无论它来自何处),而是使用设置值的方法(setValue()?setArgument()?)。

另外,<input type="file"> 元素接受文件的 URL,它采用绝对路径。这也意味着你的文件必须有一个绝对路径——它不能被隐藏在 JAR 文件中。如果你把它埋在一个 JAR 文件中,你需要先把它复制出来。然后获取它的路径。如果可以访问,请执行

URL fileUrl = ClassLoader.getSystemResource("file.pdf");
String filePath = new File(fileUrl.toURI)).getAbsolutePath();

然后您可以将filePath 设置为<input> 元素的value 属性。


您提到了 Selenium,但您没有使用它的任何方法。如果你真的使用 Selenium,那么有两种选择:

  • 对于 Selenium RC,the Selenium#attachFile() method:

    selenium.attachFile("id=yourFileInputId", fileUrl);
    
  • 对于 Selenium WebDriver,WebElement#sendKeys() 方法

    driver.findElement(By.id("yourFileInputId")).sendKeys(filePath);
    

【讨论】:

  • 感谢您的回复。昨天我很沮丧,我忘了添加 setText() 方法。我现在编辑了我的帖子,您可以看到 setText() 使用 setValueAttribute("")。我无法设法使用硒方法。当我开始上课时,我运行:client = new ExtendedWebClient(testConfiguration); TestData testdata = new TestData(testConfiguration); homePage = new HomePage(client, testConfiguration, testdata);
  • @TorK 好的,这基本上意味着您使用的是普通的 HTMLUnit,而不是 Selenium。虽然使用普通 HTMLUnit 对低级修补很有好处,但如果您想提高效率并在更高级别上控制浏览器(HTMLUnit 或任何其他浏览器),请考虑使用 Selenium。现在 - 您是否尝试将文件的绝对路径发送到 <input> 元素而不是 URI?
  • 哦,好吧,不是我搞定了环境:p 如果您阅读了上面这篇文章中的 cmets,您可以看到我尝试过的内容。是的,我已尝试发送绝对路径。
  • @TorK 哦,好吧,因为您的代码没有显示(它仍然发送一个 URI)。你试过this吗?另外,或者,如果<input>元素附加了一些JS,你可以尝试firing an onchange event manually来触发JS。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 2021-11-26
  • 2016-05-25
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2019-08-22
相关资源
最近更新 更多