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

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

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

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

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

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

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

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

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

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

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

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

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

 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(); 

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

当然,这并不是考虑WebDriver支持通过SendKeys上传IE和Firefox上的内容,也不考虑其他浏览器无法使用该方法。

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

===

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

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

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

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

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

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

https://gist.github.com/1511360

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

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

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