修改浏览器类的功能

This commit is contained in:
彭宇琦 2020-04-07 21:45:11 +08:00
parent 4e44764db4
commit 8f8cb3f5cc
9 changed files with 512 additions and 5 deletions

View File

@ -5,11 +5,14 @@ import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
/**
* 该类定义启动浏览器时必要的方法以及打开浏览器创建WebDriver对象的操作由新添加的各个浏览器子类可进行继承
*
* <p><b>文件名</b>AbstractBrower.java</p>
* <p><b>用途</b>该类定义启动浏览器时必要的方法以及打开浏览器创建WebDriver对象的操作由新添加的各个浏览器子类可进行继承</p>
* <p><b>编码时间</b>2020年4月6日 下午3:01:06</p>
* <p><b>修改时间</b>2020年4月6日 下午3:01:06</p>
* @author 彭宇琦
* @version Ver1.1
*
* @version Ver1.0
* @since JDK 12
* @since selenium 3.0.0
*/
public abstract class AbstractBrower {
/**

View File

@ -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<String, BrowerSetField> browerSetMap = new HashMap<String, BrowerSetField>();
/**
* 构造浏览器对象并指定驱动文件及待测站点
*
* @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参数则以以下方式进入站点
* <ul>
* <li>openNewLabel为true则重新打开一个标签页在新的标签页中打开站点</li>
* <li>openNewLabel为false则在当前的标签页中打开站点</li>
* </ul>
* 注意若未生成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<String, String> 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<String> 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);
}
/**
* <p><b>文件名</b>AbstractBrower.java</p>
* <p><b>用途</b>用于对浏览器特殊设置的字段说明</p>
* <p><b>编码时间</b>2020年4月7日 下午9:38:46</p>
* <p><b>修改时间</b>2020年4月7日 下午9:38:46</p>
* @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;
}
}
}

View File

@ -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
}
}

View File

@ -6,7 +6,7 @@ import java.util.Arrays;
/**
* <p><b>文件名</b>CommonTestCaseWrite.java</p>
* <p><b>用途</b>用于</p>
* <p><b>用途</b>定义了测试用例中一些基本方法的添加如添加步骤预期方法等使编码时更加直观</p>
* <p><b>编码时间</b>2020年4月5日 下午2:22:20</p>
* <p><b>修改时间</b>2020年4月5日 下午2:22:20</p>
* @author 彭宇琦

View File

@ -14,6 +14,16 @@ import org.testng.annotations.Test;
import pres.auxiliary.work.testcase.file.JiraTestCaseWrite.JiraFieldIdType;
import pres.auxiliary.work.testcase.templet.DataListCase;
/**
* <p><b>文件名</b>JiraTestCaseWriteTest.java</p>
* <p><b>用途</b>定义了上传至jira中tests的测试用例模板类中定义了基本的字段枚举在使用该类编写测试用例时
* 若需要使用预设的测试用例则无需设置模板字段与预设用例字段间的关系</p>
* <p><b>编码时间</b>2020年4月6日 上午11:35:56</p>
* <p><b>修改时间</b>2020年4月6日 上午11:35:56</p>
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
*/
public class JiraTestCaseWriteTest {
JiraTestCaseWrite wtc;

View File

@ -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<String> 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");
}
}

View File

@ -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<String> 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;
}
}
}

Binary file not shown.