2013-08-01 167 views
10

我使用Selenium和我的CI系統自動測試我的各種應用程序,其中一個是帶有可下載副本(作爲動態生成的PDF)的Web表單。該測試旨在聲明可下載的PDF文件包含正確答案(在網絡表單上給出的答案)。我的問題是試圖處理下載對話框來檢索PDF文件(斷言PDF的內容是正確的超出了這個問題的範圍)。下載文件對話框

我花了一段時間的方法來處理它四處張望,幾件事情,我發現任何相關的是AutoIT,更改默認下載位置&自動使瀏覽器下載文件,只是asserting the link works without downloading the file。不幸的是,我的情況排除了所有三種可能性。

  1. 我正在使用各種瀏覽器(排除自動下載,因爲一些瀏覽器不支持此功能)。
  2. 我正在使用各種平臺(排除AutoIT,僅Windows應用程序)。
  3. PDF中的內容是基於之前與應用程序的交互動態生成的,測試是要確定生成的內容是否與期望值匹配,因此只檢查鏈接是否存在是不夠的。

由於下載對話框是由操作系統管理的,我不確定是否可以使用Selenium來實現我想要的功能,但是我想我會首先詢問是否有人知道任何解決方案使用Selenium,或者可以推薦一些其他可接受的測試方法?

+0

如果luksch的回答對你來說還不夠,我還有一個想法。如果您可以嗅探併發布Http/Session參數,那麼通過正常交互下載可以獲得這些參數?如果您構建數據包並管理您的會話(即,Cookie /緩存 - 無論何處保存上一次交互),那麼您可以在無需下載的情況下檢查鏈接。 –

+0

如何在瀏覽器本身打開PDF? – Manu

回答

6

就我所知,由於你自己說的原因,你不能使用硒。但是,我認爲最好的方法是直接下載生成的pdf,而不用硒。既然你知道它的網址,你可以使用this article中列出的方法。它描述了使用「Powder-Monkey」來完成你想要做的事情。

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> 

我希望它可以幫助你。