使用Selenium WebDriver下载pdf for Firefox
我试图将.pdf下载到本地,以便我可以使用Apache PDFBox从中读取文本并将其验证为我的测试套件的一部分。我已经找到一些代码来通过点击一个URL从Firefox下载pdf。这对我来说不起作用,因为我正在使用的pdf是一个机密文档,所以它不会被URL公开,而是作为一个弹出窗口在PDF Viewer中加载。在浏览器中加载PDF查看器后,是否有人知道如何在Firefox PDF查看器中点击下载按钮?使用Selenium WebDriver下载pdf for Firefox
我试图寻找它由元素的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();
}
}
只需要使用下面的代码点击下载按钮:
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);
不幸的是,它不能直接找到你要的东西。原因是它没有找到“下载”元素(通过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文件并且不会显示下载弹出窗口。
我了解到,在你的情况下,你必须先切换()到弹出浏览器,然后点击Firefox浏览器中的下载图标。即使这样做后,PDF也不会立即下载。您必须进行一些设置才能帮助您直接下载PDF。这些设置由@zsbappa提及。 – Amol
另外你的问题是,Selenium抛出一个异常,因为没有找到元素。实际上,在查找元素*时没有任何挑战,但是您尚未切换到打开机密文档的弹出窗口。 – Amol
对不起,我意识到时删除了我的评论。你的回答解决了我的问题,谢谢我创建了一个机器人(java.awt),在它询问我是要保存还是打开文件后点击确定按钮,但它的工作方式像魅力。之后也必须确保switchTo.defaultContent()。我认为我不必通过更改首选项“browser.helperApps.neverAsk.saveToDisk”来创建机器人。 –