WebDriverUtil.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package com.zoomwin.utils;
  2. import com.zoomwin.api.EnvironmentType;
  3. import com.zoomwin.enums.BrowserType;
  4. import io.github.bonigarcia.wdm.WebDriverManager;
  5. import org.openqa.selenium.WebDriver;
  6. import org.openqa.selenium.chrome.ChromeDriver;
  7. import org.openqa.selenium.chrome.ChromeOptions;
  8. import org.openqa.selenium.edge.EdgeDriver;
  9. import org.openqa.selenium.edge.EdgeOptions;
  10. import org.openqa.selenium.firefox.FirefoxDriver;
  11. import org.openqa.selenium.firefox.FirefoxOptions;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import java.time.Duration;
  15. public class WebDriverUtil {
  16. private static final Logger logger = LoggerFactory.getLogger(WebDriverUtil.class);
  17. // 配置无头模式 浏览器大小常量,避免重复
  18. private static final String HEADLESS_OPTION = "--headless";
  19. private static final String NO_SANDBOX = "--no-sandbox";
  20. private static final String DISABLE_DEV_SHM_USAGE = "--disable-dev-shm-usage";
  21. private static final String WINDOW_SIZE_OPTION = "--window-size=1920x1080";
  22. // 隐式等待时间,读取配置文件
  23. private static final int implicitWait;
  24. private static final boolean headless;
  25. // 使用 ThreadLocal 管理 WebDriver,保证线程安全
  26. private static final ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<>();
  27. static {
  28. int tempWait;
  29. try {
  30. tempWait = Integer.parseInt(PropertiesUtil.getProperty("driver.implicit.wait", "10"));
  31. } catch (NumberFormatException e) {
  32. tempWait = 10; // 配置值无效时,使用默认值
  33. logger.info("The driver implicity wait value in the configuration file is invalid. The default value is used: {}", tempWait);
  34. }
  35. implicitWait = tempWait;
  36. // 读取 headless 配置项 若没有该项,则默认值为 false
  37. String headlessProperty = PropertiesUtil.getProperty("driver.headless", "false").trim();
  38. // 如果配置为空或为 "false"(不区分大小写),则设置为 false;如果为 "true",则设置为 true
  39. headless = headlessProperty.equalsIgnoreCase("true");
  40. logger.info("无头模式配置: {}", headless ? "启用" : "禁用");
  41. }
  42. // 初始化 WebDriver
  43. public static WebDriver getDriver(BrowserType browserType) {
  44. if (threadLocalDriver.get() == null) {
  45. WebDriver driver = createDriver(browserType);
  46. configureDriver(driver);
  47. threadLocalDriver.set(driver);
  48. }
  49. return threadLocalDriver.get();
  50. }
  51. // 关闭 WebDriver 并清理线程资源
  52. public static void quitDriver() {
  53. WebDriver driver = threadLocalDriver.get();
  54. if (driver != null) {
  55. driver.quit();
  56. threadLocalDriver.remove();
  57. }
  58. }
  59. // 创建 WebDriver 实例
  60. private static WebDriver createDriver(BrowserType browserType) {
  61. WebDriver driver;
  62. switch (browserType) {
  63. case CHROME:
  64. WebDriverManager.chromedriver().setup();
  65. ChromeOptions chromeOptions = new ChromeOptions();
  66. if (headless) {
  67. chromeOptions.addArguments(HEADLESS_OPTION); // 启用无头模式
  68. chromeOptions.addArguments(WINDOW_SIZE_OPTION); // 设置窗口大小
  69. //chromeOptions.addArguments(NO_SANDBOX); // 启用无头模式
  70. //chromeOptions.addArguments(DISABLE_DEV_SHM_USAGE); // 启用无头模式
  71. }
  72. driver = new ChromeDriver(chromeOptions);
  73. logger.info("CHROME browser started successfully, opening the website...");
  74. break;
  75. case FIREFOX:
  76. WebDriverManager.firefoxdriver().setup();
  77. FirefoxOptions firefoxOptions = new FirefoxOptions();
  78. if (headless) {
  79. firefoxOptions.addArguments(HEADLESS_OPTION); // 启用无头模式
  80. firefoxOptions.addArguments(WINDOW_SIZE_OPTION); // 设置窗口大小
  81. //firefoxOptions.addArguments(NO_SANDBOX); // 启用无头模式
  82. //firefoxOptions.addArguments(DISABLE_DEV_SHM_USAGE); // 启用无头模式
  83. }
  84. driver = new FirefoxDriver(firefoxOptions);
  85. logger.info("FIREFOX browser started successfully, opening the website...");
  86. break;
  87. case EDGE:
  88. WebDriverManager.edgedriver().setup();
  89. EdgeOptions edgeOptions = new EdgeOptions();
  90. if (headless) {
  91. edgeOptions.addArguments(HEADLESS_OPTION); // 引用常量
  92. edgeOptions.addArguments(WINDOW_SIZE_OPTION); // 引用常量
  93. //edgeOptions.addArguments(NO_SANDBOX); // 启用无头模式
  94. //edgeOptions.addArguments(DISABLE_DEV_SHM_USAGE); // 启用无头模式
  95. }
  96. driver = new EdgeDriver(edgeOptions);
  97. logger.info("EDGE browser started successfully, opening the website...");
  98. break;
  99. default:
  100. throw new IllegalArgumentException("Unsupported browser types: " + browserType);
  101. }
  102. return driver;
  103. }
  104. // 配置 WebDriver 通用设置
  105. private static void configureDriver(WebDriver driver) {
  106. driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(implicitWait));
  107. driver.manage().window().maximize();
  108. String url = EnvironmentType.getUrlByType(EnvironmentType.TEST); // 读取环境 URL
  109. driver.get(url);
  110. logger.info("Open URL: " + url);
  111. }
  112. }