完成json格式存储元素定位方式读取方法

This commit is contained in:
彭宇琦 2020-10-29 08:28:10 +08:00
parent 70157cfc80
commit 96a7cfdbc2
13 changed files with 819 additions and 238 deletions

View File

@ -1023,7 +1023,7 @@ public class TestReport extends AbstractReport {
// 定义Control对象读取禅道元素定位信息配置文件
Event event = Event.newInstance(d);
event.setXmlFile(new File(xpath));
ReadXml r = new ReadXml(new File(xpath));
XmlLocation r = new XmlLocation(new File(xpath));
// 操作浏览器
event.getTextEvent().input("用户名", username);
event.getTextEvent().input("密码", password);

View File

@ -11,7 +11,7 @@ import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
import pres.auxiliary.work.selenium.brower.AbstractBrower;
import pres.auxiliary.work.selenium.location.AbstractRead;
import pres.auxiliary.work.selenium.location.AbstractLocation;
import pres.auxiliary.work.selenium.location.ByType;
/**
@ -39,7 +39,7 @@ public abstract class AbstractBy {
/**
* 存储元素的定位方式读取类对象由于多个子类之间需要互通故此处标记为static
*/
protected static AbstractRead read;
protected static AbstractLocation read;
/**
* 用于存储浏览器对象
@ -111,7 +111,7 @@ public abstract class AbstractBy {
* @param xmlFile 存储元素定位方式的xml文件对象
* @param isBreakRootFrame 是否需要将窗体切回到顶层
*/
public void setReadMode(AbstractRead read, boolean isBreakRootFrame) {
public void setReadMode(AbstractLocation read, boolean isBreakRootFrame) {
AbstractBy.read = read;
if (isBreakRootFrame) {

View File

@ -4,7 +4,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import pres.auxiliary.work.selenium.location.AbstractRead;
import pres.auxiliary.work.selenium.location.AbstractLocation;
import pres.auxiliary.work.selenium.location.ByType;
/**
@ -51,9 +51,9 @@ public class ElementData {
/**
* 根据元素名称在配置文件中查找元素将元素的信息进行存储
* @param name 元素名称
* @param AbstractRead 配置文件类对象
* @param AbstractLocation 配置文件类对象
*/
public ElementData(String name, AbstractRead read) {
public ElementData(String name, AbstractLocation read) {
//存储元素名称
this.name = name;
@ -90,7 +90,7 @@ public class ElementData {
if (!linkWordList.isEmpty()) {
for (int i = 0; i < valueList.size(); i++) {
//判断字符串是否包含替换词语的开始标志若不包含则进行不进行替换操作
if (!valueList.get(i).contains(AbstractRead.START_SIGN)) {
if (!valueList.get(i).contains(AbstractLocation.START_SIGN)) {
continue;
}
@ -99,10 +99,10 @@ public class ElementData {
//存储当前定位内容文本
StringBuilder value = new StringBuilder(valueList.get(i));
//循环替换当前定位内容中所有需要替换的词语直到无词语替换或定位内容不存在需要替换的词语为止
while(linkWordIter.hasNext() && value.indexOf(AbstractRead.START_SIGN) > -1) {
while(linkWordIter.hasNext() && value.indexOf(AbstractLocation.START_SIGN) > -1) {
//存储替换符的开始和结束位置
int replaceStartIndex = value.indexOf(AbstractRead.START_SIGN);
int replaceEndIndex = value.indexOf(AbstractRead.END_SIGN);
int replaceStartIndex = value.indexOf(AbstractLocation.START_SIGN);
int replaceEndIndex = value.indexOf(AbstractLocation.END_SIGN);
//对当前位置的词语进行替换
value.replace(replaceStartIndex, replaceEndIndex + 1, linkWordIter.next());

View File

@ -15,7 +15,7 @@ import pres.auxiliary.work.selenium.element.ElementType;
* @version Ver1.0
*
*/
public abstract class AbstractRead {
public abstract class AbstractLocation {
/**
* 定义用于正则的替换符开始标记
*/
@ -71,8 +71,6 @@ public abstract class AbstractRead {
protected ElementType toElementType(String value) {
//转换元素类型枚举并返回
switch (value) {
case "0":
return ElementType.COMMON_ELEMENT;
case "1":
return ElementType.DATA_LIST_ELEMENT;
case "2":
@ -81,8 +79,52 @@ public abstract class AbstractRead {
return ElementType.SELECT_OPTION_ELEMENT;
case "4":
return ElementType.IFRAME_ELEMENT;
case "0":
default:
return null;
return ElementType.COMMON_ELEMENT;
}
}
/**
* 该方法用于根据标签的名称返回相应的定位方式枚举
* @param labelName 标签名称
* @return {@link ByType}枚举
*/
protected ByType toByType(String labelName) {
switch (labelName) {
case "xpath":
return ByType.XPATH;
case "css":
return ByType.CSS;
case "classname":
return ByType.CLASSNAME;
case "id":
return ByType.ID;
case "linktext":
return ByType.LINKTEXT;
case "name":
return ByType.NAME;
case "tagname":
return ByType.TAGNAME;
default:
throw new IllegalArgumentException("不存在的定位方式: " + labelName);
}
}
/**
* 用于对等待时间进行转换
* @param text 获取的文本
* @return 转换后的等待时间
*/
protected long toWaitTime(String text) {
//获取元素存储等待时间属性值并转换为long类型
try {
//将属性值进行转换若属性值不存在则赋为-1
long time = Long.valueOf(text == null ? "-1" : text);
//若转换的时间小于0则返回-1
return time < 0 ? -1L : time;
} catch (NumberFormatException e) {
return -1L;
}
}
}

View File

@ -0,0 +1,284 @@
package pres.auxiliary.work.selenium.location;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import pres.auxiliary.work.selenium.element.ElementType;
import pres.auxiliary.work.selenium.location.UndefinedElementException.ExceptionElementType;
/**
* <p><b>文件名</b>JsonLocation.java</p>
* <p><b>用途</b>
* 用于读取以json形式的读取到的元素定位信息
* </p>
* <p><b>编码时间</b>2020年10月28日上午8:24:56</p>
* <p><b>修改时间</b>2020年10月28日上午8:24:56</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public class JsonLocation extends AbstractLocation {
/**
* 指向json中的模板key值
*/
protected final String KEY_TEMPLETE = "templet";
/**
* 指向json中的元素key值
*/
protected final String KEY_ELEMENT = "element";
/**
* 指向json中的元素定位方式key值
*/
protected final String KEY_LOCATION = "location";
/**
* 指向json中的元素定位模板key值
*/
protected final String KEY_TEMP = "temp";
/**
* 指向json中的元素定位模板key值
*/
protected final String KEY_VALUE = "value";
/**
* 指向json中的元素定位类型key值
*/
protected final String KEY_TYPE = "type";
/**
* 指向json中的元素等待时间key值
*/
protected final String KEY_WAIT = "wait";
protected final String KEY_IFRAME = "iframe";
/**
* 存储转换后获得到的模板json对象
*/
JSONObject templateJson;
/**
* 存储转换后获得的元素json对象
*/
JSONObject elementJson;
/**
* 通过写在文件中的json文本类对象对类进行构造
* @param jsonTextFile 存储json的文件类对象
*/
public JsonLocation(File jsonTextFile) {
//读取json文件中的内容
StringBuilder jsonText = new StringBuilder();
try(BufferedReader br = new BufferedReader(new FileReader(jsonTextFile))) {
String text = "";
while((text = br.readLine()) != null) {
jsonText.append(text);
}
} catch (IOException e) {
throw new IncorrectFileException("json文件异常文件位置" + jsonTextFile.getAbsolutePath());
}
//转换读取的json内容
toJsonObject(jsonText.toString());
}
/**
* 通过json文本对类进行构造
* @param json json文本
*/
public JsonLocation(String jsonText) {
toJsonObject(jsonText);
}
@Override
public ArrayList<ByType> findElementByTypeList(String name) {
ArrayList<ByType> byTypeList = new ArrayList<ByType>();
//获取当前元素的定位数组
JSONArray locationList = getElementJson(name).getJSONArray(KEY_LOCATION);
//若获取到的数组不为空则读取其中的内容
if (locationList != null) {
//遍历locationList组读取元素的定位内容存储相应的
for (int i = 0; i < locationList.size(); i++) {
//获取当前读取的json
JSONObject locationJson = locationList.getJSONObject(i);
//读取其中的"type"值的内容
String typeText = locationJson.getString(KEY_TYPE);
//若当前值不存在内容则抛出异常
if (typeText == null || typeText.isEmpty()) {
throw new UndefinedElementException("元素“" + name + "”不存在" + KEY_TYPE + "");
}
//转换并存储定位方式
byTypeList.add(toByType(typeText));
}
}
return byTypeList;
}
@Override
public ArrayList<String> findValueList(String name) {
ArrayList<String> valueList = new ArrayList<String>();
//获取当前元素的定位数组
JSONArray locationList = getElementJson(name).getJSONArray(KEY_LOCATION);
//若获取到的数组不为空则读取其中的内容
if (locationList != null) {
//遍历locationList组读取元素的定位内容存储相应的
for (int i = 0; i < locationList.size(); i++) {
//获取当前读取的json
JSONObject locationJson = locationList.getJSONObject(i);
//读取其中的"type"值的内容
String tempText = locationJson.getString(KEY_TEMP);
//若当前值不存在内容则抛出异常
if (tempText == null || tempText.isEmpty()) {
String valueText = locationJson.getString(KEY_VALUE);
//若不存在模板key则判断是否存在定位值key若均不存在则抛出异常
if (valueText == null || valueText.isEmpty()) {
throw new UndefinedElementException("元素“" + name + "”不存在定位方式键值对");
}
//若存在value值则读取相应的值并进行存储
valueList.add(valueText);
} else {
//若存在模板则按照模板读取方式进行处理
valueList.add(analysisTemplet(locationJson));
}
}
}
return valueList;
}
/**
* 用于返回读取到的模板内容
* @param locationJson 定位方式json
* @return 经过转换的定位方式
*/
private String analysisTemplet(JSONObject locationJson) {
//获取模板名称
String tempText = locationJson.getString(KEY_TEMP);
//判断名称是否存在若不存在则抛出异常
if (!templateJson.containsKey(tempText)) {
throw new UndefinedElementException(tempText, ExceptionElementType.TEMPLET);
}
//读取模板内容
String tempValueText = templateJson.getString(tempText);
//遍历所有键值对将相应的内容进行存储
for (String key : locationJson.keySet()) {
String matchKey = MATCH_START_SIGN + key + MATCH_END_SIGN;
tempValueText = tempValueText.replaceAll(matchKey, locationJson.getString(key));
}
return tempValueText;
}
@Override
public ElementType findElementType(String name) {
//获取元素json
JSONObject elementJson = getElementJson(name);
String elementTypeText = elementJson.getString(KEY_TYPE);
//若elementTypeText为空则赋为0
return toElementType(elementTypeText == null ? "0" : elementTypeText);
}
@Override
public ArrayList<String> findIframeNameList(String name) {
//存储当前窗体的名称集合
ArrayList<String> iframeNameList = new ArrayList<>();
//查找当前元素
JSONObject elementJson = getElementJson(name);
//存储当前元素的父窗体的名称
String iframeName = "";
//循环根据父层级向上遍历元素直到元素无父层窗体为止
while(!(iframeName = getNextIframe(elementJson)).isEmpty()) {
elementJson = getElementJson(iframeName);
iframeNameList.add(iframeName);
}
//反序集合使最高层窗体放在最前
Collections.reverse(iframeNameList);
return iframeNameList;
}
@Override
public long findWaitTime(String name) {
return toWaitTime(getElementJson(name).getString(KEY_WAIT));
}
/**
* 返回获取的模板json内容
* @return 模板json
*/
public String getTempletJson() {
return templateJson.toJSONString();
}
/**
* 返回获取的元素json内容
* @return 元素json
*/
public String getElementJson() {
return elementJson.toJSONString();
}
/**
* 用于将读取到的json进行转换分离模板json与元素json
* @param text json文本
* @throws UndefinedElementException json中无元素信息时抛出的异常
*/
private void toJsonObject(String text) {
//将文件解析成JSONObject类对象
JSONObject json = JSONObject.parseObject(text);
//获取元素json若不存在元素json则抛出异常
if (json.containsKey(KEY_ELEMENT)) {
this.elementJson = json.getJSONObject(KEY_ELEMENT);
//判断获取到的元素json是否为空若为空则抛出异常
if (this.elementJson.isEmpty()) {
throw new UndefinedElementException("Json的“" + KEY_ELEMENT + "”key值中不存在元素信息");
}
} else {
throw new UndefinedElementException("Json中不存在“" + KEY_ELEMENT + "”key值");
}
//获取模板json若不存在模板json则不进行处理
if (json.containsKey(KEY_TEMPLETE)) {
this.templateJson = json.getJSONObject(KEY_TEMPLETE);
} else {
this.templateJson = new JSONObject();
}
}
/**
* 用于获取元素json
* @param name 元素名称
* @return 获取到的元素json类对象
*/
private JSONObject getElementJson(String name) {
//判断元素是否存在若不存在则抛出异常
if (!elementJson.containsKey(name)) {
throw new UndefinedElementException(name, ExceptionElementType.ELEMENT);
}
//获取当前元素的定位数组
return elementJson.getJSONObject(name);
}
/**
* 用于返回当前元素是否存在父层窗体若存在则返回相应的窗体名称反之则返回空串
* @param elementJson 元素json
* @return 元素对应的父层窗体名称
*/
private String getNextIframe(JSONObject elementJson) {
//获取元素父窗体的名称
String iframeName = elementJson.getString(KEY_IFRAME);
return iframeName == null ? "" : iframeName;
}
}

View File

@ -4,10 +4,10 @@ package pres.auxiliary.work.selenium.location;
* <p><b>文件名</b>UndefinedElementException.java</p>
* <p><b>用途</b>用于查找xml文件中元素不存在时抛出的异常</p>
* <p><b>编码时间</b>2019年10月25日上午8:30:20</p>
* <p><b>修改时间</b>2019年10月25日上午8:30:20</p>
* <p><b>修改时间</b>2020年10月28日上午11:31:51</p>
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
* @since JDK 8
*
*/
public class UndefinedElementException extends RuntimeException {
@ -32,7 +32,22 @@ public class UndefinedElementException extends RuntimeException {
public UndefinedElementException(Throwable cause) {
super(cause);
}
public UndefinedElementException(String elemenetName, ExceptionElementType exceptionElementType) {
super("不存在的" + exceptionElementType.name+ "名称:" + elemenetName);
}
private static final long serialVersionUID = 1L;
public enum ExceptionElementType {
ELEMENT("元素"),
TEMPLET("模板")
;
String name;
private ExceptionElementType(String name) {
this.name = name;
}
}
}

View File

@ -11,6 +11,7 @@ import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import pres.auxiliary.work.selenium.element.ElementType;
import pres.auxiliary.work.selenium.location.UndefinedElementException.ExceptionElementType;
/**
* <p>
@ -41,7 +42,7 @@ import pres.auxiliary.work.selenium.element.ElementType;
* @since JDK 8
*
*/
public class ReadXml extends AbstractRead {
public class XmlLocation extends AbstractLocation {
/**
* 存储构造后的Document类对象以读取xml文件中的内容
*/
@ -52,7 +53,7 @@ public class ReadXml extends AbstractRead {
* @param xmlFile xml文件对象
* @throws IncorrectFileException xml文件有误时抛出的异常
*/
public ReadXml(File xmlFile) {
public XmlLocation(File xmlFile) {
//将编译时异常转换为运行时异常
try {
dom = new SAXReader().read(xmlFile);
@ -66,7 +67,7 @@ public class ReadXml extends AbstractRead {
* 根据xml文件的{@link Document}对象进行构造
* @param dom {@link Document}对象
*/
public ReadXml(Document dom) {
public XmlLocation(Document dom) {
this.dom = dom;
}
@ -78,7 +79,7 @@ public class ReadXml extends AbstractRead {
//遍历元素下所有的定位标签并将其转换为相应的ByType枚举存储至byTypeList中
for (Object byElement : element.elements()) {
byTypeList.add(getByType(((Element)byElement).getName()));
byTypeList.add(toByType(((Element)byElement).getName()));
}
return byTypeList;
@ -101,7 +102,7 @@ public class ReadXml extends AbstractRead {
//判断元素是否启用模板若启用模板则获取模板内容并将定位内容进行转换
String tempId = ((Element) byElement).attributeValue("temp_id");
String value = tempId != null ?
getTemplateValue(tempId, getByType(((Element) byElement).getName())) :
getTemplateValue(tempId, toByType(((Element) byElement).getName())) :
((Element)byElement).getText();
valueList.add(replaceValue(((Element) byElement), value));
@ -164,32 +165,6 @@ public class ReadXml extends AbstractRead {
}
}
/**
* 该方法用于根据标签的名称返回相应的定位方式枚举
* @param labelName 标签名称
* @return {@link ByType}枚举
*/
private ByType getByType(String labelName) {
switch (labelName) {
case "xpath":
return ByType.XPATH;
case "css":
return ByType.CSS;
case "classname":
return ByType.CLASSNAME;
case "id":
return ByType.ID;
case "linktext":
return ByType.LINKTEXT;
case "name":
return ByType.NAME;
case "tagname":
return ByType.TAGNAME;
default:
throw new IllegalArgumentException("不存在的定位方式: " + labelName);
}
}
/**
* 用于返回元素标签对象
* @param name 元素名称
@ -204,7 +179,7 @@ public class ReadXml extends AbstractRead {
if (element != null) {
return element;
} else {
throw new UndefinedElementException("不存在的元素名称:" + name);
throw new UndefinedElementException(name, ExceptionElementType.ELEMENT);
}
}
@ -222,7 +197,7 @@ public class ReadXml extends AbstractRead {
if (element != null) {
return element.getText();
} else {
throw new UndefinedElementException("不存在的模板:" + selectTempXpath);
throw new UndefinedElementException(tempId, ExceptionElementType.TEMPLET);
}
}

View File

@ -1,158 +0,0 @@
package pres.auxiliary.work.selenium.datadriven;
import java.io.File;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import pres.auxiliary.work.selenium.datadriven.DataNotFoundException;
public class TestDataDriven {
DataDriven dataList = new DataDriven();
@After
public void after() {
while(dataList.hasNext()) {
System.out.println("*******************************");
System.out.println("正在读取第" + (dataList.getNowIndex() + 1) + "行数据:");
int i = 0;
for (String data : dataList.next()) {
System.out.println("" + (i + 1) + "列(列名:" + dataList.getReadListName()[i++] + ")数据:" + data);
}
}
System.out.println("*******************************");
System.out.println("整体数据:");
System.out.println("[" + dataList.toString() + "]");
}
@Before
public void readFile() throws DataNotFoundException {
// dataList.setEmptyCell(true);
// test_04_ReadTxtFile();
// dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test2.txt"), true);
/*
for ( int i = 0; i < dataList.getColumnLength(); i++ ) {
dataList.replaceListName(i, ("测试数据第" + (i + 1) + ""));
}
*/
}
@Ignore
@Test
public void test_01_ReadCsvFile() throws DataNotFoundException {
dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test.csv"), true);
}
@Ignore
@Test
public void test_02_ReadXlsxFile() throws DataNotFoundException {
dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test.xlsx"), true);
}
@Ignore
@Test
public void test_03_ReadXlsFile() throws DataNotFoundException {
dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test.xls"), true);
}
@Ignore
@Test
public void test_04_ReadTxtFile() throws DataNotFoundException {
dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test.txt"), true);
}
@Ignore
@Test
public void test_05_setEmptyCell() throws DataNotFoundException {
dataList.setEmptyCell(false);
dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test.xls"), true);
}
@Ignore
@Test
public void test_06_next() {
int index = 0;
while(dataList.hasNext()) {
System.out.println("*******************************");
System.out.println("正在读取第" + (index + 1) + "行数据:");
int i = 0;
for (String data : dataList.next()) {
System.out.println("" + (i + 1) + "列(列名:" + dataList.getListName(i++) + ")数据:" + data);
}
index++;
}
}
@Test
public void test_07_setReadListName() {
dataList.setReadListName("测试1", "测试3");
}
@Test
public void test_08_setReadListId() {
dataList.setReadListId(1, 2);
}
@Test
public void test_09_readFiles() throws DataNotFoundException {
dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test2.txt"), true);
test_01_ReadCsvFile();
test_02_ReadXlsxFile();
test_03_ReadXlsFile();
test_04_ReadTxtFile();
dataList.setReadListName("测试1", "xls1", "测试4", "csv1", "xlsx1");
}
@Test
public void test_10_setNowIndex() {
dataList.setNowIndex(3);
}
@Test
public void test_11_getRowAndsetReadAllList() {
dataList.setReadListId(1, 3, 5);
int index = 1;
for (String data : dataList.getRow(2)) {
System.out.println("" + (index++) + "行数据:" + data);
}
dataList.setReadAllList();
}
@Test
public void test_12_getColumn() {
int index = 1;
for (String data : dataList.getColumn(3)) {
System.out.println("" + (index++) + "行数据:" + data);
}
System.out.println("******************************");
index = 1;
for (String data : dataList.getColumn("测试2")) {
System.out.println("" + (index++) + "行数据:" + data);
}
dataList.setReadAllList();
}
@Test
public void test_13_saveData() throws Exception {
dataList.setEmptyCell(false);
dataList.addDataFile(new File("src/test/java/pres/auxiliary/selenium/datadriven/Test2.txt"), true);
test_01_ReadCsvFile();
test_02_ReadXlsxFile();
test_03_ReadXlsFile();
test_04_ReadTxtFile();
test_01_ReadCsvFile();
test_02_ReadXlsxFile();
test_03_ReadXlsFile();
test_04_ReadTxtFile();
dataList.saveData(new File("D:\\测试\\test.txt"));
dataList.saveData(new File("D:\\测试\\test.csv"));
dataList.saveData(new File("D:\\测试\\test.xls"));
dataList.saveData(new File("D:\\测试\\test.xlsx"));
}
}

View File

@ -6,8 +6,8 @@ import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import pres.auxiliary.work.selenium.location.AbstractRead;
import pres.auxiliary.work.selenium.location.ReadXml;
import pres.auxiliary.work.selenium.location.AbstractLocation;
import pres.auxiliary.work.selenium.location.XmlLocation;
/**
* <p><b>文件名</b>ElementDataTest.java</p>
@ -21,14 +21,14 @@ import pres.auxiliary.work.selenium.location.ReadXml;
*
*/
public class ElementDataTest {
AbstractRead ar;
AbstractLocation ar;
ElementData test;
final File XML_FILE = new File("src/test/java/pres/auxiliary/work/selenium/element/测试用xml文件.xml");
@BeforeClass
public void init() {
ar = new ReadXml(XML_FILE);
ar = new XmlLocation(XML_FILE);
}
@BeforeMethod

View File

@ -0,0 +1,162 @@
package pres.auxiliary.work.selenium.location;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.alibaba.fastjson.JSONObject;
/**
* <p><b>文件名</b>JsonLocationTest.java</p>
* <p><b>用途</b>
* {@link JsonLocation}类进行单元测试
* </p>
* <p><b>编码时间</b>2020年10月28日上午7:55:07</p>
* <p><b>修改时间</b>2020年10月28日上午7:55:07</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public class JsonLocationTest {
private final File JSON_FILE = new File("src/test/java/pres/auxiliary/work/selenium/location/测试用json文件.txt");
/**
* 定义类
*/
JsonLocation test;
/**
* 初始化数据
*/
@BeforeClass
public void init() {
test = new JsonLocation(JSON_FILE);
}
/**
* 测试读取文件中的json并测试其是否能被转换为json
*/
@Test
public void readJson() {
StringBuilder jsonText = new StringBuilder();
try(BufferedReader br = new BufferedReader(new FileReader(JSON_FILE))) {
String text = "";
while((text = br.readLine()) != null) {
jsonText.append(text);
}
} catch (Exception e) {
}
// System.out.println(jsonText.toString());
JSONObject json = JSONObject.parseObject(jsonText.toString());
System.out.println(json.toJSONString());
// System.out.println(new JSONObject().isEmpty());
System.out.println(json.getJSONArray("test"));
}
/**
* 用于测试{@link JsonLocation#findElementByTypeList(String)}方法<br>
* 预期<br>
* xpath
* css
* xpath
* id
*/
@Test
public void findElementByTypeListTest() {
test.findElementByTypeList("XX控件5").forEach(System.out :: println);
}
/**
* 用于测试{@link JsonLocation#findValueList(String)}方法不抛出异常<br>
* 预期<br>
* //XXX模板控件1[@X='${name}']/div/div[@src='Test']/input
* http body div
* //XXX模板控件1[@X='${src}']/div[@name='${name}']
* 测试控件55555
*/
@Test
public void findValueListTest_NotException() {
test.findValueList("XX控件5").forEach(System.out :: println);
}
/**
* 用于测试{@link JsonLocation#findValueList(String)}方法抛出异常<br>
* 预期<br>
* 通过
*/
@Test (expectedExceptions = UndefinedElementException.class)
public void findValueListTest_Exception() {
test.findValueList("XX控件20").forEach(System.out :: println);
}
/**
* 用于测试{@link JsonLocation#findElementType(String)}方法<br>
* 预期<br>
* COMMON_ELEMENT
* DATA_LIST_ELEMENT
* SELECT_DATAS_ELEMENT
* COMMON_ELEMENT
* COMMON_ELEMENT
* SELECT_OPTION_ELEMENT
*/
@Test
public void findElementTypeTest() {
System.out.println(test.findElementType("XX控件16"));
System.out.println(test.findElementType("XX控件17"));
System.out.println(test.findElementType("XX控件18"));
System.out.println(test.findElementType("XX控件19"));
System.out.println(test.findElementType("XX控件21"));
System.out.println(test.findElementType("XX控件20"));
}
/**
* 用于测试{@link JsonLocation#findWaitTime(String)}方法<br>
* 预期<br>
* 1
* 0
* -1
* -1
* -1
* -1
*/
@Test
public void findWaitTimeTest() {
System.out.println(test.findWaitTime("XX控件16"));
System.out.println(test.findWaitTime("XX控件17"));
System.out.println(test.findWaitTime("XX控件18"));
System.out.println(test.findWaitTime("XX控件19"));
System.out.println(test.findWaitTime("XX控件21"));
System.out.println(test.findWaitTime("XX控件20"));
}
/**
* 用于测试{@link JsonLocation#findIframeNameList(String)}方法<br>
* 预期<br>
* ["窗体1", "窗体1.1"]
* ["窗体1", "窗体1.1", "窗体1.1.1"]
*
*/
@Test
public void findIframeNameListTest_NotException() {
System.out.println(test.findIframeNameList("XX控件3"));
System.out.println(test.findIframeNameList("XX控件3.1"));
}
/**
* 用于测试{@link JsonLocation#findIframeNameList(String)}方法<br>
* 预期<br>
* 显示无元素信息异常
*/
@Test
public void findIframeNameListTest_Exception() {
try {
System.out.println(test.findIframeNameList("XX控件3.2"));
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -7,30 +7,30 @@ import org.testng.annotations.Test;
/**
* <p><b>文件名</b>ReadXmlTest.java</p>
* <p><b>用途</b>用于对{@link ReadXml}类进行测试</p>
* <p><b>用途</b>用于对{@link XmlLocation}类进行测试</p>
* <p><b>编码时间</b>2020年10月8日 下午11:19:40</p>
* <p><b>修改时间</b>2020年10月8日 下午11:19:40</p>
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
*/
public class ReadXmlTest {
public class XmlLocationTest {
private final File XML_FILE = new File("src/test/java/pres/auxiliary/work/selenium/location/测试用xml文件.xml");
/**
* 定义类
*/
ReadXml rx;
XmlLocation rx;
/**
* 初始化数据
*/
@BeforeClass
public void init() {
rx = new ReadXml(XML_FILE);
rx = new XmlLocation(XML_FILE);
}
/**
* 测试{@link ReadXml#findElementByTypeList(String)}方法
* 测试{@link XmlLocation#findElementByTypeList(String)}方法
* 预期
* XPATH
* CSS
@ -42,7 +42,7 @@ public class ReadXmlTest {
}
/**
* 测试{@link ReadXml#findElementType(String)}方法
* 测试{@link XmlLocation#findElementType(String)}方法
* 预期
* COMMON_ELEMENT
* COMMON_ELEMENT
@ -62,7 +62,7 @@ public class ReadXmlTest {
}
/**
* 测试{@link ReadXml#findIframeNameList(String)}方法
* 测试{@link XmlLocation#findIframeNameList(String)}方法
* 预期
* 窗体1
* 窗体1.1
@ -74,7 +74,7 @@ public class ReadXmlTest {
}
/**
* 测试{@link ReadXml#findWaitTime(String)}方法
* 测试{@link XmlLocation#findWaitTime(String)}方法
* 预期
* -1
* 100
@ -94,7 +94,7 @@ public class ReadXmlTest {
}
/**
* 测试{@link ReadXml#findValueList(String)}方法
* 测试{@link XmlLocation#findValueList(String)}方法
* 预期
* //XXX模板控件1[@X='XX控件11']/div/div[@src='Test']/input
* http body div

View File

@ -0,0 +1,261 @@
{
"templet":{
"1":"//XXX模板控件1[@X='${name}']/div/div[@${att}='${id}']/input",
"2":"http body ${tag_name}",
"3":"//XXX模板控件1[@X='${src}']/div[@name='${name}']",
"4":"//XXX模板控件1[@X='${src}']/div[@name='${name}']/div[@is='${str1}' and text()='${str1}']",
"5":"//XXX模板控件1[@X='${src}']/div[@name='${name}']/div[@is='${str1}' and text()='${src}']/span[text()='${str2}']/span[id='${aaaa}']",
"6":"${name}"
},
"element":{
"XX控件1":{
"location":[
{
"type":"xpath",
"value":"//XX控件1[@X='XXXX']"
}
],
"type":"0",
"wait":"5"
},
"窗体1":{
"location":[
{
"type":"xpath",
"value":"//窗体1[@X='XXXX']"
},
{
"temp":"2",
"type":"css",
"tag_name":"iframe"
}
],
"type":"1",
"wait":"5"
},
"XX控件2":{
"location":[
{
"type":"xpath",
"value":"//XX控件2[@X='XXXX']"
}
],
"type":"0",
"wait":"5",
"iframe":"窗体1"
},
"窗体1.1":{
"location":[
{
"type":"xpath",
"value":"//窗体1.1[@X='XXXX']"
}
],
"type":"1",
"iframe":"窗体1"
},
"XX控件3":{
"location":[
{
"type":"xpath",
"value":"//XX控件3[@X='XXXX']"
}
],
"type":"0",
"wait":"5",
"iframe":"窗体1.1"
},
"窗体1.1.1":{
"location":[
{
"type":"xpath",
"value":"//窗体1.1.1[@X='XXXX']"
}
],
"type":"1",
"iframe":"窗体1.1"
},
"XX控件3.1":{
"location":[
{
"type":"xpath",
"value":"//XX控件3[@X='XXXX']"
}
],
"type":"0",
"wait":"5",
"iframe":"窗体1.1.1"
},
"XX控件3.2":{
"location":[
{
"type":"xpath",
"value":"//XX控件3[@X='XXXX']"
}
],
"type":"0",
"wait":"5",
"iframe":"窗体1.1.8"
},
"窗体1.2":{
"location":[
{
"type":"xpath",
"value":"//窗体1.2[@X='XXXX']"
}
],
"iframe":"窗体1"
},
"XX控件4":{
"location":[
{
"type":"xpath",
"value":"//XX控件4[@X='XXXX']"
}
]
},
"窗体2":{
"location":[
{
"type":"xpath",
"value":"//窗体2[@X='XXXX']"
}
]
},
"XX控件5":{
"location":[
{
"temp":"1",
"type":"xpath",
"id":"Test",
"att":"src"
},
{
"temp":"2",
"type":"css",
"tag_name":"div",
"att":"src"
},
{
"temp":"3",
"type":"xpath"
},
{
"temp":"6",
"type":"id",
"name":"测试控件55555"
}
],
"iframe":"窗体2"
},
"窗体3":{
"location":[
{
"type":"xpath",
"value":"//窗体3[@X='${ccc}']"
}
]
},
"XX控件13":{
"location":[
{
"temp":"3",
"type":"xpath"
}
],
"iframe":"窗体3"
},
"XX控件14":{
"location":[
{
"temp":"4",
"type":"xpath"
}
],
"iframe":"窗体3"
},
"XX控件15":{
"location":[
{
"temp":"5",
"type":"xpath"
}
],
"iframe":"窗体3",
"wait":100
},
"XX控件16":{
"location":[
{
"temp":"1",
"type":"xpath",
"id":"Test",
"att":"src"
}
],
"iframe":"窗体3",
"type":0,
"wait":1
},
"XX控件17":{
"location":[
{
"temp":"1",
"type":"xpath"
}
],
"iframe":"窗体3",
"type":1,
"wait":0
},
"XX控件18":{
"location":[
{
"temp":"5",
"type":"xpath",
"src":"Test",
"str2":"string"
}
],
"iframe":"窗体3",
"type":2,
"wait":-11
},
"XX控件19":{
"location":[
{
"temp":"5",
"type":"xpath",
"src":"Test",
"str2":"string"
}
],
"iframe":"窗体3",
"type":"sadasd",
},
"XX控件21":{
"location":[
{
"temp":"5",
"type":"xpath",
"src":"Test",
"str2":"string"
}
],
"iframe":"窗体3",
"type":2000,
"wait":""
},
"XX控件20":{
"location":[
{
"temp":"测试",
"type":"xpath"
}
],
"iframe":"窗体3",
"type":3,
"wait":"dasd"
}
}
}

View File

@ -9,14 +9,14 @@ import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class ReadXmlTest {
ReadXml r;
XmlLocation r;
/**
* 初始化数据
*/
@BeforeClass
public void newReadXML() {
r = new ReadXml(new File("src/test/java/pres/auxiliary/work/selenium/xml/测试用xml文件.xml"));
r = new XmlLocation(new File("src/test/java/pres/auxiliary/work/selenium/xml/测试用xml文件.xml"));
}
@AfterMethod
@ -25,7 +25,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getBy(String, ByType)}方法获取普通元素
* 用于测试{@link XmlLocation#getBy(String, ByType)}方法获取普通元素
*/
@Test
public void getByTest_Element() {
@ -33,7 +33,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getBy(String, ByType)}方法获取窗体元素
* 用于测试{@link XmlLocation#getBy(String, ByType)}方法获取窗体元素
*/
@Test
public void getByTest_Iframe() {
@ -41,7 +41,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getBy(String, ByType)}方法获取模板元素
* 用于测试{@link XmlLocation#getBy(String, ByType)}方法获取模板元素
*/
@Test
public void getByTest_Templet() {
@ -50,7 +50,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getBy(String, ByType)}方法获取顶层元素
* 用于测试{@link XmlLocation#getBy(String, ByType)}方法获取顶层元素
*/
@Test
public void getByTest_RootElement() {
@ -58,7 +58,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getValue(String, ByType)}方法获取普通元素
* 用于测试{@link XmlLocation#getValue(String, ByType)}方法获取普通元素
*/
@Test
public void getElementValueTest_Element() {
@ -66,7 +66,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getValue(String, ByType)}方法获取窗体元素
* 用于测试{@link XmlLocation#getValue(String, ByType)}方法获取窗体元素
*/
@Test
public void getElementValueTest_Iframe() {
@ -74,7 +74,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getValue(String, ByType)}方法获取模板元素
* 用于测试{@link XmlLocation#getValue(String, ByType)}方法获取模板元素
*/
@Test
public void getElementValueTest_Templet() {
@ -83,7 +83,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getValue(String, ByType)}方法获取顶层元素
* 用于测试{@link XmlLocation#getValue(String, ByType)}方法获取顶层元素
*/
@Test
public void getElementValueTest_RootElement() {
@ -91,7 +91,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getIframeName(String, ByType)}方法获取普通元素
* 用于测试{@link XmlLocation#getIframeName(String, ByType)}方法获取普通元素
*/
@Test
public void getIframeNameTest_Element() {
@ -99,7 +99,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getIframeName(String, ByType)}方法获取窗体元素
* 用于测试{@link XmlLocation#getIframeName(String, ByType)}方法获取窗体元素
*/
@Test
public void getIframeNameTest_Iframe() {
@ -107,7 +107,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getIframeName(String, ByType)}方法获取模板元素
* 用于测试{@link XmlLocation#getIframeName(String, ByType)}方法获取模板元素
*/
@Test
public void getIframeNameTest_Templet() {
@ -116,7 +116,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getIframeName(String)}方法获取顶层元素
* 用于测试{@link XmlLocation#getIframeName(String)}方法获取顶层元素
*/
@Test
public void getIframeNameTest_RootElement() {
@ -124,7 +124,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getIframeName(String)}方法获取模板元素
* 用于测试{@link XmlLocation#getIframeName(String)}方法获取模板元素
*/
@Test
public void getIframeNameTest_NoPram() {
@ -132,7 +132,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getValue(String, ByType)}方法未查找到替换的属性
* 用于测试{@link XmlLocation#getValue(String, ByType)}方法未查找到替换的属性
*/
@Test
public void getValueTest_NoPram() {
@ -141,7 +141,7 @@ ReadXml r;
}
/**
* 用于测试{@link ReadXml#getValue(String, ByType)}方法外链关键词
* 用于测试{@link XmlLocation#getValue(String, ByType)}方法外链关键词
*/
@Test
public void getValueTest_Link() {