如何使用硒或网络驱动程序在测试自动化中处理文件上传

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

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

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

如何处理这个问题,有没有解决方法?因为真的不能这样做。这是没有道理的。

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

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

答案 1

Webdriver可以在IE和Firefox中非常轻松地处理这个问题。这是一个查找元素并键入其中的简单情况。

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

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


答案 2

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

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

推荐