今天尝试了下不用借助autolt完成下载文件到指定目录。
好处:在于集成回归,远程机可以绕过执行autolt程序权限问题,导致autolt程序无法调用,不能完成脚本的回归。
Firefox浏览器下载操作
对应版本:
Firefox 版本是77.0.1
geckodriver 是 0.260
selenium 是3.9.1
代码中已有注释,具体看查看代码就好
示例代码如下:
import java.io.File; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.firefox.FirefoxProfile; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * @description 使用Firefox浏览器下载文件到指定目录演示示例 * @author rongrong * @version 1.0 * @date 2020/6/27 11:59 */ public class TestFirefoxDownload { WebDriver driver; @BeforeClass public void beforeClass() { driver = getDriver(); } /** * 设置火狐浏览器默认参数 * * @return */ private WebDriver getDriver() { //FirefoxProfile profile = new FirefoxProfile(); // 可以在Firefox浏览器地址栏中输入about:config来查看属性 // 设置下载文件放置路径,注意如果是windows环境一定要用\,用/不行 String path = "C:\wps"; String downloadFilePath = path + "\demo.exe"; File file = new File(downloadFilePath); if (file.exists()) { file.delete(); } FirefoxOptions options = new FirefoxOptions(); //声明一个profile对象 FirefoxProfile profile = new FirefoxProfile(); //设置Firefox的“broswer.download.folderList”属性为2 /** * 如果没有进行设定,则使用默认值 1,表示下载文件保存在“下载”文件夹中 * 设定为0,则下载文件会被保存在用户的桌面上 * 设定为2,则下载的文件会被保存的用户指定的文件夹中 */ profile.setPreference("browser.download.folderList", 2); //browser.download.manager.showWhenStarting的属性默认值为true //设定为 true , 则在用户启动下载时显示Firefox浏览器的文件下载窗口 //设定为false,则在用户启动下载时不显示Firefox浏览器的文件下载窗口 profile.setPreference("browser.download.manager.showWhenStarting", false); //设定文件保存的目录 profile.setPreference("browser.download.dir", path); //browser.helperApps.neverAsk.openFile 表示直接打开下载文件,不显示确认框 //默认值.exe类型的文件,"application/excel"表示Excel类型的文件 // application/x-msdownload profile.setPreference("browser.helperApps.neverAsk.openFile", "application/octet-stream"); //browser.helperApps.never.saveToDisk 设置是否直接保存 下载文件到磁盘中默认值为空字符串,厦航代码行设定了多种温江的MIME类型 profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream"); //browser.helperApps.alwaysAsk.force 针对位置的MIME类型文件会弹出窗口让用户处理,默认值为true ,设定为false 表示不会记录打开未知MIME类型文件 profile.setPreference("browser.helperApps.alwaysAsk.force", true); //下载.exe文件弹出窗口警告,默认值是true ,设定为false 则不会弹出警告框 profile.setPreference("browser.download.manager.alertOnEXEOpen", false); //browser.download.manager.focusWhenStarting设定下载框在下载时会获取焦点 profile.setPreference("browser.download.manager.focusWhenStarting", true); //browser.download.manager.useWindow 设定下载是否现在下载框,默认值为true,设定为false 会把下载框隐藏 profile.setPreference("browser.download.manager.useWindow", false); //browser.download.manager.showAlertOnComplete 设定下载文件结束后是否显示下载完成的提示框,默认值为true, //设定为false表示下载完成后,现在下载完成提示框 profile.setPreference("browser.download.manager.showAlertOnComplete", false); //browser.download.manager.closeWhenDone 设定下载结束后是否自动关闭下载框,默认值为true 设定为false 表示不关闭下载管理器 profile.setPreference("browser.download.manager.closeWhenDone", false); options.setProfile(profile); //设置系统变量,并设置 geckodriver 的路径为系统属性值 System.setProperty("webdriver.gecko.driver", "driver/geckodriver.exe"); //导入Firefox浏览器安装路径 System.setProperty("webdriver.firefox.bin", "E:/Program Files/Mozilla Firefox/firefox.exe"); return new FirefoxDriver(options); } @Test public void test() throws InterruptedException { driver.get("http://localhost:8080/download.html"); driver.manage().window().maximize(); driver.findElement(By.linkText("下载")).click(); Thread.sleep(3000); } }
查看下载文件内容类型
也就是下载文件的Content-type是什么,具体查看步骤如下图所示:
Chrome浏览器下载操作
示例代码如下:
import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.WebDriver; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.annotations.Test; import java.util.HashMap; import java.util.concurrent.TimeUnit; /** * @description 使用Chrome浏览器下载文件到指定目录演示案例 * @author rongrong * @version 1.0 * @date 2020/6/27 11:59 */ public class ChromeDownload { @Test public void testChromeDownload() throws Exception { System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe"); //使用Chrome浏览器自动下载文件并保存到指定的文件路径 DesiredCapabilities caps = setDownloadsPath(); WebDriver driver = new ChromeDriver(caps); driver.manage().window().maximize(); //到目标网页,下载搜狗输入法app driver.get("https://shouji.sogou.com/download.php"); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); //选择安卓版本下载 WebElement myElement = driver.findElement(By.cssSelector(".platCont [target='_blank']:nth-of-type(1) span")); Actions action = new Actions(driver); //点击下载 myElement.click(); } /*** * 设定文件下载目录 * @return */ public DesiredCapabilities setDownloadsPath() { String downloadsPath = "C:\wps"; HashMap<String, Object> chromePrefs = new HashMap<String, Object>(); chromePrefs.put("download.default_directory", downloadsPath); ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("prefs", chromePrefs); DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(ChromeOptions.CAPABILITY, options); return caps; } }
测试文件:
<!DOCTYPE html> <html> <head> <title>download</title> </head> <body> <a href="demo.exe">下载</a> </body> </html>