2009-07-24 54 views
71

是否有任何一種API可以允許我在Firefox中操作文件下載對話框? (我想訪問用戶做某事時出現的那個,而不是自己發起一個)。在Firefox中訪問文件下載對話框

我想要做的是從Selenium訪問這個對話框(以及Selenium「特權模式」是否足以訪問chrome接口,這也是我不確定的事情)。

+3

我剛剛花了三個星期的最好的部分配置我自己的Apache虛擬專用服務器的第一次(因爲這是一個有點棘手,在共享主機運行硒),得到Firefox,Selenium和Python一起工作,編寫實際的Python代碼來遍歷一個非常JavaScript的站點,所有這些都在它的最後下載一個文件。然後我意識到我不知道如何實際訪問下載的文件。我很高興你先問這個問題。 – 2011-04-04 22:38:19

+0

如果Firefox有一個不錯的AppleScript字典,AppleScript將會很棒。 – 2013-11-20 15:58:07

+0

誰能幫我 [本網站問題] [1] [1]:http://stackoverflow.com/questions/27058053/selenium-python-webdriver-path-error-system-找不到路徑指定的 – 2014-11-21 11:44:49

回答

26

不是我所知道的。但是,您可以在特定位置將Firefox配置爲automatically start the download and save the file。然後您的測試可以檢查文件實際到達。

+0

好吧,我想我會用這個解決方案。 – 2009-07-24 22:30:41

+1

但是硒會在默認配置文件中啓動Firefox(因爲沒有指定配置文件),所以每次配置它。而不是它創建一個新的配置文件與您的喜好,所以它更容易。 – 2016-03-08 19:13:00

3

不知道,但你也許可以檢查一個Firefox下載插件的來源。

這裏是我使用的源碼Download Statusbar

+0

謝謝,這非常有趣(但證明,要麼是不可能的,要麼是非常困難的,除非我用xul部分寫一個擴展)。 – 2009-07-24 22:31:48

0

我沒有理解您的目標, 您是否希望您的測試在測試執行時自動下載文件,如果是,那麼您需要在測試執行中使用自定義Firefox配置文件。

在自定義配置文件中,首次手動執行測試,如果下載對話框出現,將其設置爲「將其保存到磁盤」,並選中始終執行此操作複選框,以確保該文件在您下次運行測試時自動下載。

34

我被困在同樣的問題,但我找到了解決方案。我做了和blog一樣的做法。

當然,這是Java的,我已經把它翻譯到Python:

fp = webdriver.FirefoxProfile() 

fp.set_preference("browser.download.folderList",2) 
fp.set_preference("browser.download.manager.showWhenStarting",False) 
fp.set_preference("browser.download.dir",getcwd()) 
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv") 

browser = webdriver.Firefox(firefox_profile=fp) 

在我的例子,這是一個CSV文件。但是當你需要更多的,還有存儲在~/.mozilla/$USER_PROFILE/mimeTypes.rdf

68

我對這個問題的解決方案,檢查代碼:

FirefoxProfile firefoxProfile = new FirefoxProfile(); 

firefoxProfile.setPreference("browser.download.folderList",2); 
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false); 
firefoxProfile.setPreference("browser.download.dir","c:\\downloads"); 
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv"); 

WebDriver driver = new FirefoxDriver(firefoxProfile);//new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability); 

driver.navigate().to("http://www.myfile.com/hey.csv"); 
6

Web應用程序生成3種不同類型的彈出窗口;即

1| JavaScript PopUps 
2| Browser PopUps 
3| Native OS PopUps [e.g., Windows Popup like Upload/Download] 

通常,JavaScript彈出窗口由Web應用程序代碼生成。 Selenium提供了一個API來處理這些JavaScript彈出窗口,如Alert。最終,忽略瀏覽器彈出和下載文件的最簡單方法是通過使用瀏覽器配置文件完成的;有幾個方法可以做到這一點:

  • 使用配置文件setPreference

方法1

