2010-10-12 108 views
9

我試圖測試一段需要很長時間才能響應的代碼的快樂路徑,然後開始將文件寫入響應輸出流,這會在瀏覽器中提示下載對話框。硒等待下載?

問題是這個過程在過去失敗了,在這麼長時間的工作之後拋出一個異常。硒到wait-for-download或同等產品有辦法嗎?

我可以投入Thread.sleep,但這樣做會不準確並且不必要地拖慢測試運行。

我該怎麼做,在這裏?

回答

5

所以,你這裏有兩個問題:

  1. 你需要使瀏覽器下載
  2. 你需要測量下載的文件是完整的

時既不problemc文件的是直接由Selenium解決(但2.0版本可能有所幫助),但兩者都是可解決的問題。第一個問題可以通過GUI自動化工具包(如AutoIT)來解決。但他們也可以通過簡單地在模擬輸入鍵的操作系統級別發送自動按鍵(適用於Firefox,在某些版本的Chrome和Safari上稍微難一點)來解決。如果你使用的是Java,你可以使用Robot做到這一點。其他語言有類似的工具包來做這樣的事情。

第二個問題可能是用某種代理解決方案最好解決的。例如,如果您的瀏覽器配置爲通過代理服務器,並且該代理服務器具有API,則可以使用該API查詢該代理服務器以詢問網絡活動何時結束。

這就是我們在http://browsermob.com所做的工作,這是我創建的一家使用Selenium進行負載測試的創業公司。我們已經發布了一些代理代碼作爲開源代碼,可在http://browsermob.com/tools處獲得。

但有兩個問題依然存在:

  1. 您需要配置使用代理瀏覽器。在Selenium 2中這很容易,但也可以用Selenium 1來完成。關鍵是確保您的瀏覽器啓動器以正確的配置文件/設置啓動瀏覽器。
  2. 目前沒有API BrowserMob代理告訴你何時網絡流量已停止!這是該項目概念中的一個大漏洞,我希望儘快解決這個問題。但是,如果您熱衷於幫助,請加入Google羣組,我絕對可以將您指向正確的方向。

希望能幫助您識別各種選項。祝你好運!

0

這屬於「無法自動化的事物」類別。 Selenium使用JavaScipt構建,由於JavaScript沙箱限制,它無法訪問下載。

Selenium 2可能能夠做到這一點警報/提示已經實施,但這不會發生在接下來的一段時間。

+1

現在怎麼樣?這仍然不可能嗎? – user942640 2015-07-02 11:30:20

0

如果您想檢查下載對話框,請嘗試使用AutoIt。我使用它來上傳和下載文件。使用AutoIt和Se RC更容易。

4

這是Chrome的測試,唯一的解決方案,用於控制使用JavaScript下載..

使用的webdriver(Selenium2),它可以Chrome的鉻內進行://這是HTML/CSS/JavaScript的:

driver.get("chrome://downloads/"); 
waitElement(By.CssSelector("#downloads-summary-text")); 

// next javascript snippet cancels the last/current download 
// if your test ends in file attachment downloading 
// you'll very likely need this if you more re-instantiated tests left 
((JavascriptExecutor)driver).executeScript("downloads.downloads_[0].cancel_();"); 

還有其他Download.prototype.functions在 「鉻://downloads/downloads.js」

這套房你,如果你只需要測試一些信息,例如。由文件附件啓動活動引起,而不是文件本身。

當然,你需要控制步驟1 - 由Patrick above提到的 - 並以此可以控制步驟2用於測試,而不是實際的文件下載完成的功能/取消。

另請參閱:Javascript: Cancel/Stop Image Requests這是關於瀏覽器停止。

8

我有同樣的問題。我發明了一些東西來解決問題。一個誘惑文件由Python以'.part'擴展名創建。所以,如果我們仍然有temp,python可以等待10秒鐘,然後再次檢查文件是否已下載。

while True: 
     if os.path.isfile('ts.csv.part'): 
      sleep(10) 
     elif os.path.isfile('ts.csv'): 
      break 
     else: 
      sleep(10) 
driver.close() 
+0

在這個答案和Santeri之間,你確實可以完成你需要的一切。 – Yablargo 2017-04-03 17:25:36