删除原始读取xml文件的方法,并修改类中导入错误的包名

This commit is contained in:
彭宇琦 2020-10-10 07:52:23 +08:00
parent f90362a016
commit b5b45b9563
11 changed files with 0 additions and 767 deletions

View File

@ -3,7 +3,6 @@ package pres.auxiliary.work.selenium.location;
import java.util.ArrayList;
import pres.auxiliary.work.selenium.element.ElementType;
import pres.auxiliary.work.selenium.xml.ByType;
/**
* <p><b>文件名</b>AbstractReadConfig.java</p>

View File

@ -11,7 +11,6 @@ import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import pres.auxiliary.work.selenium.element.ElementType;
import pres.auxiliary.work.selenium.xml.ByType;
/**
* <p>

View File

@ -1,60 +0,0 @@
package pres.auxiliary.work.selenium.xml;
/**
* <p>
* <b>文件名</b>ByType.java
* </p>
* <p>
* <b>用途</b>用于枚举出能被识别的元素定位方式
* </p>
* <p>
* <b>编码时间</b>2019年10月24日下午5:18:57
* </p>
* <p>
* <b>修改时间</b>2019年10月24日下午5:18:57
* </p>
*
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
*
*/
public enum ByType {
/** 通过xpath方式进行定位 */
XPATH("xpath"),
/** 通过css方式进行定位 */
CSS("css"),
/** 通过className方式进行定位 */
CLASSNAME("classname"),
/** 通过id方式进行定位 */
ID("id"),
/** 通过linkText方式进行定位 */
LINKTEXT("linktext"),
/** 通过name方式进行定位 */
NAME("name"),
/** 通过tagName方式进行定位 */
TAGNAME("tagname"),
/**
* 通过jQuert的方式进行定位
*/
// JQ("jquert"),
;
/**
* 定义枚举值
*/
private String value;
private ByType(String value) {
this.value = value;
}
/**
* 返回元素定位枚举对应的定位方式名称
*
* @return 元素定位方式名称
*/
public String getValue() {
return value;
}
}

View File

