如何使用selenium或webdriver处理测试自动化中的文件上载

时间:2011-05-25 17:07:23

标签: java file-upload selenium automated-tests webdriver

我认为每个人如何使用Webdriver进行测试自动化必须意识到它对Web开发的巨大优势。

但如果文件上传是您的网络流量的一部分,则存在一个巨大的问题。它不再是测试自动化。浏览器的安全限制(调用文件选择)实际上使得无法自动化测试。

Afaik唯一的选择是让webdriver点击文件上传按钮,睡眠线程,让开发人员/测试人员手动选择文件,然后完成其余的网络流程。

如何解决这个问题,是否有解决方法?因为它真的不能这样做。这没有意义。

这是我知道浏览器安全限制不适用的唯一情况:

<script language=javascript>   
  function window.onload(){   
          document.all.attachment.focus();   
          var WshShell=new ActiveXObject("WScript.Shell")   
          WshShell.sendKeys("D:\MyFile.doc")
  }   
</script>

6 个答案:

答案 0 :(得分:40)

Webdriver可以在IE和Firefox中轻松处理这个问题。这是一个查找元素并输入元素的简单案例。

driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("myfile.txt")

上面的例子是Python,但你明白了

答案 1 :(得分:3)

如果您使用的是Java,那么使用AWT机器人是一种选择。但它不是一个好的选择,它不是很可靠,而且根本不干净。 Look here

我使用HttpClient并在Selenium之外运行一些测试。这更可靠,更清洁。

请参阅下面的代码。您需要更多的异常处理和条件才能使其适合您的工作。

HttpClient c = new HttpClient();
String url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/j_security_check";
PostMethod post = new PostMethod(url);
post.setParameter("j_username", username);
post.setParameter("j_password", password);
c.executeMethod(post);

url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/myurl.html";
MultipartPostMethod mPost = new MultipartPostMethod(url);
String fileNameWithPath = this.getClass().getClassLoader().getResource(filename).getPath();
File f1 = new File(fileNameWithPath);
mPost.addParameter(elementName, f1);
mPost.addParameter("action", "upload");
mPost.addParameter("ajax", "true");

c.executeMethod(mPost);
mPost.getResponseBodyAsString();

答案 2 :(得分:1)

以为我会为作者使用ActiveX的原始帖子提供一个FYI。另一个解决方法是与桌面GUI自动化工具集成以完成工作。例如,谷歌“Selenium AutoIt”。对于更加跨平台的解决方案,请考虑像Sikuli这样的工具,而不是AutoIt。

当然,这并不是考虑WebDriver对IE和IE上传的支持。 Firefox通过SendKeys,或考虑其他浏览器,该方法不起作用。

答案 3 :(得分:1)

只有启用了文本框,才能在文本框中输入内容。 由于显而易见的原因,相当多的应用程序会强制您浏览文件系统文件浏览器。 那你怎么办呢? 我认为WebDriver专家并不认为只是将密钥呈现在KeyBoard缓冲区中(这在以前的自动化时代曾经是“毫无疑问”)

===

经过几天的小睡,头部撞击和拔毛我能够得到一些基于机器人的解决方案(这里和其他地方)。

我遇到的问题是填充了正确文件路径和名称的对话框文本框无法响应使用VK_ENTER终止文件名的KeyPress / Release事件,如下所示:

private final static int Enter = KeyEvent.VK_ENTER;
keyboard.keyPress(Enter);
keyboard.keyRelease(Enter);

文件路径和文件名的输入是正确的,但对话框仍然打开 - 反对我一直希望并祈祷关键模拟将终止它并由测试中的应用程序处理。

有谁知道如何让这个机器人表现得更好一点?

答案 4 :(得分:0)

在对这个问题进行了太长时间的讨论之后,我想与社区分享Firefox 7.0.1似乎与上面提到的FirefoxDriver sendKeys()实现有问题(至少我无法得到)它可以在我的Windows 7 x64机箱上工作),我还没有找到解决方法,但更新到Firefox 8.0.1似乎已经解决了这个问题。对于那些您想知道的人,也可以使用Selenium RC来解决这个问题(尽管您需要考虑所有目标操作系统和与文件选择对话框交互所需的本机键按下)。希望我必须解决的问题能够在一段时间内拯救其他人,总结如下:

https://gist.github.com/1511360

答案 5 :(得分:0)

如果您正在使用网格,则可以打开测试文件的文件夹进行共享。

这样您可以选择上传输入字段并将其值设置为\\ pc-name \ myTestFiles

如果不是,您应该使用每个系统上的本地文件。