使用Selenium WebDriver下载pdf for Firefox

问题描述:

我试图将.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()回答修复。

至于你提到的

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”来创建机器人。 –

只需要使用下面的代码点击下载按钮:

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策略不适用于我的情况。虽然机器人的东西很好,谢谢! –

我们可以处理使用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://*.com/questions/12146403/disable-firefox-save-as-dialog-selenium)说你应该能够改变你的“browser.helperApps.neverAsk.saveToDisk”setPreference方法打电话,但这似乎并不奏效。 –

+0

应用代码希望你不需要手动设置... – zsbappa

+0

不要忘记接受答案,如果它帮助你 – zsbappa