Selenium 下载文件对话框

Selenium 下载文件对话框,selenium,download,automated-tests,Selenium,Download,Automated Tests,我正在将Selenium与我的CI系统一起使用,以自动测试我的各种应用程序,其中一个是带有可下载答案副本(作为动态生成的PDF)的web表单。测试是断言可下载的PDF文件包含正确的答案(在网络表单上给出的答案)。我的问题是试图处理下载对话框来检索PDF文件(断言PDF的内容是正确的超出了这个问题的范围) 我花了一段时间四处寻找处理它的方法,我发现很少有相关的事情是,更改默认下载位置&让浏览器自动下载文件,然后就可以了。不幸的是,我的情况排除了这三种可能性 我使用多种浏览器(排除自动下载,因为有些

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

我花了一段时间四处寻找处理它的方法,我发现很少有相关的事情是,更改默认下载位置&让浏览器自动下载文件,然后就可以了。不幸的是,我的情况排除了这三种可能性

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

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

    据我所知,由于您自己陈述的原因,您不能使用硒。然而,我认为最好的方法是直接下载生成的pdf而不使用selenium。因为您知道它的url,所以可以使用中概述的方法。它描述了如何使用“火药猴”来做你想做的事情。

    这确实是一个令人讨厌的问题。然而,我可以想出如何在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>
    
    
    

    我希望这能对你有所帮助。

    如果卢卡奇的回答对你来说还不够,我有另一个想法。如果您可以嗅探并发布Http/会话参数,您可以通过正常的交互下载获得这些参数吗?如果您构建数据包并管理您的会话(即cookies/cache,无论以前的交互保存在何处),您可能可以在不下载的情况下检查链接。在浏览器中打开PDF如何?