2017-09-26 178 views
2

我試圖將.pdf下載到本地,以便我可以使用Apache PDFBox從中讀取文本並將其驗證爲我的測試套件的一部分。我已經找到一些代碼來通過點擊一個URL從Firefox下載pdf。這對我來說不起作用,因爲我正在使用的pdf是一個機密文檔,所以它不會被URL公開,而是作爲一個彈出窗口在PDF Viewer中加載。在瀏覽器中加載PDF查看器後,是否有人知道如何在Firefox PDF查看器中點擊下載按鈕?使用Selenium WebDriver下載pdf for Firefox

enter image description here

我試圖尋找它由元素的id,這將=「下載」:

(new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("download"))); 
driver.findElement(By.id("download")).click(); 

不幸的是,因爲它說,它無法找到元素,這並不工作。任何人都知道解決方法?

更新:我描述的彈出窗口是一個iframe元素。這導致無法找到「下載」元素。用@ 4M01的switchTo()回答修復。

回答

1

至於你提到的

PDF查看器中,而不是加載一個彈出窗口

您需要處理使用的驅動程序對象的switchTo()方法不同窗口之間切換。

下面的代碼適合我,沒有問題,我可以點擊下載圖標。

public class FirefoxPDFTest { 
     WebDriver driver; 

    @BeforeClass 
    void Setup(){ 
     System.setProperty("webdriver.gecko.driver", "C:\\Automation\\Selenium\\drivers\\geckodriver.exe"); 
     driver = new FirefoxDriver(); 
     driver.manage().window().maximize(); 
    } 

    @Test 
    void downloadPDF(){ 
     driver.get("http://www.pdf995.com/samples/pdf.pdf"); 
     waitTillPageLoad(); 
     driver.findElement(By.id("download")).click(); 
    } 



    private void waitTillPageLoad(){ 
     new WebDriverWait(driver, 30).until(driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete")); 
    } 


    @AfterClass 
    void tearDown(){ 
     driver.close(); 
     driver.quit(); 
    } 

} 
+0

我瞭解到,在你的情況下,你必須先切換()到彈出瀏覽器,然後點擊Firefox瀏覽器中的下載圖標。即使這樣做後,PDF也不會立即下載。您必須進行一些設置才能幫助您直接下載PDF。這些設置由@zsbappa提及。 – Amol

+0

另外你的問題是,Selenium拋出一個異常,因爲沒有找到元素。實際上,在查找元素*時沒有任何挑戰,但是您尚未切換到打開機密文檔的彈出窗口。 – Amol

+1

對不起,我意識到時刪除了我的評論。你的回答解決了我的問題,謝謝我創建了一個機器人(java.awt),在它詢問我是要保存還是打開文件後點擊確定按鈕,但它的工作方式像魅力。之後也必須確保switchTo.defaultContent()。我認爲我不必通過更改首選項「browser.helperApps.neverAsk.saveToDisk」來創建機器人。 –

1

只需要使用下面的代碼點擊下載按鈕:

driver.findElement(By.xpath("//button[@id='download']")).click(); 

    Thread.sleep(8000); 

    Robot robot = new Robot(); 

    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
+0

不幸的是,它不能直接找到你要的東西。原因是它沒有找到「下載」元素(通過id和xpath)是因爲它在一個iframe中。在完成之後,我必須使用driver.switchTo().frame(「nameOfMyFrame」),然後使用driver.switchTo()。defaultContent()。所以這個findElement策略不適用於我的情況。雖然機器人的東西很好,謝謝! –

1

我們可以處理使用webdriver的使用火狐瀏覽器設置和Firefox配置文件設置在Firefox瀏覽器的下載彈出。

第1步:更新Firefox瀏覽器中的設置。

打開Firefox瀏覽器並導航到工具 - >選項 導航到應用程序。 將操作類型設置爲PDF的「保存文件」。

第2步:使用FirefoxProfile

File downloadsDir = new File(""); 

// Set Preferences for FirefoxProfile. 
FirefoxProfile profile = new FirefoxProfile(); 
profile.setPreference("browser.download.folderList", 2); 
profile.setPreference("browser.download.dir", downloadsDir.getAbsolutePath()); 
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); 

// Initialize the FireFoxDriver instance. 
FirefoxDriver webDriver = new FirefoxDriver(profile); 

步驟3初始化FireFoxDriver:執行腳本

執行其點擊下載PDF圖標的腳本。

結果:將下載PDF文件並且不會顯示下載彈出窗口。

+0

對於第1步,我試圖在java代碼中自動實現而不是手動。這可能嗎?我的[研究](https://stackoverflow.com/questions/12146403/disable-firefox-save-as-dialog-selenium)說你應該能夠改變你的「browser.helperApps.neverAsk.saveToDisk」setPreference方法打電話,但這似乎並不奏效。 –

+0

應用代碼希望你不需要手動設置... – zsbappa

+0

不要忘記接受答案,如果它幫助你 – zsbappa

相關問題