完善读取xml文件中元素定位内容的方法,以及相应的单元测试,并删除无效的异常类

This commit is contained in:
彭宇琦 2020-10-10 07:49:48 +08:00
parent ed403b6e53
commit f90362a016
9 changed files with 334 additions and 333 deletions

View File

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

View File

@ -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);
}
/**

View File

@ -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);
/**
* 用于将读取到的元素类型的文本值转换为元素类型枚举类对象

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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