完善读取xml文件中元素定位内容的方法,以及相应的单元测试,并删除无效的异常类
This commit is contained in:
parent
ed403b6e53
commit
f90362a016
|
@ -23,7 +23,6 @@
|
|||
<classpathentry kind="lib" path="lib/beautyeye_lnf.jar"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
|
|
|
@ -51,11 +51,11 @@ public class ElementData {
|
|||
this.name = name;
|
||||
|
||||
//根据传入的读取配置文件类对象,使用其中的返回方法,初始化元素信息
|
||||
byTypeList = arc.getElementByTypeList(name);
|
||||
valueList = arc.getValueList(name);
|
||||
elementType = arc.getElementType(name);
|
||||
iframeNameList = arc.getIframeNameList(name);
|
||||
waitTime = arc.getWaitTime(name);
|
||||
byTypeList = arc.findElementByTypeList(name);
|
||||
valueList = arc.findValueList(name);
|
||||
elementType = arc.findElementType(name);
|
||||
iframeNameList = arc.findIframeNameList(name);
|
||||
waitTime = arc.findWaitTime(name);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -21,31 +21,31 @@ public abstract class AbstractRead {
|
|||
* 用于返回元素的所有定位方式集合
|
||||
* @return 元素的所有定位方式({@link ByType}枚举)集合
|
||||
*/
|
||||
public abstract ArrayList<ByType> getElementByTypeList(String name);
|
||||
public abstract ArrayList<ByType> findElementByTypeList(String name);
|
||||
|
||||
/**
|
||||
* 用于返回与定位方式对应的元素定位内容集合
|
||||
* @return 元素定位内容集合
|
||||
*/
|
||||
public abstract ArrayList<String> getValueList(String name);
|
||||
public abstract ArrayList<String> findValueList(String name);
|
||||
|
||||
/**
|
||||
* 用于返回元素的类型
|
||||
* @return 元素类型({@link ElementType}枚举)
|
||||
*/
|
||||
public abstract ElementType getElementType(String name);
|
||||
public abstract ElementType findElementType(String name);
|
||||
|
||||
/**
|
||||
* 用于返回元素的所有父窗体名称集合
|
||||
* @return 元素的所有父窗体名称集合
|
||||
*/
|
||||
public abstract ArrayList<String> getIframeNameList(String name);
|
||||
public abstract ArrayList<String> findIframeNameList(String name);
|
||||
|
||||
/**
|
||||
* 用于返回元素的等待时间
|
||||
* @return 元素的等待时间
|
||||
*/
|
||||
public abstract long getWaitTime(String name);
|
||||
public abstract long findWaitTime(String name);
|
||||
|
||||
/**
|
||||
* 用于将读取到的元素类型的文本值转换为元素类型枚举类对象
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
package pres.auxiliary.work.selenium.location;
|
||||
|
||||
/**
|
||||
* 该异常在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
|
||||
}
|
||||
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
package pres.auxiliary.work.selenium.location;
|
||||
|
||||
/**
|
||||
* <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);
|
||||
}
|
||||
}
|
|
@ -3,8 +3,8 @@ package pres.auxiliary.work.selenium.location;
|
|||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.dom4j.Attribute;
|
||||
import org.dom4j.Document;
|
||||
import org.dom4j.DocumentException;
|
||||
import org.dom4j.Element;
|
||||
|
@ -48,6 +48,23 @@ public class ReadXml extends AbstractRead {
|
|||
*/
|
||||
private Document dom;
|
||||
|
||||
/**
|
||||
* 定义用于正则的替换符开始标记
|
||||
*/
|
||||
public static final String MATCH_START_SIGN = "\\$\\{";
|
||||
/**
|
||||
* 定义替换符开始标志
|
||||
*/
|
||||
public static final String START_SIGN = "${";
|
||||
/**
|
||||
* 定义用于正则的替换符结束标记
|
||||
*/
|
||||
public static final String MATCH_END_SIGN = "\\}";
|
||||
/**
|
||||
* 定义替换符结束标志
|
||||
*/
|
||||
public static final String END_SIGN = "}";
|
||||
|
||||
/**
|
||||
* 构造对象
|
||||
* @param xmlFile xml文件对象
|
||||
|
@ -64,7 +81,7 @@ public class ReadXml extends AbstractRead {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<ByType> getElementByTypeList(String name) {
|
||||
public ArrayList<ByType> findElementByTypeList(String name) {
|
||||
ArrayList<ByType> byTypeList = new ArrayList<ByType>();
|
||||
//查询元素
|
||||
Element element = getElementLabelElement(name);
|
||||
|
@ -78,22 +95,33 @@ public class ReadXml extends AbstractRead {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<String> getValueList(String name) {
|
||||
public ArrayList<String> findValueList(String name) {
|
||||
ArrayList<String> valueList = new ArrayList<>();
|
||||
//查询元素
|
||||
Element element = getElementLabelElement(name);
|
||||
|
||||
//遍历元素下所有的定位标签,并将其转换为相应的ByType枚举,存储至byTypeList中
|
||||
for (Object byElement : element.elements()) {
|
||||
valueList.add(((Element)byElement).getText());
|
||||
//TODO 获取到元素内容后需要判断元素是否需要读取模板
|
||||
//判断元素是否启用,若元素未启用,则下一个循环
|
||||
String isUserText = ((Element) byElement).attributeValue("is_user");
|
||||
if (isUserText != null && !Boolean.valueOf(isUserText)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//判断元素是否启用模板,若启用模板,则获取模板内容,并将定位内容进行转换
|
||||
String tempId = ((Element) byElement).attributeValue("temp_id");
|
||||
String value = tempId != null ?
|
||||
getTemplateValue(tempId, getByType(((Element) byElement).getName())) :
|
||||
((Element)byElement).getText();
|
||||
|
||||
valueList.add(replaceValue(((Element) byElement), value));
|
||||
}
|
||||
|
||||
return valueList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementType getElementType(String name) {
|
||||
public ElementType findElementType(String name) {
|
||||
//查询元素
|
||||
Element element = getElementLabelElement(name);
|
||||
//若元素标签为iframe,则无法获取属性,直接赋予窗体类型
|
||||
|
@ -108,7 +136,7 @@ public class ReadXml extends AbstractRead {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<String> getIframeNameList(String name) {
|
||||
public ArrayList<String> findIframeNameList(String name) {
|
||||
//查询元素
|
||||
Element element = getElementLabelElement(name);
|
||||
|
||||
|
@ -131,7 +159,7 @@ public class ReadXml extends AbstractRead {
|
|||
}
|
||||
|
||||
@Override
|
||||
public long getWaitTime(String name) {
|
||||
public long findWaitTime(String name) {
|
||||
//查询元素
|
||||
Element element = getElementLabelElement(name);
|
||||
//获取元素存储等待时间属性值,并转换为long类型
|
||||
|
@ -168,7 +196,7 @@ public class ReadXml extends AbstractRead {
|
|||
case "tagname":
|
||||
return ByType.TAGNAME;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unexpected value: " + labelName);
|
||||
throw new IllegalArgumentException("不存在的定位方式: " + labelName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -176,11 +204,65 @@ public class ReadXml extends AbstractRead {
|
|||
* 用于返回元素标签对象
|
||||
* @param name 元素名称
|
||||
* @return 相应的元素标签类对象
|
||||
* @throws UndefinedElementException 元素不存在时抛出的异常
|
||||
*/
|
||||
private Element getElementLabelElement(String name) {
|
||||
//定义获取元素的xpath
|
||||
String selectElementXpath = "//*[@name='" + name +"']";
|
||||
//根据xpath获取元素,若无法获取到元素,则抛出空指针异常
|
||||
return Optional.of((Element) dom.selectSingleNode(selectElementXpath)).get();
|
||||
//根据xpath获取元素,若无法获取到元素,则抛出异常
|
||||
Element element = (Element) dom.selectSingleNode(selectElementXpath);
|
||||
if (element != null) {
|
||||
return element;
|
||||
} else {
|
||||
throw new UndefinedElementException("不存在的元素名称:" + name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取模板中的定位内容
|
||||
* @param tempId 模板id
|
||||
* @param byType 定位方式枚举
|
||||
* @return 相应的定位内容
|
||||
* @throws UndefinedElementException 模板不存在时抛出的异常
|
||||
*/
|
||||
private String getTemplateValue(String tempId, ByType byType) {
|
||||
String selectTempXpath = "//templet/" + byType.getValue() + "[@id='" + tempId + "']";
|
||||
//根据xpath获取元素,若无法获取到元素,则抛出异常
|
||||
Element element = (Element) dom.selectSingleNode(selectTempXpath);
|
||||
if (element != null) {
|
||||
return element.getText();
|
||||
} else {
|
||||
throw new UndefinedElementException("不存在的模板:" + selectTempXpath);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 用于对获取的元素内容进行转换,得到完整的定位内容
|
||||
* @param element 元素类对象
|
||||
* @param value 定位内容
|
||||
* @return 完整的定位内容
|
||||
*/
|
||||
private String replaceValue(Element element, String value) {
|
||||
//判断元素是否存在需要替换的内容,若不存在,则不进行替换
|
||||
if (value.indexOf(START_SIGN) == -1) {
|
||||
return value;
|
||||
}
|
||||
|
||||
String repalceText = "";
|
||||
|
||||
//遍历元素的所有属性,并一一进行替换
|
||||
for (Object att : element.attributes()) {
|
||||
//定义属性替换符
|
||||
repalceText = MATCH_START_SIGN + ((Attribute) att).getName() + MATCH_END_SIGN;
|
||||
//替换value中所有与repalceText匹配的字符
|
||||
value = value.replaceAll(repalceText, ((Attribute) att).getValue());
|
||||
}
|
||||
|
||||
//替换父层节点的name属性
|
||||
repalceText = MATCH_START_SIGN + "name" + MATCH_END_SIGN;
|
||||
//替换value中所有与repalceText匹配的字符
|
||||
value = value.replaceAll(repalceText, element.getParent().attributeValue("name"));
|
||||
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
package pres.auxiliary.work.selenium.location;
|
||||
|
||||
/**
|
||||
* 该异常在查找到相同文件名时抛出的异常
|
||||
* @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
|
||||
}
|
||||
|
||||
}
|
|
@ -1,95 +1,124 @@
|
|||
package pres.auxiliary.work.selenium.location;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* <p><b>文件名:</b>ReadXmlTest.java</p>
|
||||
* <p><b>用途:</b>用于对{@link ReadXml}类进行测试</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 {
|
||||
private final File XML_FILE = new File("src/test/java/pres/auxiliary/work/selenium/location/测试用xml文件.xml");
|
||||
/**
|
||||
* 定义类
|
||||
*/
|
||||
ReadXml rx;
|
||||
|
||||
/**
|
||||
* 初始化数据
|
||||
*/
|
||||
@BeforeClass
|
||||
public void init() {
|
||||
rx = new ReadXml(XML_FILE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#getElementByTypeList(String)}方法
|
||||
* 预期:
|
||||
* XPATH
|
||||
* CSS
|
||||
* XPATH
|
||||
*/
|
||||
@Test
|
||||
public void getElementByTypeListTest() {
|
||||
rx.getElementByTypeList("XX控件11").forEach(System.out :: println);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#getElementType(String)}方法
|
||||
* 预期:
|
||||
* COMMON_ELEMENT
|
||||
* COMMON_ELEMENT
|
||||
* DATA_LIST_ELEMENT
|
||||
* SELECT_DATAS_ELEMENT
|
||||
* SELECT_OPTION_ELEMENT
|
||||
* IFRAME_ELEMENT
|
||||
*/
|
||||
@Test
|
||||
public void getElementTypeTest() {
|
||||
System.out.println(rx.getElementType("XX控件11"));
|
||||
System.out.println(rx.getElementType("XX控件16"));
|
||||
System.out.println(rx.getElementType("XX控件17"));
|
||||
System.out.println(rx.getElementType("XX控件18"));
|
||||
System.out.println(rx.getElementType("XX控件19"));
|
||||
System.out.println(rx.getElementType("窗体3"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#getIframeNameList(String)}方法
|
||||
* 预期:
|
||||
* 窗体1
|
||||
* 窗体1.1
|
||||
* 窗体1.1.1
|
||||
*/
|
||||
@Test
|
||||
public void getIframeNameListTest() {
|
||||
rx.getIframeNameList("XX控件6").forEach(System.out :: println);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#getWaitTime(String)}方法
|
||||
* 预期:
|
||||
* -1
|
||||
* 100
|
||||
* 1
|
||||
* 0
|
||||
* -1
|
||||
* -1
|
||||
*/
|
||||
@Test
|
||||
public void getWaitTimeTest() {
|
||||
System.out.println(rx.getWaitTime("XX控件14"));
|
||||
System.out.println(rx.getWaitTime("XX控件15"));
|
||||
System.out.println(rx.getWaitTime("XX控件16"));
|
||||
System.out.println(rx.getWaitTime("XX控件17"));
|
||||
System.out.println(rx.getWaitTime("XX控件18"));
|
||||
System.out.println(rx.getWaitTime("XX控件19"));
|
||||
}
|
||||
}
|
||||
package pres.auxiliary.work.selenium.location;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* <p><b>文件名:</b>ReadXmlTest.java</p>
|
||||
* <p><b>用途:</b>用于对{@link ReadXml}类进行测试</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 {
|
||||
private final File XML_FILE = new File("src/test/java/pres/auxiliary/work/selenium/location/测试用xml文件.xml");
|
||||
/**
|
||||
* 定义类
|
||||
*/
|
||||
ReadXml rx;
|
||||
|
||||
/**
|
||||
* 初始化数据
|
||||
*/
|
||||
@BeforeClass
|
||||
public void init() {
|
||||
rx = new ReadXml(XML_FILE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#findElementByTypeList(String)}方法
|
||||
* 预期:
|
||||
* XPATH
|
||||
* CSS
|
||||
* XPATH
|
||||
*/
|
||||
@Test
|
||||
public void findElementByTypeListTest() {
|
||||
rx.findElementByTypeList("XX控件11").forEach(System.out :: println);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#findElementType(String)}方法
|
||||
* 预期:
|
||||
* COMMON_ELEMENT
|
||||
* COMMON_ELEMENT
|
||||
* DATA_LIST_ELEMENT
|
||||
* SELECT_DATAS_ELEMENT
|
||||
* SELECT_OPTION_ELEMENT
|
||||
* IFRAME_ELEMENT
|
||||
*/
|
||||
@Test
|
||||
public void findElementTypeTest() {
|
||||
System.out.println(rx.findElementType("XX控件11"));
|
||||
System.out.println(rx.findElementType("XX控件16"));
|
||||
System.out.println(rx.findElementType("XX控件17"));
|
||||
System.out.println(rx.findElementType("XX控件18"));
|
||||
System.out.println(rx.findElementType("XX控件19"));
|
||||
System.out.println(rx.findElementType("窗体3"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#findIframeNameList(String)}方法
|
||||
* 预期:
|
||||
* 窗体1
|
||||
* 窗体1.1
|
||||
* 窗体1.1.1
|
||||
*/
|
||||
@Test
|
||||
public void findIframeNameListTest() {
|
||||
rx.findIframeNameList("XX控件6").forEach(System.out :: println);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#findWaitTime(String)}方法
|
||||
* 预期:
|
||||
* -1
|
||||
* 100
|
||||
* 1
|
||||
* 0
|
||||
* -1
|
||||
* -1
|
||||
*/
|
||||
@Test
|
||||
public void findWaitTimeTest() {
|
||||
System.out.println(rx.findWaitTime("XX控件14"));
|
||||
System.out.println(rx.findWaitTime("XX控件15"));
|
||||
System.out.println(rx.findWaitTime("XX控件16"));
|
||||
System.out.println(rx.findWaitTime("XX控件17"));
|
||||
System.out.println(rx.findWaitTime("XX控件18"));
|
||||
System.out.println(rx.findWaitTime("XX控件19"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试{@link ReadXml#findValueList(String)}方法
|
||||
* 预期:
|
||||
* //XXX模板控件1[@X='XX控件11']/div/div[@src='Test']/input
|
||||
* http body div
|
||||
* //XXX模板控件1[@X='${src}']/div[@name='XX控件11']
|
||||
* 测试控件
|
||||
*/
|
||||
@Test
|
||||
public void findValueListTest() {
|
||||
rx.findValueList("XX控件11").forEach(System.out :: println);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试查找不存在的元素
|
||||
*/
|
||||
@Test(expectedExceptions = UndefinedElementException.class)
|
||||
public void noElementTest() {
|
||||
rx.findElementByTypeList("呵呵");
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试查找不存在的模板
|
||||
*/
|
||||
@Test(expectedExceptions = UndefinedElementException.class)
|
||||
public void noTemplateTest() {
|
||||
rx.findValueList("XX控件20");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,102 +1,108 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="">
|
||||
<templet>
|
||||
<xpath id='1'>//XXX模板控件1[@X='${name}']/div/div[@${att}='${id}']/input</xpath>
|
||||
<css id='2'>http body ${tagName}</css>
|
||||
<xpath id='3'>//XXX模板控件1[@X='${src}']/div[@name='${name}']</xpath>
|
||||
<xpath id='4'>//XXX模板控件1[@X='${src}']/div[@name='${name}']/div[@is='${str1}' and text()='${str1}']</xpath>
|
||||
<xpath id='5'>//XXX模板控件1[@X='${src}']/div[@name='${name}']/div[@is='${str1}' and text()='${src}']/span[text()='${str2}']/span[id='${aaaa}']</xpath>
|
||||
</templet>
|
||||
|
||||
<element name='XX控件1'>
|
||||
<xpath is_use='true'>//XX控件1[@X='XXXX']</xpath>
|
||||
</element>
|
||||
|
||||
<iframe name='窗体1' >
|
||||
<xpath is_use='true'>//窗体1[@X='XXXX']</xpath>
|
||||
<css temp_id='2' tagName='iframe'/>
|
||||
|
||||
<element name='XX控件2'>
|
||||
<xpath is_use='true'>//XX控件2[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件3'>
|
||||
<xpath is_use='true'>//XXX控件3[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<iframe name='窗体1.1' >
|
||||
<xpath is_use='true'>//窗体1.1[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件4'>
|
||||
<xpath is_use='true'>//XXX控件4[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件5'>
|
||||
<xpath is_use='true'>//XXX控件5[@X='XXXX']</xpath>
|
||||
</element>
|
||||
|
||||
<iframe name='窗体1.1.1' >
|
||||
<xpath is_use='true'>//窗体1.1.1[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件6'>
|
||||
<xpath is_use='true'>//XXX控件6[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件7'>
|
||||
<xpath is_use='true'>//XXX控件7[@X='XXXX']</xpath>
|
||||
</element>
|
||||
</iframe>
|
||||
</iframe>
|
||||
<iframe name='窗体1.2' >
|
||||
<xpath is_use='true'>//窗体1.2[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件8'>
|
||||
<xpath is_use='true'>//XXX控件8[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件9'>
|
||||
<xpath is_use='true'>//XXX控件9[@X='XXXX']</xpath>
|
||||
</element>
|
||||
</iframe>
|
||||
</iframe>
|
||||
|
||||
<iframe name='窗体2' >
|
||||
<xpath is_use='true'>//窗体2[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件10'>
|
||||
<xpath is_use='true'>//XXX控件10[@X='XXXX']</xpath>
|
||||
</element>
|
||||
|
||||
<element name='XX控件11'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
<css is_use='true' temp_id='2' tagName='div'/>
|
||||
<xpath is_use='true' temp_id='3' />
|
||||
</element>
|
||||
|
||||
<element name='XX控件12'>
|
||||
<xpath is_use='true' temp_id='3' />
|
||||
</element>
|
||||
</iframe>
|
||||
|
||||
<iframe name='窗体3' >
|
||||
<xpath is_use='true'>//窗体3[@X='${ccc}']</xpath>
|
||||
|
||||
<element name='XX控件13'>
|
||||
<xpath is_use='true' temp_id='3' />
|
||||
</element>
|
||||
<element name='XX控件14'>
|
||||
<xpath is_use='true' temp_id='4' />
|
||||
</element>
|
||||
<element name='XX控件15' wait='100'>
|
||||
<xpath is_use='true' temp_id='5' />
|
||||
</element>
|
||||
|
||||
<element name='XX控件16' element_type='0' wait='1'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
<element name='XX控件17' element_type='1' wait='0'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
<element name='XX控件18' element_type='2' wait='-11'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
<element name='XX控件19' element_type='3' wait='ddsf'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
</iframe>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="">
|
||||
<templet>
|
||||
<xpath id='1'>//XXX模板控件1[@X='${name}']/div/div[@${att}='${id}']/input</xpath>
|
||||
<css id='2'>http body ${tagName}</css>
|
||||
<xpath id='3'>//XXX模板控件1[@X='${src}']/div[@name='${name}']</xpath>
|
||||
<xpath id='4'>//XXX模板控件1[@X='${src}']/div[@name='${name}']/div[@is='${str1}' and text()='${str1}']</xpath>
|
||||
<xpath id='5'>//XXX模板控件1[@X='${src}']/div[@name='${name}']/div[@is='${str1}' and text()='${src}']/span[text()='${str2}']/span[id='${aaaa}']</xpath>
|
||||
<id id='6'>${name}</id>
|
||||
</templet>
|
||||
|
||||
<element name='XX控件1'>
|
||||
<xpath is_use='true'>//XX控件1[@X='XXXX']</xpath>
|
||||
</element>
|
||||
|
||||
<iframe name='窗体1' >
|
||||
<xpath is_use='true'>//窗体1[@X='XXXX']</xpath>
|
||||
<css temp_id='2' tagName='iframe'/>
|
||||
|
||||
<element name='XX控件2'>
|
||||
<xpath is_use='true'>//XX控件2[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件3'>
|
||||
<xpath is_use='true'>//XXX控件3[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<iframe name='窗体1.1' >
|
||||
<xpath is_use='true'>//窗体1.1[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件4'>
|
||||
<xpath is_use='true'>//XXX控件4[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件5'>
|
||||
<xpath is_use='true'>//XXX控件5[@X='XXXX']</xpath>
|
||||
</element>
|
||||
|
||||
<iframe name='窗体1.1.1' >
|
||||
<xpath is_use='true'>//窗体1.1.1[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件6'>
|
||||
<xpath is_use='true'>//XXX控件6[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件7'>
|
||||
<xpath is_use='true'>//XXX控件7[@X='XXXX']</xpath>
|
||||
</element>
|
||||
</iframe>
|
||||
</iframe>
|
||||
<iframe name='窗体1.2' >
|
||||
<xpath is_use='true'>//窗体1.2[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件8'>
|
||||
<xpath is_use='true'>//XXX控件8[@X='XXXX']</xpath>
|
||||
</element>
|
||||
<element name='XX控件9'>
|
||||
<xpath is_use='true'>//XXX控件9[@X='XXXX']</xpath>
|
||||
</element>
|
||||
</iframe>
|
||||
</iframe>
|
||||
|
||||
<iframe name='窗体2' >
|
||||
<xpath is_use='true'>//窗体2[@X='XXXX']</xpath>
|
||||
|
||||
<element name='XX控件10'>
|
||||
<xpath is_use='true'>//XXX控件10[@X='XXXX']</xpath>
|
||||
</element>
|
||||
|
||||
<element name='XX控件11'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
<css is_use='true' temp_id='2' tagName='div'/>
|
||||
<xpath is_use='true' temp_id='3' />
|
||||
<id temp_id='6' name='测试控件'/>
|
||||
</element>
|
||||
|
||||
<element name='XX控件12'>
|
||||
<xpath is_use='true' temp_id='3' />
|
||||
</element>
|
||||
</iframe>
|
||||
|
||||
<iframe name='窗体3' >
|
||||
<xpath is_use='true'>//窗体3[@X='${ccc}']</xpath>
|
||||
|
||||
<element name='XX控件13'>
|
||||
<xpath is_use='true' temp_id='3' />
|
||||
</element>
|
||||
<element name='XX控件14'>
|
||||
<xpath is_use='true' temp_id='4' />
|
||||
</element>
|
||||
<element name='XX控件15' wait='100'>
|
||||
<xpath is_use='true' temp_id='5' />
|
||||
</element>
|
||||
|
||||
<element name='XX控件16' element_type='0' wait='1'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
<element name='XX控件17' element_type='1' wait='0'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
<element name='XX控件18' element_type='2' wait='-11'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
<element name='XX控件19' element_type='3' wait='ddsf'>
|
||||
<xpath is_use='true' temp_id='1' id='Test' att='src'/>
|
||||
</element>
|
||||
|
||||
<element name='XX控件20' element_type='3' wait='ddsf'>
|
||||
<xpath is_use='true' temp_id='测试' id='Test' att='src'/>
|
||||
</element>
|
||||
</iframe>
|
||||
</project>
|
Loading…
Reference in New Issue