@ -1,40 +0,0 @@
package pres.auxiliary.work.selenium.xml;
/**
* 该异常在XML文件不正确或XML路径不存在时抛出
*
* @author 彭宇琦
* @version V1.0
*
*/
public class IncorrectXmlPathException extends RuntimeException {
private static final long serialVersionUID = 1L;
public IncorrectXmlPathException() {
super();
// TODO Auto-generated constructor stub
}
public IncorrectXmlPathException(String arg0, Throwable arg1, boolean arg2,
boolean arg3) {
super(arg0, arg1, arg2, arg3);
// TODO Auto-generated constructor stub
}
public IncorrectXmlPathException(String arg0, Throwable arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public IncorrectXmlPathException(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public IncorrectXmlPathException(Throwable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
}

View File

@ -1,37 +0,0 @@
package pres.auxiliary.work.selenium.xml;
/**
* <p><b>文件名</b>NoSuchSignValueException.java</p>
* <p><b>用途</b>用于当模板内容中标志的值未定义为元素的属性中时抛出的异常</p>
* <p><b>编码时间</b>2019年10月25日上午11:12:20</p>
* <p><b>修改时间</b>2019年10月25日上午11:12:20</p>
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
*
*/
public class NoSuchSignValueException extends RuntimeException {
private static final long serialVersionUID = 1L;
public NoSuchSignValueException() {
super();
}
public NoSuchSignValueException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public NoSuchSignValueException(String message, Throwable cause) {
super(message, cause);
}
public NoSuchSignValueException(String message) {
super(message);
}
public NoSuchSignValueException(Throwable cause) {
super(cause);
}
}

View File

@ -1,91 +0,0 @@
package pres.auxiliary.work.selenium.xml;
import java.io.File;
import java.io.IOException;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import pres.auxiliary.work.old.testcase.templet.ZentaoTemplet;
/**
* 该类用于通过读取生成的case文件来自动编写测试用例及selenium脚本未做
*
* @author 彭宇琦
*/
public class ReadCaseXml {
// 用于读取XML文件
private Document dom;
/**
* 用于构造对象并设置xml文件
*
* @param caseFile
* 指向xml文件的文件对象
*/
public ReadCaseXml(File caseFile) {
setCaseFilePath(caseFile);
}
/**
* 该方法用于重新设置xml文件存放的路径并将Document对象指向新的XML文件
*
* @param caseFile
* xml的存放路径
*/
public void setCaseFilePath(File caseFile) {
// 重新构造Document对象使其指向新的XML文件
try {
dom = new SAXReader().read(caseFile);
} catch (DocumentException e) {
// 若抛出异常则将异常转换为自定义的IncorrectXMLFileException异常使其不需要在编译时处理
throw new IncorrectXmlPathException("case文件不正确或case文件路径不正确");
}
}
/**
* 该方法用于读取生成的case文件并自动编写测试用例
* @throws IOException
*/
public void writeCase() throws IOException {
// 获取到根元素
Element root = dom.getRootElement();
// 读取根元素的属性并通过该属性创建测试用例模版
String caseTempletFileName = root.attribute("name").getText();
String caseTempletFilePath = root.attribute("case_file_path").getText();
createCaseTemplet(caseTempletFileName, caseTempletFilePath,
root.attribute("module_file_path"),
root.attribute("story_file_path"));
}
/**
* 该方法用于创建禅道模版注意后两个参数为Attribute类型
* @throws IOException
*/
private void createCaseTemplet(String name, String path, Attribute module,
Attribute story) throws IOException {
//读取module和story属性中的内容判断xml中是否存在该属性若不存在则赋为空值
String moduleStr = "";
String storyStr = "";
if ( module != null ) {
moduleStr = module.getText();
}
if ( story != null ) {
storyStr = story.getText();
}
//创建禅道模版
ZentaoTemplet.setSavePath(path);
ZentaoTemplet.setFileName(name);
ZentaoTemplet.create();
ZentaoTemplet.readModlueData(new File(moduleStr));
ZentaoTemplet.readStoryData(new File(storyStr));
}
}

View File

@ -1,383 +0,0 @@
package pres.auxiliary.work.selenium.xml;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.InvalidXPathException;
import org.dom4j.io.SAXReader;
import org.openqa.selenium.By;
/**
* <p>
* <b>文件名</b>ReadXml.java
* </p>
* <p>
* <b>用途</b>该类用于从指定格式的xml中读取配制信息<br/>
*
* <b>注意</b>
* <ol>
* <li>标签的name必须唯一否则读取会出现错误
* <li>不同类型的定位模板可以使用一个id属性但同一种类型的定位模板id属性是唯一的如xpath模板可以使用id='1'css模板可以使用id='1'但另一xpath模板的id属性就不能再定为1但建议模板的id也唯一存在
* <li>元素定位标签只能写xpathcssclassnameidlinktextnametagname
* <li>所有标签均为小写
* <ol>
* </p>
* <p>
* <b>编码时间</b>2017年9月25日下午4:23:40
* </p>
* <p>
* <b>修改时间</b>2019年10月25日下午2:40:40
* </p>
*
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
*
*/
public class ReadXml {
/**
* 用于读取XML文件
*/
private Document dom;
/**
* 切分公式标记
*/
private final String SPLIT_START = "\\$\\{";
/**
* 定义xml文件中模板使用的替换符开始标志
*/
private final String START_SIGN = "${";
/**
* 定义xml文件中模板使用的替换符结束标志
*/
private final String END_SIGN = "}";
/**
* 存储xml文件类对象
*/
private File xmlFile;
/**
* 用于构造对象并设置xml文件
*
* @param xmlFile 指向xml文件的文件对象
*/
public ReadXml(File xmlFile) {
setXmlPath(xmlFile);
}
/**
* 保留无参构造不做任何操作
*/
public ReadXml() {
}
/**
* 该方法用于重新设置xml文件存放的路径并将Document对象指向新的XML文件
*
* @param xmlPath xml的存放路径
*/
public void setXmlPath(File xmlFile) {
// 重新构造Document对象使其指向新的XML文件
try {
dom = new SAXReader().read(xmlFile);
this.xmlFile = xmlFile;
} catch (DocumentException e) {
// 若抛出异常则将异常转换为自定义的IncorrectXMLFileException异常使其不需要在编译时处理
throw new IncorrectXmlPathException("XML文件不正确或XML路径不正确");
}
}
/**
* 用于返回相应的xml文件类对象
* @return xml文件类对象
*/
public File getXmlFile() {
return xmlFile;
}
/**
* 返回当前有效的元素定位标签
*
* @param name 元素名称
* @return 当前元素有效的定位名称多个标签名称以空格隔开
*/
public List<ByType> getElementMode(String name) {
// 用于存储元素定位方式的标签名称
List<ByType> modes = new ArrayList<>();
try {
@SuppressWarnings("unchecked")
// 由于窗体信息是以iframe标签进行存储故此处需要用*符号表示element和iframe标签
List<Element> elements = ((Element) dom.selectSingleNode("//*[@name='" + name + "']")).elements();
//移除iframe与element标签
elements = elements.stream().filter(element -> (!"iframe".equals(element.getName()) && !"element".equals(element.getName()))).collect(Collectors.toList());
// 循环查找控件名对应的标签
for (Element element : elements) {
// 若标签可用且标签内属性不为空则将该标签的名称存储在s中
if ((element.attribute("is_use") == null || element.attributeValue("is_use").equalsIgnoreCase("true"))) {
modes.add(getMode(element.getName()));
}
}
} catch (NullPointerException e) {
throw new UndefinedElementException();
}
// 返回元素存在的定位方式
return modes;
}
/**
* 根据元素名称在指定的xml文件中查找到相应的元素返回其元素的信息{@link By}类返回
*
* @param name 元素名称
* @param mode 定位方式枚举类对象参见{@link ByType}
* @return 元素对应的{@link By}类对象
*
* @throws UndefinedElementException 未找到相应的模板元素时抛出的异常
* @throws NoSuchSignValueException 模板中存在为定义值的标志时抛出的异常
*/
public By getBy(String name, ByType mode) {
return getBy(name, mode, null);
}
/**
* 根据元素名称在指定的xml文件中查找到相应的元素返回其元素的信息{@link By}类返回
*
* @param name 元素名称
* @param mode 定位方式枚举类对象参见{@link ByType}
* @param linkKeyList 外链关键词集合
* @return 元素对应的{@link By}类对象
*
* @throws UndefinedElementException 未找到相应的模板元素时抛出的异常
* @throws NoSuchSignValueException 模板中存在为定义值的标志时抛出的异常
*/
public By getBy(String name, ByType mode, List<String> linkKeyList) {
// 存储从xml文件中读取到的元素定位
String elementPos = getValue(name, mode, linkKeyList);
// 判断传入的参数是否符合使用By类的定位方式如果符合则拼接读取XML文件的xpath若不符则抛出异常
try {
switch (mode) {
case XPATH:
return By.xpath(elementPos);
case CSS:
return By.cssSelector(elementPos);
case ID:
return By.id(elementPos);
case LINKTEXT:
return By.linkText(elementPos);
case NAME:
return By.name(elementPos);
case TAGNAME:
return By.tagName(elementPos);
case CLASSNAME:
return By.className(elementPos);
default:
throw new IllegalArgumentException("未定义的元素定位方式:" + mode);
}
} catch (NullPointerException e) {
throw new UndefinedElementException("未找到元素定位方式");
}
}
/**
* 用于根据元素名称及定位方式来返回其定位方式的值
*
* @param name 元素名称
* @param mode 定位方式枚举类对象参见{@link ByType}
* @return xml文件中的相应元素的定位值
*
* @throws UndefinedElementException 未找到相应的模板元素时抛出的异常
* @throws NoSuchSignValueException 模板中存在为定义值的标志时抛出的异常
*/
public String getValue(String name, ByType mode) {
// 用于拼接读取XML中元素的xpath为了兼容iframe标签故此处使用*符号来查找元素
String xmlXpath = "//*[@name='" + name + "']/" + mode.getValue();
// 获取元素节点并将其转为Element对象以便于获取该元素的属性值
Element element = (Element) dom.selectSingleNode(xmlXpath);
// 判断元素是否使用模板是否存在模板ID若使用模板则根据传入的mode获取模板的定位方式
if (element.attribute("temp_id") != null) {
return getTempletPath(element, name, mode);
} else {
return element.getText();
}
}
/**
* 用于根据元素名称及定位方式查找其定位方式标签中的内容并根据关键词组对需要修改的关键词
* 逐个进行修改注意该方法将根据需要修改的关键词顺序进行修改与关键词名称无关
*
* @param name 元素名称
* @param mode 定位方式枚举类对象参见{@link ByType}
* @return xml文件中的相应元素的定位值
*
* @throws UndefinedElementException 未找到相应的模板元素时抛出的异常
* @throws NoSuchSignValueException 模板中存在为定义值的标志时抛出的异常
*/
public String getValue(String name, ByType mode, List<String> linkKeyList) {
//获取到元素定位方式内容
StringBuilder value = new StringBuilder(getValue(name, mode));
//判断linkKeyList是否为空或null若为空或null则直接返回
if (linkKeyList == null || linkKeyList.isEmpty()) {
return value.toString();
}
//按照公式起始符号对内容进行切分遍历切分后的每一个元素
String[] texts = value.toString().split(SPLIT_START);
//用于lambda中计算替换的词语位置
AtomicInteger index = new AtomicInteger(0);
//遍历texts
Arrays.stream(texts)
//过滤不包含END_SIGN的元素
.filter(text -> text.indexOf(END_SIGN) > -1)
//提取元素的有效替换词语${XXX}
.map(text -> START_SIGN + text.substring(0, text.indexOf(END_SIGN) + 1))
//对词语进行替换
.forEach(text -> {
//判断当前下标是否超出linkKeyList最大元素个数若超出则结束当前执行
if (index.get() >= linkKeyList.size()) {
return;
}
//获取该字段在value中第一次出现的位置
int signIndex = value.indexOf(text);
// 将所有与该标志替换为元素属性中存储的内容使用拼接的方式进行替换
value.replace(signIndex, signIndex + text.length(), linkKeyList.get(index.getAndAdd(1)));
});
return value.toString();
}
/**
* 返回元素的所在的窗体
* @param name 元素在xml文件中的名称
* @return 元素所在的窗体
*/
public String getIframeName(String name) {
// 获取元素节点并将其转为Element对象以便于获取该元素的属性值
Element element = (Element) dom.selectSingleNode("//*[@name='" + name + "']");
// 存储元素所在的窗体的名称若元素未在任何窗体下则其为空
String iframeName = "";
// 获取元素所在的窗体层级由于当前元素定位到元素定位标签上父节点元素应是element或iframe需要再获取一次父层其结构才正确
Element iframeElement = element.getParent();
// 判断iframeElement是否为根元素若不为根元素则存储其元素的name属性
if (!iframeElement.isRootElement()) {
iframeName = iframeElement.attributeValue("name");
}
return iframeName;
}
/**
* 该方法用于判断当前查找的元素是否存在于xml文件中
* @return 元素是否存在于xml
*/
public boolean isElement(String name) {
//获取元素的xpath查找所有带name属性的与传入的name相同元素
String xpath = "//*[@name='" + name + "']";
//若不存在该节点则返回false反之则返回true
try {
if (dom.getRootElement().selectSingleNode(xpath) == null) {
return false;
} else {
return true;
}
} catch (InvalidXPathException e) {
//当写入name为一个xpath时会抛出该异常若存在该异常则直接返回false
return false;
}
}
/**
* 用于模板的元素的定位查找返回其相应的定位
*
* @param element 通过name定位得到的元素对象
* @param name 元素的名称
* @param mode 元素的定位方式名称
* @return 定位方式对应的元素定位
*
* @throws UndefinedElementException 未找到相应的模板元素时抛出的异常
* @throws NoSuchSignValueException 模板中存在为定义值的标志时抛出的异常
*/
@SuppressWarnings("unchecked")
private String getTempletPath(Element element, String name, ByType mode) {
// 通过元素的temp_id定位到模板的id上
Element templetElement = (Element) dom.selectSingleNode(
"//templet/" + mode.getValue() + "[@id='" + element.attribute("temp_id").getValue() + "']");
// 如果templetElement元素为null无法查找到则抛出UndefinedElementException
if (templetElement == null) {
throw new UndefinedElementException("未定义的模板,元素定位方式为:" + mode.getValue() + "模板id为"
+ element.attribute("temp_id").getValue() + ";该模板未定义");
}
// 添加元素相应的属性
HashMap<String, String> attElements = new HashMap<>(16);
attElements.put("name", name);
// 循环遍历元素的所有的属性并将属性一一存入attElements中
for (Attribute att : (List<Attribute>) element.attributes()) {
attElements.put(att.getName(), att.getValue());
}
// 获取模板的内容
String path = templetElement.getText();
//按照公式起始符号对内容进行切分遍历切分后的每一个元素
String[] texts = path.split(SPLIT_START);
for (int i = 0; i < texts.length; i++) {
//判断切分的元素是否包含公式结束符号
int index;
if ((index = texts[i].indexOf(END_SIGN)) > -1) {
//截取有效字符串对关键词进行替换
String sign = texts[i].substring(0, index);
// 判断该标志名称是否存储在attElements中若不存在则抛出异常
if (attElements.containsKey(sign)) {
// 将所有与该标志相关的全部替换为元素属性中存储的内容
path = path.replaceAll("\\$\\{" + sign + "\\}", attElements.get(sign));
}
}
}
return path;
}
/**
* 根据xml内容标签名称获取相应的ElementLocationType枚举
* @param modeName 定位标签名称
* @return ElementLocationType枚举
*/
private static ByType getMode(String modeName) {
switch (modeName) {
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("Unexpected value: " + modeName);
}
}
}

View File

@ -1,38 +0,0 @@
package pres.auxiliary.work.selenium.xml;
/**
* 该异常在查找到相同文件名时抛出的异常
* @author 彭宇琦
* @version Ver1.0
*/
public class RepeatedXmlFileNameException extends RuntimeException {
private static final long serialVersionUID = 1L;
public RepeatedXmlFileNameException() {
super();
// TODO Auto-generated constructor stub
}
public RepeatedXmlFileNameException(String arg0, Throwable arg1,
boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
// TODO Auto-generated constructor stub
}
public RepeatedXmlFileNameException(String arg0, Throwable arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public RepeatedXmlFileNameException(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public RepeatedXmlFileNameException(Throwable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
}

View File

@ -1,38 +0,0 @@
package pres.auxiliary.work.selenium.xml;
/**
* <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>
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
*
*/
public class UndefinedElementException extends RuntimeException {
public UndefinedElementException() {
super();
}
public UndefinedElementException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public UndefinedElementException(String message, Throwable cause) {
super(message, cause);
}
public UndefinedElementException(String message) {
super(message);
}
public UndefinedElementException(Throwable cause) {
super(cause);
}
private static final long serialVersionUID = 1L;
}

View File

@ -1,40 +0,0 @@
package pres.auxiliary.work.selenium.xml;
/**
* 若传入的模型参数有误时抛出的异常
* @author 彭宇琦
* @version V1.0
*
*/
public class UndefinedModeException extends RuntimeException {
private static final long serialVersionUID = 1L;
public UndefinedModeException() {
super();
// TODO Auto-generated constructor stub
}
public UndefinedModeException(String arg0, Throwable arg1, boolean arg2,
boolean arg3) {
super(arg0, arg1, arg2, arg3);
// TODO Auto-generated constructor stub
}
public UndefinedModeException(String arg0, Throwable arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public UndefinedModeException(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public UndefinedModeException(Throwable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
}

View File

@ -1,38 +0,0 @@
package pres.auxiliary.work.selenium.xml;
/**
* 该异常提示用户需要检查xml文件是否为空
* @author 彭宇琦
* @version Ver1.0
*/
public class XmlFileNameIsNullException extends Exception {
private static final long serialVersionUID = 1L;
public XmlFileNameIsNullException() {
super();
// TODO Auto-generated constructor stub
}
public XmlFileNameIsNullException(String arg0, Throwable arg1,
boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
// TODO Auto-generated constructor stub
}
public XmlFileNameIsNullException(String arg0, Throwable arg1) {
super(arg0, arg1);
// TODO Auto-generated constructor stub
}
public XmlFileNameIsNullException(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public XmlFileNameIsNullException(Throwable arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
}