10

我正在使用 Selenium 和我的 CI 系统来自动测试我的各种应用程序,其中一个是一个 Web 表单,其中包含我们答案的可下载副本(作为动态生成的 PDF)。测试是断言可下载的 PDF 文件包含正确的答案(在网络表单上给出的答案)。我的问题是尝试处理下载对话框以检索 PDF 文件(断言 PDF 的内容是正确的超出了这个问题的范围)。

我花了一段时间四处寻找处理它的方法,我发现的一些相关的东西是AutoIT,更改默认下载位置并让浏览器自动下载文件,并且只是断言链接有效而无需下载文件. 不幸的是,我的情况排除了所有三种可能性。

  1. 我正在使用各种浏览器(排除自动下载,因为某些浏览器不支持此功能)。
  2. 我正在使用各种平台(排除 AutoIT,一个仅限 Windows 的应用程序)。
  3. PDF 中的内容是根据之前与应用程序的交互动态生成的,测试是断言生成的内容是否与预期值匹配,因此仅检查链接是否存在是不够的。

因为正在呈现的下载对话框是由操作系统管理的,所以我不确定是否可以将 Selenium 用于我的意图,但是我想我会先询问是否有人知道使用 Selenium 的任何解决方案,或者可以推荐一些其他可接受的测试方法?

4

2 回答 2

6

As far as I know you can't use selenium for that, for the reasons you stated yourself. However, I think the best way to approach this is to download the generated pdf directly without selenium. Since you know its url, you can maybe use the approach outlined in this article. It describes the use of "Powder-Monkey" to do exactly what you want to do.

于 2013-08-01T11:54:47.517 回答
3

这确实是一个烦人的问题。但是,我可以弄清楚如何为 Firefox 解决它。也许您可以为其他浏览器找到类似的解决方案。

基本上,您必须强制浏览器在不要求的情况下下载文件。您可以通过加载特制的配置文件来做到这一点。

from selenium import webdriver

myprofile = webdriver.FirefoxProfile('./profile')
myprofile.set_preference('browser.download.dir', '/tmp/my_downloads_folder')
myprofile.set_preference('browser.download.folderList', 2)
myprofile.set_preference('pdfjs.migrationVersion', 1);

browser = webdriver.Firefox(fp)

除了加载配置文件,我们还定义了一个下载文件夹并禁用pdfjs插件。

./profile文件夹中,我们有一个mimeTypes.rdf这样的文件:

<?xml version="1.0"?>
<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description RDF:about="urn:mimetype:application/pdf"
                   NC:value="application/pdf"
                   NC:editable="true">
    <NC:handlerProp RDF:resource="urn:mimetype:handler:application/pdf"/>
  </RDF:Description>
  <RDF:Description RDF:about="urn:mimetype:handler:application/pdf"
                   NC:alwaysAsk="false"
                   NC:saveToDisk="true"
                   NC:handleInternal="false">
    <NC:externalApplication RDF:resource="urn:mimetype:externalApplication:application/pdf"/>
   </RDF:Description>
</RDF:RDF>

我希望它对你有帮助。

于 2015-08-18T06:43:43.563 回答