selenium driver初始化

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()执行测试用例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值