selenium driver初始化
selenium driver初始化
package userMethod;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Platform;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.UnexpectedAlertBehaviour;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.ie.InternetExplorerDriverService;
import org.openqa.selenium.io.FileHandler;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
/**
* @author wangy34 Tel:13145878905
*/
public class Browser {
private static final Logger logger = Logger.getLogger(Browser.class);
private static final String CONFIG_FILE_PATH = System.getProperty("user.dir") + "/webdriver/config.properties";
// 浏览器名称常量
public enum BrowsersType {
IE("ie"), CHROME("chrome"), FIREFOX("firefox"), _360("_360"), EDGE("edge"), QIANXIN("QiAnXin");
private final String value;
BrowsersType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
// 浏览器驱动
private static final ThreadLocal<WebDriver> threadLocal = ThreadLocal.withInitial(() -> initWebDriver());
// config.properties配置文件中的参数
public static String browserName;
private static String browserPath, driverName, chromeHeadless, chromeRemoteDebug, chromeDebuggerAddress,
remoteHubAddress;
// 浏览器中打开的网页顶部到显示器顶部的距离,应用场景:截图、在SpreadJS画布中计算单元格坐标
public static int webTopOffset;
public static WebDriver getThreadLocalDriver() {
WebDriver driver = threadLocal.get();
logger.info(driver);
return driver;
}
public static ThreadLocal<WebDriver> getThreadLocal() {
return threadLocal;
}
/**
* 读取配置文件
*/
private static void readConfigFile() {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(CONFIG_FILE_PATH));
browserName = properties.getProperty("auto.test.browserName");
browserPath = properties.getProperty("auto.test.browserPath");
driverName = properties.getProperty("auto.test.driverName");
chromeHeadless = properties.getProperty("chrome.headless");
chromeRemoteDebug = properties.getProperty("chrome.remoteDebug");
chromeDebuggerAddress = properties.getProperty("chrome.debuggerAddress");
remoteHubAddress = properties.getProperty("remoteWebDriver.remoteHubAddress");
} catch (FileNotFoundException e) {
logger.error("配置文件未找到: " + CONFIG_FILE_PATH, e);
} catch (IOException e) {
logger.error("读取配置文件失败: " + CONFIG_FILE_PATH, e);
}
}
/**
* 初始化WebDriver
*/
private static WebDriver initWebDriver() {
processors();
screenWidthHeight();
readConfigFile();
if (browserName == null || browserName.trim().isEmpty()) {
throw new IllegalArgumentException("参数未填写auto.test.browserName。请检查配置文件webdriver\\config.properties!");
}
if (driverName == null || driverName.trim().isEmpty()) {
throw new IllegalArgumentException("参数未填写auto.test.driverName。请检查配置文件webdriver\\config.properties!");
}
if (browserPath == null || browserPath.trim().isEmpty()) {
if (!BrowsersType.IE.getValue().equals(browserName) && !BrowsersType.EDGE.getValue().equals(browserName)) {
throw new IllegalArgumentException("参数未填写auto.test.browserPath。请检查配置文件webdriver\\config.properties!");
}
}
switch (BrowsersType.valueOf(browserName.toUpperCase())) {
case IE:
return initIEDriver();
case CHROME:
return initChromeDriver();
case FIREFOX:
return initFirefoxDriver();
case _360:
return init360Driver();
case QIANXIN:
return initQiAnXinDriver();
case EDGE:
return initEdgeDriver();
default:
throw new IllegalArgumentException("浏览器名称错误,请检查配置文件!");
}
}
private static WebDriver initIEDriver() {
System.setProperty("webdriver.ie.driver", System.getProperty("user.dir") + "/webdriver/" + driverName);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
InternetExplorerDriverService service = InternetExplorerDriverService.createDefaultService();
WebDriver driver = new InternetExplorerDriver(service);
return driver;
}
private static WebDriver initChromeDriver() {
ChromeOptions options = new ChromeOptions();
options.setBinary(browserPath);
if (Boolean.parseBoolean(chromeRemoteDebug)) {
options.setExperimentalOption("debuggerAddress", chromeDebuggerAddress);
logger.info("启用chrome调试模式--debuggerAddress:" + chromeDebuggerAddress);
} else {
if (Boolean.parseBoolean(chromeHeadless)) {
options.addArguments("--headless");
options.addArguments("--window-size=" + screenWidthHeight());
logger.info("启用chrome无头模式--headless");
} else {
//options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("no-default-browser-check");
options.addArguments("–disable-popup-blocking");
options.addArguments("--disable-notifications");
options.addArguments("--start-maximized");
options.setExperimentalOption("useAutomationExtension", false);
options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
Map<String, Object> prefs = new HashMap<>();
prefs.put("profile.default_content_setting_values.notifications", 2);
prefs.put("credentials_enable_service", false);
prefs.put("profile.password_manager_enabled", false);
prefs.put("profile.default_content_settings.popups", 0);
prefs.put("download.default_directory", "D:\\");
options.setExperimentalOption("prefs", prefs);
}
}
ChromeDriverService service = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(System.getProperty("user.dir") + "/webdriver/" + driverName))
.usingAnyFreePort()
.build();
try {
WebDriver driver = new ChromeDriver(service, options);
webTopOffset = 70;
return driver;
} catch (Exception e) {
logger.error("新建一个ChromeDriver 失败。", e);
throw new IllegalArgumentException("新建一个ChromeDriver 失败!");
}
}
private static WebDriver initFirefoxDriver() {
System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir") + "/webdriver/" + driverName);
WebDriver driver = new FirefoxDriver();
return driver;
}
private static WebDriver init360Driver() {
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/webdriver/" + driverName);
ChromeOptions options = new ChromeOptions();
// 设置浏览器路径
options.setBinary(browserPath);
WebDriver driver = new ChromeDriver(options);
// 网页顶部到显示器顶部的距离
webTopOffset = 97;
return driver;
}
private static WebDriver initQiAnXinDriver() {
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/webdriver/" + driverName);
ChromeOptions options = new ChromeOptions();
// 关闭提示语:Chrome正在受到自动软件的控制。
options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
// 关闭提示语:是否允许通知,保存密码 。
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_setting_values.notifications", 2); // 2禁用通知
prefs.put("credentials_enable_service", false);// 禁用保存密码
prefs.put("profile.password_manager_enabled", false);// 禁用保存密码
prefs.put("profile.default_content_settings.popups", 0);// 0屏蔽弹窗, 1开启
prefs.put("download.default_directory", "D:\\");// 设置文件下载路径
options.setExperimentalOption("prefs", prefs);
// 设置浏览器路径
options.setBinary(browserPath);
WebDriver driver = new ChromeDriver(options);
// 网页顶部到显示器顶部的距离
webTopOffset = 70;
return driver;
}
private static WebDriver initEdgeDriver() {
System.setProperty("webdriver.edge.driver", System.getProperty("user.dir") + "/webdriver/" + driverName);
WebDriver driver = new EdgeDriver();
// 网页顶部到显示器顶部的距离,用于点击坐标(x,y)使用
webTopOffset = 114;
return driver;
}
/** 从配置文件中读取浏览器名称 远程地址 **/
public static WebDriver remoteWebDriver() {
processors();
screenWidthHeight();
readConfigFile();
if (remoteHubAddress == null || remoteHubAddress.trim().isEmpty()) {
throw new IllegalArgumentException("参数未填写remoteWebDriver.remoteHubAddress。请检查配置文件webdriver\\config.properties!");
}
if (browserName == null || browserName.trim().isEmpty()) {
throw new IllegalArgumentException("参数未填写auto.test.browserName。请检查配置文件webdriver\\config.properties!");
}
System.out.println(">>>开始启动selenium grid 分布式测试。。。");
System.out.println("配置的浏览器名称: " + browserName);
switch (BrowsersType.valueOf(browserName.toUpperCase())) {
case CHROME:
case _360:
case QIANXIN:
return initGridChromeDriver();
case EDGE:
return initGridEdgeDriver();
default:
throw new IllegalArgumentException("浏览器名称错误,请检查配置文件!");
}
}
/** selenium grid 分布式webdriver Chrome **/
public static WebDriver initGridChromeDriver() {
ChromeOptions chromeOptions = new ChromeOptions();
DesiredCapabilities chromeCap = DesiredCapabilities.chrome();
// 设置浏览器分辨率
String window_size = screenWidthHeight(); // 1920,1080
chromeOptions.addArguments("--window-size=" + window_size);
// 关闭提示语:Chrome正在受到自动软件的控制。
chromeOptions.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
// 关闭提示语:是否允许通知,保存密码。
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_setting_values.notifications", 2); // 2禁用通知
prefs.put("credentials_enable_service", false);// 禁用保存密码
prefs.put("profile.password_manager_enabled", false);// 禁用保存密码
chromeOptions.setExperimentalOption("prefs", prefs);
// 设置浏览器路径
chromeOptions.setBinary(browserPath);
// 装载chromeOptions参数
chromeCap.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
// 解决org.openqa.selenium.UnhandledAlertException:unexpected alert open:
chromeCap.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
// 匹配节点属性 系统-浏览器-版本号
chromeCap.setPlatform(Platform.ANY);
chromeCap.setBrowserName("chrome");
chromeCap.setVersion("");
WebDriver driver = null;
try {
driver = new RemoteWebDriver(new URL(remoteHubAddress), chromeCap);
// 获取实际执行的节点机nodeSession
String driverInfoString = driver.toString();
String nodeSession = driverInfoString.substring(driverInfoString.indexOf("(") + 1,
driverInfoString.indexOf(")"));
System.out.println("Node节点ID:" + nodeSession);
// 在Hub上执行接口,获取节点机的IP
String hupIpAddress = remoteHubAddress.split("/wd/hub")[0];
String httpUrl = hupIpAddress + "/grid/api/testsession?session=" + nodeSession;
String nodeInfo = doGet(httpUrl);
if (nodeInfo == null) {
System.out.println("节点机IP:" + remoteHubAddress);
} else {
System.out.println("doGet(httpUrl):" + httpUrl);
System.out.println(decodeUnicode(nodeInfo));
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
return driver;
}
/** selenium grid 分布式webdriver Edge **/
public static WebDriver initGridEdgeDriver() {
EdgeOptions edgeOptions = new EdgeOptions();
// 匹配节点属性 系统-浏览器-版本号
edgeOptions.setCapability(CapabilityType.PLATFORM_NAME, Platform.WINDOWS);
edgeOptions.setCapability(CapabilityType.BROWSER_NAME, BrowserType.EDGE);
edgeOptions.setCapability(CapabilityType.VERSION, "99.0.1150.36");
WebDriver driver = null;
try {
driver = new RemoteWebDriver(new URL(remoteHubAddress), edgeOptions);
// 获取实际执行的节点机nodeSession
String driverInfoString = driver.toString();
String nodeSession = driverInfoString.substring(driverInfoString.indexOf("(") + 1,
driverInfoString.indexOf(")"));
System.out.println("Node节点ID:" + nodeSession);
// 在Hub上执行接口,获取节点机的IP
String hupIpAddress = remoteHubAddress.split("/wd/hub")[0];
String httpUrl = hupIpAddress + "/grid/api/testsession?session=" + nodeSession;
String nodeInfo = doGet(httpUrl);
if (nodeInfo == null) {
System.out.println("节点机IP:" + remoteHubAddress);
} else {
System.out.println("doGet(httpUrl):" + httpUrl);
System.out.println(decodeUnicode(nodeInfo));
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
return driver;
}
/** 对浏览器全屏截图 */
public static void takesScreenshot(File desFile) {
try {
TakesScreenshot srcShot = (TakesScreenshot) threadLocal.get();
File srcFile = srcShot.getScreenshotAs(OutputType.FILE);
FileHandler.copy(srcFile, desFile);
} catch (IOException e) {
e.printStackTrace();
}
}
/** 输出日志到文件 */
public void sysSetOutToFile() {
File logFile = new File("PrintOutPutLog.log");
try {
// 当logFile存在时,则会先清零,再开始写入。使用true参数可以保留原内容。
PrintStream logPrintStream = new PrintStream(new FileOutputStream(logFile, true));
System.setOut(logPrintStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void sysSetOutToFile(String filePath) {
File logFile = new File(filePath);
try {
// 当logFile存在时,则会先清零,再开始写入。使用true参数可以保留原内容。
PrintStream logPrintStream = new PrintStream(new FileOutputStream(logFile, true));
System.setOut(logPrintStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
PrintStream out = System.out;
/** ·关闭输出日志到文件,重定向到控制台。 **/
public void sysSetOutToConsole() {
System.setOut(out);
}
/** 显示器分辨率 **/
public static String screenWidthHeight() {
int screenWidth = ((int) java.awt.Toolkit.getDefaultToolkit().getScreenSize().width);
int screenHeight = ((int) java.awt.Toolkit.getDefaultToolkit().getScreenSize().height);
logger.info("显示器分辨率:"+screenWidth + " " + screenHeight);
return screenWidth + "," + screenHeight;
}
/** cpu核数 **/
public static int processors() {
int num = Runtime.getRuntime().availableProcessors();
logger.info("cpu核数:" + num);
return num;
}
// get请求获取node ip
public static String doGet(String httpUrl) {
HttpURLConnection connection = null;
InputStream is = null;
BufferedReader br = null;
String result = null;
try {
URL url = new URL(httpUrl);
// 打开一个连接
connection = (HttpURLConnection) url.openConnection();
// 请求类型
connection.setRequestMethod("GET");
// 连接超时时间15000毫秒
connection.setConnectTimeout(10000);
// 远程返回超时时间60000毫秒
connection.setReadTimeout(10000);
// 发送请求
connection.connect();
// 获取输入流
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 指定字符集
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
// 存放数据
StringBuffer sbf = new StringBuffer();
String temp = null;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (null != br) {
br.close();
}
if (null != is) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
// 关闭远程连接
connection.disconnect();
}
return result;
}
// 解码 "proxyId": "http:\u002f\u002f192.168.5.224:5556"
static final Pattern reUnicode = Pattern.compile("\\\\u([0-9a-zA-Z]{4})");
public static String decodeUnicode(String unicodeStr) {
if ("".equals(unicodeStr) || unicodeStr == null) {
return "decodeUnicode(String unicodeStr),传入的参数是空。";
}
Matcher m = reUnicode.matcher(unicodeStr);
StringBuffer sb = new StringBuffer(unicodeStr.length());
while (m.find()) {
m.appendReplacement(sb, Character.toString((char) Integer.parseInt(m.group(1), 16)));
}
m.appendTail(sb);
return sb.toString();
}
}
*构造一个selenium自动化测试,初始化driver的类文件。
*测试用例直接引用公共方法getThreadLocalDriver(),即可获得线程独立的driver副本。所以支持testng的并发测试。也支持多线程executorService.submit()执行测试用例。