diff --git a/src/main/java/pres/auxiliary/work/selenium/brower/ChromeBrower.java b/src/main/java/pres/auxiliary/work/selenium/brower/ChromeBrower.java index 1d16704..897409b 100644 --- a/src/main/java/pres/auxiliary/work/selenium/brower/ChromeBrower.java +++ b/src/main/java/pres/auxiliary/work/selenium/brower/ChromeBrower.java @@ -2,7 +2,6 @@ package pres.auxiliary.work.selenium.brower; import java.io.File; import java.util.HashMap; -import java.util.HashSet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; @@ -45,18 +44,25 @@ public class ChromeBrower extends AbstractBrower { /** * 用于存储需要对浏览器进行配置的参数 */ - HashSet chromeConfigSet = new HashSet(); +// HashSet chromeConfigSet = new HashSet(); + /** + * 用于存储谷歌浏览器个性化配置 + */ + HashMap chromePrefsMap = new HashMap(16); + /** + * 用于存储谷歌浏览器对手机的配置 + */ + HashMap mobileEmulationMap = new HashMap(16); + /** + * 用于指向当前配置中是否已打开控制当前浏览器模式 + */ + boolean isContralOpenBrower = false; + /** * 用于对谷歌浏览器的配置 */ ChromeOptions chromeOption = new ChromeOptions(); - /** - * 存储谷歌可执行文件路径 - */ - File binaryFile; - - /** * 指定驱动文件路径并添加一个待测站点 * @@ -96,7 +102,22 @@ public class ChromeBrower extends AbstractBrower { */ public void addConfig(ChromeOptionType chromeOptionType, Object value) { chromeOptionType.setValue(value); - chromeConfigSet.add(chromeOptionType); + addConfig(chromeOptionType); + } + + /** + * 用于向浏览器中添加谷歌浏览器允许设置的个性化配置。如若设置启动的浏览器不弹出窗口,则可以 + * 按照以下配置:
+ * key = profile.managed_default_content_settings.popups
+ * value = 2 + * + * @param key 配置在浏览器对应的键值 + * @param value 其配置对应的传参 + */ + public void addPersonalityConfig(String key, Object value) { + chromePrefsMap.put(key, value); + chromeOption.setExperimentalOption("prefs", chromePrefsMap); + getConfigJsonArray().add(key); } /** @@ -105,7 +126,7 @@ public class ChromeBrower extends AbstractBrower { * @param chromeOptionType 浏览器配置枚举({@link ChromeOptionType}枚举类) */ public void addConfig(ChromeOptionType chromeOptionType) { - chromeConfigSet.add(chromeOptionType); + browerConfig(chromeOptionType); } /** @@ -120,42 +141,31 @@ public class ChromeBrower extends AbstractBrower { * @param path 浏览器执行路径 */ public void setBinary(File path) { - this.binaryFile = path; + chromeOption.setBinary(path); driver = null; } /** - * 用于移除相应的浏览器配置 - * - * @param chromeOptionType 需要移除的浏览器配置 + * 清空所有的配置,调用该方法后等同于重新构造{@link ChromeOptions}类对象 */ - public void removeConfig(ChromeOptionType chromeOptionType) { - chromeConfigSet.remove(chromeOptionType); + public void clearConfig() { + chromePrefsMap.clear(); + mobileEmulationMap.clear(); + chromeOption = new ChromeOptions(); } /** - * 清空所有的配置 + * 用于返回谷歌浏览器的配置,可通过此方法,获取到{@link ChromeOptions}对象后,在 + * 外部对浏览器进行配置 + * @return 谷歌浏览器的配置 */ - public void clearConfig() { - chromeConfigSet.clear(); + public ChromeOptions getConfig() { + return chromeOption; } @Override void openBrower() { - //判断是否存在浏览器启动路径 - if (binaryFile != null) { - chromeOption.setBinary(binaryFile); - } - //判断是否存在配置 - if (chromeConfigSet.size() != 0) { - browerConfig(); - } driver = new ChromeDriver(chromeOption); - - // 添加操作信息 - informationJson.put("浏览器名称", ((ChromeDriver) driver).getCapabilities().getBrowserName()); - informationJson.put("浏览器版本", ((ChromeDriver) driver).getCapabilities().getVersion()); - informationJson.put("操作系统版本", System.getProperties().getProperty("os.name")); } @Override @@ -165,62 +175,70 @@ public class ChromeBrower extends AbstractBrower { /** * 用于将配置添加至浏览器中 + * @param configType */ - void browerConfig() { - // 用于存储浏览器的配置信息 - JSONArray configJsonArray = new JSONArray(); - - //若配置中存在控制已打开的浏览器,则直接添加相应的配置,并结束方法,否则会报错 - if (chromeConfigSet.contains(ChromeOptionType.CONTRAL_OPEN_BROWER)) { - chromeOption.setExperimentalOption(ChromeOptionType.CONTRAL_OPEN_BROWER.getKey(), String.valueOf(ChromeOptionType.CONTRAL_OPEN_BROWER.getValue())); + void browerConfig(ChromeOptionType configType) { + //若已打开控制启动的浏览器配置,则所有配置将不再生效 + if (isContralOpenBrower) { return; } - // 用于存储谷歌浏览器个性化配置 - HashMap chromePrefs = new HashMap(16); - // 用于存储谷歌浏览器对手机的配置 - HashMap mobileEmulation = new HashMap(16); - + JSONArray configJsonArray = getConfigJsonArray(); + + //若当前配置为控制已开启的浏览器,则清空之前的配置,以避免调用报错 + if (configType == ChromeOptionType.CONTRAL_OPEN_BROWER) { + clearConfig(); + chromeOption.setExperimentalOption(ChromeOptionType.CONTRAL_OPEN_BROWER.getKey(), String.valueOf(ChromeOptionType.CONTRAL_OPEN_BROWER.getValue())); + isContralOpenBrower = true; + } + // 遍历所有的chromeConfigSet,对浏览器进行相应的设置 - for (ChromeOptionType configType : chromeConfigSet) { - // 根据设置的类型来指定使用哪种方法 - // 0表示使用addArguments(启动配置项)配置 - // 1表示setExperimentalOption(个性化配置)需要存储至map的配置 - // 2表示setExperimentalOption(个性化配置)不需要存储至map的配置 - // 3表示使用addArguments(启动配置项)配置,但需要拼接参数 - switch (configType.getOptionType()) { - case 0: - chromeOption.addArguments(configType.getKey()); - //添加信息 - configJsonArray.add(configType.getName()); - break; - case 1: - chromePrefs.put(configType.getKey(), configType.getValue()); - configJsonArray.add(configType.getName()); - break; - case 2: - chromeOption.setExperimentalOption(configType.getKey(), String.valueOf(configType.getValue())); - configJsonArray.add(configType.getName() + (configType.getValue() == null ? "" : String.valueOf(configType.getValue()))); - break; - case 3: - // 拼接内容 - chromeOption.addArguments(configType.getKey() + String.valueOf(configType.getValue())); - configJsonArray.add(configType.getName() + (configType.getValue() == null ? "" : String.valueOf(configType.getValue()))); - break; - default: - throw new IllegalArgumentException("错误的类型: " + configType.getOptionType()); - } + // 根据设置的类型来指定使用哪种方法 + // 0表示使用addArguments(启动配置项)配置 + // 1表示setExperimentalOption(个性化配置)需要存储至map的配置 + // 2表示setExperimentalOption(个性化配置)不需要存储至map的配置 + // 3表示使用addArguments(启动配置项)配置,但需要拼接参数 + switch (configType.getOptionType()) { + case 0: + chromeOption.addArguments(configType.getKey()); + //添加信息 + configJsonArray.add(configType.getName()); + break; + case 1: + chromePrefsMap.put(configType.getKey(), configType.getValue()); + chromeOption.setExperimentalOption("prefs", chromePrefsMap); + configJsonArray.add(configType.getName()); + break; + case 2: + chromeOption.setExperimentalOption(configType.getKey(), String.valueOf(configType.getValue())); + configJsonArray.add(configType.getName() + (configType.getValue() == null ? "" : String.valueOf(configType.getValue()))); + break; + case 3: + // 拼接内容 + chromeOption.addArguments(configType.getKey() + String.valueOf(configType.getValue())); + configJsonArray.add(configType.getName() + (configType.getValue() == null ? "" : String.valueOf(configType.getValue()))); + break; + default: + throw new IllegalArgumentException("错误的类型: " + configType.getOptionType()); } // 添加配置 - chromeOption.setExperimentalOption("prefs", chromePrefs); - chromeOption.setExperimentalOption("mobileEmulation", mobileEmulation); - - // 添加配置信息 - informationJson.put("浏览器配置", configJsonArray); +// chromeOption.setExperimentalOption("mobileEmulation", mobileEmulationMap); return; } + + /** + * 用于返回配置信息集合 + * @return 配置信息集合 + */ + JSONArray getConfigJsonArray() { + // 添加配置信息 + if (!informationJson.containsKey("浏览器配置")) { + informationJson.put("浏览器配置", new JSONArray()); + } + return informationJson.getJSONArray("浏览器配置"); + } /** *

@@ -238,7 +256,7 @@ public class ChromeBrower extends AbstractBrower { * * @author 彭宇琦 * @version Ver1.0 - * @since JDK 12 + * @since JDK 1.8 * */ public enum ChromeOptionType { diff --git a/src/test/java/pres/auxiliary/work/selenium/brower/ChromeBrowerTest.java b/src/test/java/pres/auxiliary/work/selenium/brower/ChromeBrowerTest.java index 04e5b8b..0dba9e4 100644 --- a/src/test/java/pres/auxiliary/work/selenium/brower/ChromeBrowerTest.java +++ b/src/test/java/pres/auxiliary/work/selenium/brower/ChromeBrowerTest.java @@ -26,7 +26,7 @@ public class ChromeBrowerTest { /** * 指向driver文件 */ - private final File driverFile = new File("Resource/BrowersDriver/Chrom/78.0394.70/chromedriver.exe"); + private final File driverFile = new File("Resource/BrowersDriver/Chrom/86.0.4240.22/chromedriver.exe"); /** * 指向浏览器对象 @@ -39,6 +39,7 @@ public class ChromeBrowerTest { @AfterClass(alwaysRun = true) public void quit() { System.out.println(cb.getAllInformation()); + System.out.printf("输入任意字符继续:"); Scanner sc = new Scanner(System.in); sc.next(); cb.closeBrower(); @@ -82,7 +83,7 @@ public class ChromeBrowerTest { cb.addConfig(ChromeOptionType.DONOT_LOAD_JS); //不允许弹窗 cb.addConfig(ChromeOptionType.DONOT_POPUPS); - //全屏启动 + //无头浏览器启动 cb.addConfig(ChromeOptionType.HEADLESS); cb.getDriver(); @@ -139,7 +140,6 @@ public class ChromeBrowerTest { public void sendKey() { cb = new ChromeBrower(new File("Resource/BrowersDriver/Chrom/83.0.4103.39/chromedriver.exe")); - //1027*768的分辨率启动 cb.addConfig(ChromeOptionType.CONTRAL_OPEN_BROWER, "127.0.0.1:9222"); cb.getDriver().findElement(By.id("kw")).sendKeys(Keys.CONTROL, "vfffsdfg"); show(Keys.CONTROL, "vfffsdfg");