diff --git a/Resource/BrowersDriver/chromedriver.exe b/Resource/BrowersDriver/chromedriver.exe index 6ab0ba9..d419a51 100644 Binary files a/Resource/BrowersDriver/chromedriver.exe and b/Resource/BrowersDriver/chromedriver.exe differ diff --git a/src/main/java/pres/auxiliary/selenium/browers/AbstractBrower.java b/src/main/java/pres/auxiliary/selenium/browers/AbstractBrower.java index 2815eab..f43f71f 100644 --- a/src/main/java/pres/auxiliary/selenium/browers/AbstractBrower.java +++ b/src/main/java/pres/auxiliary/selenium/browers/AbstractBrower.java @@ -5,11 +5,14 @@ import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; /** - * 该类定义启动浏览器时必要的方法以及打开浏览器,创建WebDriver对象的操作,由新添加的各个浏览器子类可进行继承 - * + *

文件名:AbstractBrower.java

+ *

用途:该类定义启动浏览器时必要的方法以及打开浏览器,创建WebDriver对象的操作,由新添加的各个浏览器子类可进行继承

+ *

编码时间:2020年4月6日 下午3:01:06

+ *

修改时间:2020年4月6日 下午3:01:06

* @author 彭宇琦 - * @version Ver1.1 - * + * @version Ver1.0 + * @since JDK 12 + * @since selenium 3.0.0 */ public abstract class AbstractBrower { /** diff --git a/src/main/java/pres/auxiliary/work/selenium/browers/AbstractBrower.java b/src/main/java/pres/auxiliary/work/selenium/browers/AbstractBrower.java new file mode 100644 index 0000000..6f5fd85 --- /dev/null +++ b/src/main/java/pres/auxiliary/work/selenium/browers/AbstractBrower.java @@ -0,0 +1,330 @@ +package pres.auxiliary.work.selenium.browers; + +import java.io.File; +import java.util.HashMap; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; + +import com.alibaba.fastjson.JSONObject; + +import pres.auxiliary.selenium.browers.PageNotFoundException; + +/** + * 该类定义启动浏览器时必要的方法以及打开浏览器,创建WebDriver对象的操作,由新添加的各个浏览器子类可进行继承 + * + * @author 彭宇琦 + * @version Ver1.1 + * + */ +public abstract class AbstractBrower { + /** + * 用于接收用户需要进入的网站 + */ + String url = ""; + /** + * 用于接收浏览器启动所需的文件路径 + */ + File driverFile; + /** + * 存储页面加载等待时间 + */ + int loadTime = 120; + /** + * 用于存储目标站点的title + */ + String assertTitle = ""; + /** + * 用于存储页面自动刷新的次数,默认为0次 + */ + int rafreshCount = 0; + /** + * 用于存储获取到的浏览器对象 + */ + WebDriver driver = null; + /** + * 存储浏览器的设置内容,key表示浏览器设置的属性;value表示设置的内容 + */ + HashMap browerSetMap = new HashMap(); + + /** + * 构造浏览器对象,并指定驱动文件及待测站点 + * + * @param driberFile 驱动文件对象 + * @param url 待测站点 + */ + public AbstractBrower(File driberFile, String url) { + this.driverFile = driberFile; + this.url = url; + + //TODO 初始化浏览器对应的基本信息,并在其他的方法中添加 + } + + /** + * 该方法用于返回当前站点的url,若当前未调用{@link #getDriver()}方法或浏览器启动失败时返回当前设置的待测站点 + * + * @return 返回当前站点的url或设置的待测站点 + */ + public String getUrl() { + if (driver == null) { + return url.toString(); + } else { + return driver.getCurrentUrl(); + } + } + + /** + * 该方法用于打开新的站点,当待测站点与原站点不同时,则根据传入的openNewLabel参数,则以以下方式进入站点: + * + * 注意:若未生成WebDriver对象时(即未调用{@link #getDriver()}方法时),该方法仅更改待测站点。执行该方法后,其 + * WebDriver对象将切换至新的标签页上 + * + * @param url 站点域名 + * @param openNewLabel 是否打开新的标签页 + */ + public void openUrl(String url, boolean openNewLabel) { + // 若未生成WebDriver对象,则只做设置 + if (driver == null) { + this.url = url; + return; + } + + if (openNewLabel) { + openNewLabelPage(url); + } else { + overridePage(url); + } + } + + /** + * 该方法用于设置目标站点的title,以便进行链接是否正确的判断 + * + * @param pageTitle 设置的目标站点title + */ + public void setAssertTitle(String assertTitle) { + this.assertTitle = assertTitle; + } + + /** + * 该方法用于设置页面等待时间,单位为秒 + * + * @param LoadTime 传入的时间 + */ + public void setLoadTime(int loadTime) { + this.loadTime = loadTime; + } + + /** + * 该方法用于设置页面的自动刷新次数,当设置该值后则开启自动刷新 + * + * @param rafreshCount 自动刷新的次数 + */ + public void setRafreshCount(int rafreshCount) { + this.rafreshCount = rafreshCount; + } + + /** + * 该方法用于启动浏览器,并返回WebDriver对象 + * + * @return 指向浏览器的WebDriver对象 + */ + public abstract WebDriver getDriver(); + + /** + * 获取浏览器的名称 + * + * @return 浏览器名称 + */ +// public abstract String getBrowerName(); + + /** + * 获取浏览器版本 + * + * @return 浏览器版本 + */ +// public abstract String getBrowerVersion(); + + /** + * 获取操作系统信息 + * + * @return 操作系统信息 + */ +// public abstract String getSystemInformation(); + + public HashMap getAllInformation() { + return + } + + /** + * 用于返回浏览器的各项信息 + * @param key + * @return + */ + public abstract String getInformation(String key); + + /** + * 用于重启浏览器,若未生成WebDriver对象时(即未调用{@link #getDriver()}方法时),则方法调用无效 + */ + public void initialization() { + if (driver != null) { + driver.quit(); + driver = null; + getDriver(); + } + } + + /** + * 用于刷新当前页面,若未生成WebDriver对象时(即未调用{@link #getDriver()}方法时),则方法调用无效 + */ + public void refreshPage() { + if (driver != null) { + driver.navigate().refresh(); + } + } + + /** + * 用于关闭当前标签,若只存在一个标签时,则关闭浏览器,以保证进程能被完全浏览器驱动能被释放 + */ + public void closeLabel() { + if (driver.getWindowHandles().size() == 1) { + driver.quit(); + } else { + driver.close(); + } + } + + /** + * 用于关闭浏览器 + */ + public void closeBrower() { + driver.quit(); + } + + /** + * 该方法用于对浏览器的一系列操作,包括全屏浏览器,跳转相应的站点,等待页面加载以及自动刷新, + * 使用该方法时会抛出两个运行时异常,分别为IncorrectPageTitleException和PageNotFoundException + * + * @param driver 通过start()方法创建的WebDriver对象 + * @return 返回对浏览器进行操作后的得到的WebDriver对象 + * @throws IncorrectPageTitleException 页面title与设置的title不一致时抛出的异常 + * @throws PageNotFoundException 页面加载失败时抛出的异常 + */ + protected WebDriver oprateBrower(WebDriver driver) { + // 将设置的自动刷新次数存储在临时变量中,并加上1 + // 加1的目的是自动刷新判断是用do...while循环实现,若不事先加上1在会导致循环少1次 + int rafresh = rafreshCount + 1; + + String errorTitle = "页面载入出错"; + + // 进入站点 + driver.get(url); + // 全屏浏览器 + driver.manage().window().maximize(); + + // 循环执行页面加载判断,判断其是否加载出目标站点,若加载出来页面,则结束循环,若用户设置的自动刷新次数循环完还没加载出页面,则 + // 抛出PageNotFoundException异常。页面加载判断必须读取一次,所以使用do...while循环 + do { + // 读取并设置浏览器等待时间 + driver.manage().timeouts().pageLoadTimeout(loadTime, TimeUnit.SECONDS); + + // 判断进入站点后页面的title是否为“页面载入出错”,若为该title,则刷新页面,重新加载 + // 注意,在火狐浏览器中凡是加载不出的页面,其页面title都是“页面载入出错”,所以该方法只适用于火狐浏览器 + if (errorTitle.equals(driver.getTitle())) { + // 将刷新次数减1 + rafresh--; + // 刷新网页 + driver.navigate().refresh(); + // 不执行后续代码,继续循环 + continue; + } + + // 若页面加载成功,则判断加载的页面是否与用户设置的一致,若用户未设置目标站点的title,则跳过判断 + // 判断pageTitle中存储的信息是否为空,若不为空则再判断页面的title是否与设置的title一致,若不一致,则抛出IncorrectPageTileException + if (!assertTitle.toString().equals("") && !driver.getTitle().equals(assertTitle.toString())) { + continue; + } + + // 若页面能正常加载,置空pageTitle并返回WebDriver对象 + assertTitle = ""; + return driver; + + // 判断的条件刷新次数rafresh为0时则结束循环 + } while (rafresh != 0); + + // 若循环结束,则说明页面无法正常加载,则置空pageTitle,抛出PageNotFountException + assertTitle = ""; + throw new IncorrectPageTitleException("页面载入出错"); + } + + /** + * 用于新增一个标签页,并打开指定站点 + * + * @param url 指定的站点 + */ + void openNewLabelPage(String url) { + // 获取当前所有的handle + Set handleSet = driver.getWindowHandles(); + // 编写js脚本,执行js,以开启一个新的标签页 + String js = "window.open(\"" + url + "\");"; + ((JavascriptExecutor) driver).executeScript(js); + // 移除原有的windows的Handle,保留新打开的windows的Handle + String newHandle = ""; + for (String handle : driver.getWindowHandles()) { + if (!handleSet.contains(handle)) { + newHandle = handle; + break; + } + } + // 切换WebDriver + driver.switchTo().window(newHandle); + } + + /** + * 用于在原标签页中打开站点 + * + * @param url 指定的站点 + */ + void overridePage(String url) { + driver.get(url); + } + + /** + *

文件名:AbstractBrower.java

+ *

用途:用于对浏览器特殊设置的字段说明

+ *

编码时间:2020年4月7日 下午9:38:46

+ *

修改时间:2020年4月7日 下午9:38:46

+ * @author 彭宇琦 + * @version Ver1.0 + * @since JDK 12 + */ + class BrowerSetField { + /** + * 存储key的名称 + */ + public String keyName; + /** + * 存储key值 + */ + public String key; + /** + * 存储相应的设置值 + */ + public String value; + /** + * 初始化字段值 + * @param keyName key的名称 + * @param key key值 + * @param value 存储相应的设置值 + */ + public BrowerSetField(String keyName, String key, String value) { + this.keyName = keyName; + this.key = key; + this.value = value; + } + } +} diff --git a/src/main/java/pres/auxiliary/work/selenium/browers/IncorrectPageTitleException.java b/src/main/java/pres/auxiliary/work/selenium/browers/IncorrectPageTitleException.java new file mode 100644 index 0000000..356f325 --- /dev/null +++ b/src/main/java/pres/auxiliary/work/selenium/browers/IncorrectPageTitleException.java @@ -0,0 +1,39 @@ +package pres.auxiliary.work.selenium.browers; + +/** + * 该异常在目标站点Title与设置的目标站点Title不一致的情况下抛出的异常,继承于RuntimeException + * + * @author 彭宇琦 + * @version Ver1.0 + */ +public class IncorrectPageTitleException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public IncorrectPageTitleException() { + super(); + // TODO Auto-generated constructor stub + } + + public IncorrectPageTitleException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + + public IncorrectPageTitleException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + + public IncorrectPageTitleException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public IncorrectPageTitleException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + +} diff --git a/src/main/java/pres/auxiliary/work/testcase/file/CommonTestCaseWrite.java b/src/main/java/pres/auxiliary/work/testcase/file/CommonTestCaseWrite.java index 650ec68..daf74b6 100644 --- a/src/main/java/pres/auxiliary/work/testcase/file/CommonTestCaseWrite.java +++ b/src/main/java/pres/auxiliary/work/testcase/file/CommonTestCaseWrite.java @@ -6,7 +6,7 @@ import java.util.Arrays; /** *

文件名:CommonTestCaseWrite.java

- *

用途:用于

+ *

用途:定义了测试用例中一些基本方法的添加,如添加步骤、预期方法等,使编码时更加直观

*

编码时间:2020年4月5日 下午2:22:20

*

修改时间:2020年4月5日 下午2:22:20

* @author 彭宇琦 diff --git a/src/test/java/pres/auxiliary/work/testcase/file/JiraTestCaseWriteTest.java b/src/test/java/pres/auxiliary/work/testcase/file/JiraTestCaseWriteTest.java index ad07b49..fd8fd74 100644 --- a/src/test/java/pres/auxiliary/work/testcase/file/JiraTestCaseWriteTest.java +++ b/src/test/java/pres/auxiliary/work/testcase/file/JiraTestCaseWriteTest.java @@ -14,6 +14,16 @@ import org.testng.annotations.Test; import pres.auxiliary.work.testcase.file.JiraTestCaseWrite.JiraFieldIdType; import pres.auxiliary.work.testcase.templet.DataListCase; +/** + *

文件名:JiraTestCaseWriteTest.java

+ *

用途:定义了上传至jira中tests的测试用例模板,类中定义了基本的字段枚举,在使用该类编写测试用例时, + * 若需要使用预设的测试用例,则无需设置模板字段与预设用例字段间的关系

+ *

编码时间:2020年4月6日 上午11:35:56

+ *

修改时间:2020年4月6日 上午11:35:56

+ * @author 彭宇琦 + * @version Ver1.0 + * @since JDK 12 + */ public class JiraTestCaseWriteTest { JiraTestCaseWrite wtc; diff --git a/src/test/java/test/selenium/brower/TestOpenNewHandle.java b/src/test/java/test/selenium/brower/TestOpenNewHandle.java new file mode 100644 index 0000000..7cd5512 --- /dev/null +++ b/src/test/java/test/selenium/brower/TestOpenNewHandle.java @@ -0,0 +1,74 @@ +package test.selenium.brower; + +import java.util.Set; + +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class TestOpenNewHandle { + ChromeDriver cd; + + @BeforeClass + public void openBrower() { + System.setProperty("webdriver.chrome.driver", "Resource/BrowersDriver/chromedriver.exe"); + cd = new ChromeDriver(); + } + + @AfterClass + public void quitBrower() throws InterruptedException { + Thread.sleep(5000); + cd.quit(); + } + + /** + * 覆盖原标签页 + * @throws InterruptedException + */ + @Test + public void overridePage() throws InterruptedException { + cd.get("http://www.baidu.com"); + Thread.sleep(2000); + cd.get("http://www.qq.com"); + } + + /** + * 打开新的标签页 + * @throws InterruptedException + */ + @Test + public void openNewLabel() throws InterruptedException { + //获取当前所有的handle + Set handleSet = cd.getWindowHandles(); + //编写js脚本,执行js,以开启一个新的标签页 + String js = "window.open(\"https://www.sogou.com\");"; + cd.executeScript(js); + //移除原有的windows的Handle,保留新打开的windows的Handle + String newHandle = ""; + for (String handle : cd.getWindowHandles()) { + if (!handleSet.contains(handle)) { + newHandle = handle; + break; + } + } + //切换WebDriver + cd.switchTo().window(newHandle); + Thread.sleep(2000); + cd.get("http://www.hao123.com"); + } + + /** + * 打开新的浏览器 + */ + @Test + public void openNewBrower() { + //关闭原有的浏览器 + cd.quit(); + //重新构造,并进入待测站点 + System.setProperty("webdriver.chrome.driver", "Resource/BrowersDriver/chromedriver.exe"); + cd = new ChromeDriver(); + cd.get("http://www.163.com"); + + } +} diff --git a/src/test/java/test/selenium/brower/TestSwitchWindow.java b/src/test/java/test/selenium/brower/TestSwitchWindow.java new file mode 100644 index 0000000..d60b2b1 --- /dev/null +++ b/src/test/java/test/selenium/brower/TestSwitchWindow.java @@ -0,0 +1,51 @@ +package test.selenium.brower; + +import java.util.Set; + +import org.openqa.selenium.chrome.ChromeDriver; + +public class TestSwitchWindow { + + public static void main(String[] args) throws InterruptedException { + TestDriver td = new TestDriver(); + ChromeDriver cd = td.getDriver(); + + td.open(); + + cd.get("http://www.hao123.com");//页面在第二个标签页中被打开 + Thread.sleep(5000); + cd.quit(); + } + + public static class TestDriver { + ChromeDriver cd; + + public TestDriver() { + System.setProperty("webdriver.chrome.driver", "Resource/BrowersDriver/chromedriver.exe"); + cd = new ChromeDriver(); + cd.get("http://www.baidu.com"); + } + + public void open() { + //获取当前所有的handle + Set handleSet = cd.getWindowHandles(); + //编写js脚本,执行js,以开启一个新的标签页 + String js = "window.open(\"https://www.sogou.com\");"; + cd.executeScript(js); + //移除原有的windows的Handle,保留新打开的windows的Handle + String newHandle = ""; + for (String handle : cd.getWindowHandles()) { + if (!handleSet.contains(handle)) { + newHandle = handle; + break; + } + } + //切换WebDriver + cd.switchTo().window(newHandle); + } + + public ChromeDriver getDriver() { + return cd; + } + } +} diff --git a/设计图/辅助化测试工具封装.xmind b/设计图/辅助化测试工具封装.xmind new file mode 100644 index 0000000..67b5f5b Binary files /dev/null and b/设计图/辅助化测试工具封装.xmind differ