繁体   English   中英

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

[英]How to deal with file uploading in test automation using selenium or webdriver

我想每个使用Webdriver进行测试自动化的人一定知道它在web开发方面的巨大优势。

但是,如果文件上传是 web 流程的一部分,则会出现一个大问题。 它不再是测试自动化。 浏览器的安全限制(调用文件选择)实际上使得自动化测试变得不可能。

Afaik 唯一的选择是让 Webdriver 单击文件上传按钮,休眠线程,让开发人员/测试人员手动 select 文件,然后执行 Z2567A5EC9705EB7AC2C984033E06 流程的 rest。

这个怎么处理,有没有解决办法? 因为真的不能这样。 这没有任何意义。

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

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

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

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

上面的例子在 Python 但你明白了

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

我使用 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();

仅当启用文本框时,在文本框中键入的建议才有效。 出于显而易见的原因,相当多的应用程序迫使您通过文件系统文件浏览器访问 go。 那你怎么办呢? 我不认为 WebDriver 专家只是想将键呈现到 KeyBoard 缓冲区中(在早期的自动化时代,这曾经是“不费吹灰之力”)

===

经过几天的短暂睡眠、撞头和拉头发后,我能够获得这里(和其他地方)建议的一些基于机器人的解决方案。

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

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

发生的情况是正确输入了文件路径和文件名,但对话框仍然打开 - 我一直希望并祈祷密钥仿真将终止它并由正在测试的应用程序处理。

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

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

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

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

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

如果不是,则应在每个系统上使用 go 与本地文件。

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

https://gist.github.com/1511360

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM