本篇我们来讨论,如何写一个浏览器初始化的类。在写之前,先思考一下,我们需要一个什么样的初始化?
先来看看使用原生的Java + selenium是怎么做的。(以firefox为例)
System.setProperty("webdriver.gecko.driver", "c:\\geckodriver.exe"); driver = new FirefoxDriver();
上面是个典型的例子,System.setProperty("webdriver驱动名",“webdriver的路径”),然后去new一个新的driver对象。这里引出一个问题,即webdriver的版本问题。
先贴两张图,后续可以继续更新维护。
ChromeDriver的
下载地址(国内淘宝镜像):https://npm.taobao.org/mirrors/chromedriver
firefox-geckodriver的
下载路径:https://github.com/mozilla/geckodriver/releases
再放一个参考网址:http://selenium-release.storage.googleapis.com/index.html
总之,我们在构建Selenium+WebDriver这套环境的时候,需要注意Selenium,WebDriver以及浏览器版本之间的对应关系。笔者自己使用的组合:
selenium-server-standalone-3.9.1
chrome浏览器 版本 76.0.3809.132(正式版本) ------->不小心升级了。。。。chromedriver版本 76.0.3809.126
firefox浏览器 63.0.1 ------->geckodriver 版本 0.24.0
PS:Chorme浏览器在70版本之后,所使用的chomedriver与浏览器版本尽量保持一致。
好了,说完浏览器与WebDriver时间的版本对应,我们就要来着手开始写浏览器初始化的代码了。
在黑盒手工测试中,我们经常说“启动XX浏览器输入XXX网址并打开”,那么浏览器初始化,我们就基本定义2个参数。一个是XX浏览器,一个XXX是网址。
package webui.xUtils; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.firefox.FirefoxProfile; import org.openqa.selenium.ie.InternetExplorerDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.Reporter; public class browserUtil { static WebDriver driver; static logUtil logs = new logUtil(browserUtil.class); @SuppressWarnings("deprecation") public static WebDriver setDriver(String browserName,String url) { logs.info("读取执行xml配置的"+browserName+"浏览器初始化\n"); Reporter.log("读取执行xml配置的"+browserName+"浏览器初始化\n"); switch (browserName) { case "firefox": //此处设置firefox的webdriver地址 System.setProperty("webdriver.gecko.driver", ".\\libs\\webdriver\\geckodriver.exe"); FirefoxProfile profile = new FirefoxProfile(); //设置成 0 代表下载到浏览器默认下载路径, 设置成 2 则可以保存到指定目录。 profile.setPreference("browser.download.folderList", 2); profile.setPreference("browser.download.dir", ".\\firefox-download"); //browser.helperApps.neverAsk.saveToDisk //指定要下载页面的 Content-type 值, “binary/octet-stream” 为文件的类型。 //下载的文件不同,这里的类型也会有所不一样。如果不清楚你下载的文件什么类型,请用Fiddler抓包。 profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.ms-excel"); profile.setPreference("plugin.state.flash", 2); FirefoxOptions options = new FirefoxOptions(); options.setProfile(profile); driver = new FirefoxDriver(options); driver.manage().window().maximize(); //隐式等待 // driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); logs.info("打开浏览器,访问"+url+"网址!"); Reporter.log("打开浏览器,访问"+url+"网址!"); driver.get(url); break; case "chrome": System.setProperty("webdriver.chrome.driver", ".\\libs\\webdriver\\chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); logs.info("打开浏览器,访问"+url+"网址!"); Reporter.log("打开浏览器,访问"+url+"网址!"); driver.get(url); break; case "IE": System.setProperty("webdriver.ie.driver", ".\\libs\\webdriver\\IEDriverServer32.exe"); DesiredCapabilities dc = DesiredCapabilities.internetExplorer(); dc.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); dc.setCapability("ignoreProtectedModeSettings", true); driver=new InternetExplorerDriver(dc); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); logs.info("打开浏览器,访问"+url+"网址!"); Reporter.log("打开浏览器,访问"+url+"网址!"); driver.get(url); break; default: break; } return driver; } public static void quit() { driver.quit(); } }
在这里说两个问题。一个是有关于文件的下载,另外一个是关于IE浏览器的设置问题。

针对Firefox浏览器,我们可以参考一下的思路来进行设置。(请参考前面的红色部分代码)
先 new 一个FirefoxProfile()类,通过setPreference 设置浏览器下载类型、路径等。
参数:
browser.download.folderList
设置成 0 代表下载到浏览器默认下载路径, 设置成 2 则可以保存到指定目录。
browser.download.dir
用于指定所下载文件的目录。
browser.helperApps.neverAsk.saveToDisk
指定要下载页面的 Content-type 值, “binary/octet-stream” 为文件的类型。下载的文件不同,这里的类型也会有所不一样。如果不清楚下载的文件什么类型,请使用Fiddler抓包查看。
针对chrome浏览器,我们可以采用类似的思路。可以参考以下的代码段:
String downloadFilepath = "D:\\java"; HashMapchromePrefs = new HashMap (); chromePrefs.put("profile.default_content_settings.popups", 0); chromePrefs.put("download.default_directory", downloadFilepath); ChromeOptions options = new ChromeOptions(); HashMap chromeOptionsMap = new HashMap (); options.setExperimentalOption("prefs",chromePrefs); options.addArguments("--test-type"); DesiredCapabilities cap = DesiredCapabilities.chrome(); cap.setCapability(ChromeOptions.CAPABILITY, chromeOptionsMap); cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); cap.setCapability(ChromeOptions.CAPABILITY, options); WebDriver driver = new ChromeDriver(cap); driver.get(url);
参数说明:
相比较Firefox来说,Chrome的下载默认不会弹出下载窗口的,我们主要是想修改默认的默认下载路径。
Chrome的设置看上去要比Firefox复杂一次,不过,你需要关注两个设置:
profile.default_content_settings.popups 0 设置为禁止弹出下载窗口
download.default_directory 设置为文件下载路径
下一篇我们来继续关注IE浏览器的设置。