手動涉及瀏覽器的性能(或)

  • 自定義瀏覽器屬性的變化,你開始流行工作之前在瀏覽器配置文件上,請確保下載選項默認設置爲保存文件。

    (打開Firefox)工具>選項>應用程序

    enter image description here

    方法2

    利用下面的代碼片段,做編輯必要時。

    FirefoxProfile profile = new FirefoxProfile(); 
    
    String path = "C:\\Test\\"; 
    profile.setPreference("browser.download.folderList", 2); 
    profile.setPreference("browser.download.dir", path); 
    profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
    profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream"); 
    profile.setPreference("browser.download.manager.showWhenStarting", false); 
    profile.setPreference("browser.download.manager.focusWhenStarting", false); 
    profile.setPreference("browser.download.useDownloadDir", true); 
    profile.setPreference("browser.helperApps.alwaysAsk.force", false); 
    profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
    profile.setPreference("browser.download.manager.closeWhenDone", true); 
    profile.setPreference("browser.download.manager.showAlertOnComplete", false); 
    profile.setPreference("browser.download.manager.useWindow", false); 
    profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false); 
    profile.setPreference("pdfjs.disabled", true); 
    
    driver = new FirefoxDriver(profile); 
    
  • 2

    大多數瀏覽器(在我的情況下是Firefox)默認選擇確定按鈕。所以我設法通過使用下面的代碼來解決這個問題。它基本上會爲您輸入回車並下載文件。

    Robot robot = new Robot(); 
    
    // A short pause, just to be sure that OK is selected 
    Thread.sleep(3000); 
    
    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
    
    2

    而是觸發本地文件下載對話框,像這樣的:

    By DOWNLOAD_ANCHOR = By.partialLinkText("download"); 
    driver.findElement(DOWNLOAD_ANCHOR).click(); 
    

    我通常做此相反,繞過本地文件下載對話框。這樣,它適用於所有的瀏覽器:

    String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href"); 
    File downloadedFile = getFileFromURL(downloadURL); 
    

    這只是需要你實現方法getFileFromURL使用Apache的HttpClient的下載文件,並返回一個文件引用您。

    同樣,如果您碰巧使用的是Selenide,則使用內置的download()函數來處理文件下載的方式是一樣的。

    直到Marionette更成熟,那就是我所做的。

    5

    我正面臨同樣的問題。 在我們的應用程序的Firefox實例是通過傳遞DesiredCapabilities基於別人的建議如下

    driver = new FirefoxDriver(capabilities); 
    

    創建的,我做了我的變化

    FirefoxProfile firefoxProfile = new FirefoxProfile();  
    firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk", 
        "application/octet-stream"); 
    driver = new FirefoxDrvier(firefoxProfile); 
    

    該服務的目的,但不幸的是我的其他自動化測試開始失敗。原因是,我已經刪除了早先通過的功能。

    一些在網上瀏覽並找到了一種替代方法。我們可以在所需的功能中設置配置文件本身。

    因此,新的工作代碼看起來像

    DesiredCapabilities capabilities = DesiredCapabilities.firefox(); 
    
    // add more capabilities as per your need. 
    FirefoxProfile firefoxProfile = new FirefoxProfile();   
    firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk", 
        "application/octet-stream"); 
    
    // set the firefoxprofile as a capability 
    capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile); 
    driver = new FirefoxDriver(capabilities); 
    
    0

    此外,您可以添加

     profile.setPreference("browser.download.panel.shown",false); 
    

    要刪除被默認顯示,覆蓋了網頁的一部分下載的文件列表。

    我總設置爲:

     DesiredCapabilities dc = DesiredCapabilities.firefox(); 
         dc.merge(capabillities); 
         FirefoxProfile profile = new FirefoxProfile(); 
         profile.setAcceptUntrustedCertificates(true); 
         profile.setPreference("browser.download.folderList", 4); 
         profile.setPreference("browser.download.dir", TestConstants.downloadDir.getAbsolutePath()); 
         profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
         profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, data:image/png, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream"); 
         profile.setPreference("browser.download.manager.showWhenStarting", false); 
         profile.setPreference("browser.download.manager.focusWhenStarting", false); 
         profile.setPreference("browser.download.useDownloadDir", true); 
         profile.setPreference("browser.helperApps.alwaysAsk.force", false); 
         profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
         profile.setPreference("browser.download.manager.closeWhenDone", true); 
         profile.setPreference("browser.download.manager.showAlertOnComplete", false); 
         profile.setPreference("browser.download.manager.useWindow", false); 
         profile.setPreference("browser.download.panel.shown",false); 
         dc.setCapability(FirefoxDriver.PROFILE, profile); 
         this.driver = new FirefoxDriver(dc); 
    
    3

    我有同樣的問題,我想沒有保存對話的訪問。

    下面的代碼可以幫助:

    FirefoxProfile fp = new FirefoxProfile(); 
        fp.setPreference("browser.download.folderList",2); 
        fp.setPreference("browser.download.manager.showWhenStarting",false); 
        fp.setPreference("browser.helperApps.alwaysAsk.force", false); 
        // Below you have to set the content-type of downloading file(I have set simple CSV file) 
        fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv"); 
    

    根據其將要下載的文件類型,您需要指定content types.

    您可以指定「分隔的多個內容類型;'

    如:

    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");