diff --git a/ConfigurationFiles/SeleniumConfigurationFile/LogConfiguration/ExcelRecordTemplet.xml b/ConfigurationFiles/SeleniumConfigurationFile/LogConfiguration/ExcelRecordTemplet.xml
index 126fd90..414a707 100644
--- a/ConfigurationFiles/SeleniumConfigurationFile/LogConfiguration/ExcelRecordTemplet.xml
+++ b/ConfigurationFiles/SeleniumConfigurationFile/LogConfiguration/ExcelRecordTemplet.xml
@@ -32,9 +32,9 @@
文件名:Page.java 用途:用于存储对浏览器加载的页面信息以及页面操作 编码时间:2020年4月10日上午8:02:45 修改时间:2020年4月10日上午8:02:45 修改时间:2020年10月12日下午8:02:45 文件名:AbstractElement.java
- * 通过传入在xml文件中的控件名称,到类中指向的xml文件中查找控件
- * 名称对应的定位方式,或直接传入xpath与css定位方式,
- * 根据定位方式对相应的窗体进行定位。当传入的窗体为当前窗体的前层(父层)窗体时,
- * 通过该方法将调用切换父层的方法,将窗体切换到父层上,例如:
- * 若传入该方法的名称存在于xml文件中,且该元素存在父窗体时,调用
- * 该方法会从xml文件中获取相应所有父窗体,并对相应的父窗体进行切换,
- * 从而达到无须切换父窗体的目的,例如,存在以下xml文件片段:
- * 当前存在f1, f2, f3, f4四层窗体,则调用方法:
{@code
- * switchFrame("f2");
- * }
- * 此时窗体将回到f2层,无需再从顶层开始向下切换。
- * {@code
- * ...
- *
- * ...
- * }
- * 当调用该方法:
{@code
- * switchFrame("f3");
- * }
- * 时,则会先将窗体从f1开始切换,至窗体f2,最后再切换为窗体f3
- *
{@code - * List- * 此时窗体将回到f2层,无需再从顶层开始向下切换。nameList = new ArrayList (); - * nameList.add("f2"); - * switchFrame(nameList); - * }
- * 用于根据传入的控件名称或定位方式,对控件在页面上定位,返回其WebElement对象。形参可以传入在xml文件中元素的名称, - * 亦可以传入页面元素的定位方式,但目前识别只支持xpath和css两种方式。 - * 该方法获取的是一组元素,可用于对列表元素事件中。 - *
- *
- * 元素识别判断方式按照以下步骤进行:
- * 1.先对xml文件进行扫描,若存在该元素对应的标签,则读取xml文件的定位方式,并识别有效的定位方式一一匹配,直到正确为止;
- * 2.若在xml文件中查找不到该元素,则按照xpath和css的规则进行匹配,直到判断出该元素的定位方式位置;
- * 3.若仍找不到元素,则抛出UnrecognizableLocationModeException
- *
文件名:AbstractElement.java
+ * 根据传入的定位方式枚举,以及定位内容,在页面查找 + * 元素,返回查到的元素列表,若查不到元素,则返回空列表 + * @param byType {@link ByType}枚举类 + * @param value 元素定位内容 + * @param waitTime 元素查找超时时间 + * @return 页面查找到的{@link WebElement}类对象{@link List}集合 + */ + protected List文件名:AbstractBy.java
*用途: - * 存储获取元素时的信息 + * 用于存储通过元素信息查找到的元素内容 *
- *编码时间:2020年5月9日上午7:57:24
- *修改时间:2020年5月22日上午8:18:39
+ *编码时间:2020年10月13日上午8:02:38
+ *修改时间:2020年10月13日上午8:02:38
* @author 彭宇琦 - * @version Ver1.1 - * @since JDK 1.8 + * @version Ver1.0 * */ - class ElementInformation { + public class Element { /** - * 存储元素的名称或定位内容 + * 存储元素的获取下标 */ - public String name; - /** - * 存储元素的定位方式 - */ - public ByType byType; - /** - * 用于标记元素的类型 - */ - public ElementType elementType; - /** - * 存储外链词语 - */ - public ArrayList文件名:AbstractElement.java
- *用途:
- *对辅助化测试工具selenium的获取元素代码进行的二次封装,通过类中提供的方法以及配合相应存储元素的 - * xml文件,以更简便的方式对页面元素进行获取,减少编程时的代码量。 - *
- *编码时间:2020年4月25日 下午4:18:37
- *修改时间:2020年4月25日 下午4:18:37
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 1.8 - */ -public abstract class AbstractElement { - /** - * 用于存储浏览器的WebDriver对象 - */ - WebDriver driver; - /** - * 用于存储元素信息,由于 - */ - static ElementData elementData; - - /** - * 用于存储浏览器对象 - */ - static AbstractBrower brower; - /** - * 存储单个控件的等待时间 - */ - private HashMap
- * 通过传入在xml文件中的控件名称,到类中指向的xml文件中查找控件
- * 名称对应的定位方式,或直接传入xpath与css定位方式,
- * 根据定位方式对相应的窗体进行定位。当传入的窗体为当前窗体的前层(父层)窗体时,
- * 通过该方法将调用切换父层的方法,将窗体切换到父层上,例如:
- * 当前存在f1, f2, f3, f4四层窗体,则调用方法:
{@code
- * switchFrame("f2");
- * }
- * 此时窗体将回到f2层,无需再从顶层开始向下切换。
- *
- * 若传入该方法的名称存在于xml文件中,且该元素存在父窗体时,调用 - * 该方法会从xml文件中获取相应所有父窗体,并对相应的父窗体进行切换, - * 从而达到无须切换父窗体的目的,例如,存在以下xml文件片段:
{@code - * ... - *- * 当调用该方法:- * - * ... - * }... - *- * - *... - *- * - *... - *
{@code - * List- * 此时窗体将回到f2层,无需再从顶层开始向下切换。nameList = new ArrayList (); - * nameList.add("f2"); - * switchFrame(nameList); - * }
- * 用于根据传入的控件名称或定位方式,对控件在页面上定位,返回其WebElement对象。形参可以传入在xml文件中元素的名称, - * 亦可以传入页面元素的定位方式,但目前识别只支持xpath和css两种方式。 - * 该方法获取的是一组元素,可用于对列表元素事件中。 - *
- *
- * 元素识别判断方式按照以下步骤进行:
- * 1.先对xml文件进行扫描,若存在该元素对应的标签,则读取xml文件的定位方式,并识别有效的定位方式一一匹配,直到正确为止;
- * 2.若在xml文件中查找不到该元素,则按照xpath和css的规则进行匹配,直到判断出该元素的定位方式位置;
- * 3.若仍找不到元素,则抛出UnrecognizableLocationModeException
- *
文件名:AbstractElement.java
- *用途: - * 存储获取元素时的信息 - *
- *编码时间:2020年5月9日上午7:57:24
- *修改时间:2020年5月22日上午8:18:39
- * @author 彭宇琦 - * @version Ver1.1 - * @since JDK 1.8 - * - */ - class ElementInformation { - /** - * 存储元素的名称或定位内容 - */ - public String name; - /** - * 存储元素的定位方式 - */ - public ByType byType; - /** - * 用于标记元素的类型 - */ - public ElementType elementType; - /** - * 存储外链词语 - */ - public ArrayList文件名:CommonElement.java
+ *文件名:CommonBy.java
*用途: - * 提供在辅助化测试中,对页面单一元素获取的方法。类中获取元素的方法兼容传入定位方式对 + * 提供在辅助化测试中,对页面单一元素获取的方法。类中获取元素的方法兼容传入定位方式对 * 元素进行查找,建议使用xml对页面元素的定位方式进行存储,以简化编码时的代码量,也便于 * 对代码的维护 *
- *编码时间:2020年4月26日下午10:34:55
- *修改时间:2020年4月26日下午10:34:55
+ *编码时间:2020年10月13日上午9:44:01
+ *修改时间:2020年10月13日上午9:44:01
* @author 彭宇琦 * @version Ver1.0 - * @since JDK 12 * */ public class CommonBy extends AbstractBy { + /** - * 构造对象并存储浏览器的WebDriver对象 - * - * @param driver 浏览器的WebDriver对象 - */ - public CommonBy(WebDriver driver) { - super(driver); - } - - /** - * 通过浏览器对象{@link AbstractBrower}进行构造 - * @param brower {@link AbstractBrower}对象 + * 构造方法,初始化浏览器对象 + * @param brower {@link AbstractBrower}类对象 */ public CommonBy(AbstractBrower brower) { super(brower); } /** - * 用于根据xml文件中元素的名称,返回对应的{@link Element}对象。该方法亦可传入元素 - * 定位内容,通过遍历所有的定位方式,在页面上查找元素,来获取元素的WebElement对象。 - * 建议传入的定位内容为xpath路径或绝对的css路径,若非这两路径,则在识别元素时会很慢,降低 - * 程序运行速度。若非xml文件中的元素,且不是xpath路径或绝对的css路径,建议使用{@link #getElement(String, ByType)}方法 - * @param name 元素的名称或元素定位内容 - * @return {@link Element}对象 + * 用于根据元素名称与需要获取的元素位置,返回指定的元素。调用该方法在无法查到页面元素时,其不会 + * 抛出{@link TimeoutException}异常,但当调用{@link Element#getWebElement()}方法时,由于未查到元素 + * 则会抛出异常 + * @param elementName 元素名称 + * @param index 元素所在下标 + * @param linkKeys 外链词语组 + * @return {@link Element}类对象 */ - public Element getElement(String name) { - return getElement(new ElementInformation(name, null, ElementType.COMMON_ELEMENT)); - } - - /** - * 用于根据xml文件中元素的名称,与定位方式,返回对应的{@link Element}对象。该方法亦可传入元素 - * 定位内容,并根据定位方式,对页面数据进行查找 - * @param name 元素的名称或元素定位内容 - * @return {@link Element}对象 - */ - public Element getElement(String name, ByType byType) { - return getElement(new ElementInformation(name, byType, ElementType.COMMON_ELEMENT)); - } - - /** - * 获取元素的底层方法 - * @param elementInformation 元素信息类对象 - * @return {@link Element}对象 - */ - private Element getElement(ElementInformation elementInformation) { - //TODO 添加元素查找失败时执行方法的代码 - //判断传入的元素是否在xml文件中,若存在再判断是否自动切换窗体,若需要,则获取元素的所有父窗体并进行切换 - if (xml != null && xml.isElement(elementInformation.name) && isAutoSwitchIframe) { - switchFrame(getParentFrameName(elementInformation.name)); + public Element getElement(String elementName, String...linkKeys) { + //根据元素名称,获取元素信息数据 + elementData = new ElementData(elementName, read); + elementData.addLinkWord(linkKeys); + + //判断是否需要自动切换窗体,若需要,则对元素窗体进行切换 + if (isAutoSwitchIframe) { + autoSwitchFrame(elementData.getIframeNameList()); } - return new Element(driver, ElementType.COMMON_ELEMENT, recognitionElement(elementInformation), elementInformation.name); - } - - @Override - boolean isExistElement(By by, long waitTime) { - //当查找到元素时,则返回true,若查不到元素,则会抛出异常,故返回false - return new WebDriverWait(driver, waitTime, 200). - until((driver) -> { - WebElement element = driver.findElement(by); - return element != null; - }); - /* - return new WebDriverWait(driver, waitTime, 200). - until(ExpectedConditions.and(ExpectedConditions.visibilityOfAllElementsLocatedBy(by), - ExpectedConditions.invisibilityOfElementLocated(by))); - */ + //获取元素数据在页面上对应的一组元素,若无法查到元素,则记录elementList为null + try { + elementList = recognitionElement(elementData); + } catch (TimeoutException e) { + elementList = new ArrayList<>(); + } + + //返回元素对象 + return new Element(0); } } diff --git a/src/main/java/pres/auxiliary/work/selenium/element/DataListBy.java b/src/main/java/pres/auxiliary/work/selenium/element/DataListBy.java index 651d64e..bf8d42a 100644 --- a/src/main/java/pres/auxiliary/work/selenium/element/DataListBy.java +++ b/src/main/java/pres/auxiliary/work/selenium/element/DataListBy.java @@ -1,251 +1,43 @@ package pres.auxiliary.work.selenium.element; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import org.openqa.selenium.By; -import org.openqa.selenium.NoSuchElementException; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.WebDriverWait; +import java.util.HashSet; +import java.util.Set; import pres.auxiliary.work.selenium.brower.AbstractBrower; -import pres.auxiliary.work.selenium.xml.ByType; /** - *文件名:DataListElement.java
+ *文件名:DataListBy.java
*用途: - * 提供在辅助化测试中,对页面列表元素获取的方法,并对列表元素的获取做了优化。 - * 类中获取元素的方法兼容传入定位方式对元素进行查找,建议使用xml对页面元素的 - * 定位方式进行存储,以简化编码时的代码量,也便于对代码的维护。 *
- *编码时间:2020年4月29日下午6:18:46
- *修改时间:2020年4月29日下午6:18:46
+ *编码时间:2020年10月14日下午6:45:51
+ *修改时间:2020年10月14日下午6:45:51
* @author 彭宇琦 * @version Ver1.0 - * @since JDK 12 + * */ -public class DataListBy extends ListBy { +public class DataListBy extends MultiBy { /** - * 存储获取到的元素列表中最多元素列的元素个数 - */ - private int maxColumnSize = -1; - /** - * 存储获取到的元素列表中最多元素列的名称 - */ - private ArrayList文件名:Element.java
- *用途: - * 用于返回和查找页面元素,以方便在元素过期时能进行重新获取 - *
- *编码时间:2020年5月18日上午8:39:05
- *修改时间:2020年5月18日上午8:39:05
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 8 - * - */ -public class Element { - /** - * 存储元素 - */ - private WebElement element = null; - /** - * 存储查找元素的By对象 - */ - private By by; - /** - * 存储获取需要获取的元素下标 - */ - private int index; - - /** - * 存储WebDriver对象,以查找相应元素 - */ - private WebDriver driver; - - /** - * 用于存储元素的名称 - */ - private String name; - - /** - * 标记元素的类型,以用于重新获取时 - */ - private ElementType elementType; - - /** - * 初始化信息,并添加需要获取元素的下标,用于需要获取列表时使用 - * @param name 元素名称或定位内容 - * @param byType 元素定位 - */ - public Element(WebDriver driver, ElementType elementType, By by, String name, int index) { - super(); - this.by = by; - this.index = index; - this.driver = driver; - this.elementType = elementType; - this.name = name; - } - - /** - * 初始化信息,指定获取第一个元素,用于只获取单个元素时使用 - * @param name 元素名称或定位内容 - * @param byType 元素定位 - */ - public Element(WebDriver driver, ElementType elementType, By by, String name) { - this(driver, elementType, by, name, 0); - } - - /** - * 用于返回元素对应的WebElement对象 - * @return 返回元素对应的WebElement对象 - */ - public WebElement getWebElement() { - //若元素未进行查找,则查找一次元素 - if(element == null) { - //对元素进行一次查找 - findElement(); - } - - return element; - } - - /** - * 根据存储的WebDriver对象对元素进行更新 - * @throws Exception - */ - public void findElement() { - switch (elementType) { - case COMMON_ELEMENT: - case DATA_LIST_ELEMENT: - case SELECT_DATAS_ELEMENT: - element = driver.findElements(by).get(index); - break; - case SELECT_OPTION_ELEMENT: - element = new Select(driver.findElement(by)).getOptions().get(index); - break; - default: - throw new IllegalArgumentException("Unexpected value: " + elementType); - } - } - - /** - * 用于返回元素 的名称 - * @return 元素名称 - */ - public String getName() { - return name; - } - - /** - * 用于返回元素信息,输出格式“元素名称 + “元素” + 列表选项” - * @return 元素信息 - */ - public String getLog() { - switch (elementType) { - case COMMON_ELEMENT: - return name + "元素"; - case DATA_LIST_ELEMENT: - case SELECT_DATAS_ELEMENT: - case SELECT_OPTION_ELEMENT: - return name + "元素第" + index + "个选项"; - default: - throw new IllegalArgumentException("Unexpected value: " + elementType); - } - } -} diff --git a/src/main/java/pres/auxiliary/work/selenium/element/ElementData.java b/src/main/java/pres/auxiliary/work/selenium/element/ElementData.java index 77139d4..b3f1f9d 100644 --- a/src/main/java/pres/auxiliary/work/selenium/element/ElementData.java +++ b/src/main/java/pres/auxiliary/work/selenium/element/ElementData.java @@ -1,6 +1,8 @@ package pres.auxiliary.work.selenium.element; 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.ByType; @@ -40,10 +42,11 @@ public class ElementData { * 存储元素 */ private long waitTime; + /** - * 存储当前采用的读取文件的方式 + * 用于存储外链的词语 */ - private AbstractRead read; + private ArrayList文件名:ListElement.java
- *用途: - * 提供获取列表类型元素时的基本方法 - *
- *编码时间:2020年5月22日上午7:54:55
- *修改时间:2020年5月22日上午7:54:55
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 12 - * - */ -public abstract class ListBy extends MultiBy { - /** - * 用于存储获取到的列表一列元素,key为列表名称,value为列表元素 - */ - LinkedHashMap文件名:MultiElement.java
- *用途: - * 提供获取多个元素时使用的基本方法 + *
+ * 文件名:ListBy.java *
- *编码时间:2020年5月22日上午7:54:28
- *修改时间:2020年5月22日上午7:54:28
- * @author 彭宇琦 + *+ * 用途: 提供对多元素获取与返回的基本方法 + *
+ *+ * 编码时间:2020年10月14日下午6:54:46 + *
+ *+ * 修改时间:2020年10月14日下午6:54:46 + *
+ * + * @author * @version Ver1.0 - * @since JDK 12 * */ public abstract class MultiBy extends AbstractBy { /** - * 通过浏览器对象{@link AbstractBrower}进行构造 - * @param brower {@link AbstractBrower}对象 + * 用于记录当前元素集合中第一个元素是否为不可选择的元素,用于对元素的随机返回 + */ + protected boolean firstEmpty = false; + + /** + * 构造方法,初始化浏览器对象 + * + * @param brower {@link AbstractBrower}类对象 */ public MultiBy(AbstractBrower brower) { super(brower); } /** - * 构造对象并存储浏览器的{@link WebDriver}对象 + * 用于设置当前元素集合中首元素是否为允许随机返回的元素+ * 用于获取元素集合中指定下标的元素,该下标允许反向遍历与随机返回,其下标所传入的数字即为元素所在的真实下标。 + *
+ *+ * 例如: + *
+ * 注意:调用该方法前,若未调用{@link #find(String, String...)}方法对元素进行查找, + * 或者查无元素时,调用该方法不会抛出异常,但当调用{@link Element#getWebElement()}方法时, + * 由于未查到元素则会抛出异常 + *
+ * + * @param index 元素下标 + * @return {@link Element}类对象 */ - public abstract void againGetElement(); - + public Element getElement(int index) { + return new Element(toElementIndex(elementList.size(), index)); + } + /** - * 用于清除或移除指定的列及列中的元素,当参数传入false时,则只清理列表中存储的元素,不移除 - * 整个列,若传入true时,则直接移除整个列。若列名称对应的列未被获取,则返回null - * @param name 已被获取的元素列名称 - * @param isRemove 是否需要将该列移除 - * @return 被移除列中存储的所有元素 + * 用于返回当前元素集合中所有的元素集合。若未调用{@link #find(String, String...)}方法对元素进行查找, + * 或者查无元素时,则调用该方法时会抛出超时异常 + * + * @return {@link Element}类对象{@link List}集合 + * @throws TimeoutException 元素在页面不存在时抛出的异常 */ -// public abstract List文件名:SelectBy.java
- *用途:
- * 提供获取下拉框中选项元素的方法,支持标准型下拉框选项(由select与option标签组成的下拉框)以及
- * 非标准型下拉框选项(由普通的div、li等元素组成的选项),并支持根据关键词查找选项。需要注意的是,
- * 标准下拉选项和非标准下拉选项需要传入的参数不同,例如,
- * 标准下拉框:
- * <select id='test'>
- * <option>男</option>
- * <option>女</option>
- * <option>其他</option>
- * </select>
- * 对于该标准的下拉框选项,只需要定位到//select[@id='test'],得到其WebElement对象即可,但对于非标准的下拉框其下拉框是由input和button标签构成:
- * <div>
- * <span><input/></span>
- * <span><button/></span>
- * </div>
- * 点击button对应的按钮后,其下也能弹出选项,但其选项是由div标签写入text构成:
- * <div id='test'>
- * <div>男</div>
- * <div>女</div>
- * <div>其他</div>
- * </div>
- * 对于这种非标准的下拉框选项,需要传入选项所在的所有div标签对应的WebElement元素,在上例,则需要定位到//div[@id='test']/div,
- * 注意,末尾的div不指定数字,则可以代表整个选项。
- *
编码时间:2020年5月24日下午3:30:00
- *修改时间:2020年5月24日下午3:30:00
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 12 - * - */ public class SelectBy extends MultiBy { /** - * 用于存储获取下拉选项时的信息 + * 定义标准下拉选项的tagname */ - ElementInformation elementInfo; - /** - * 用于存储下拉选项的元素 - */ - ArrayList+ * 用于设置获取文本时读取的属性名称,即在调用{@link #getElement(String)}方法时,其元素内容的来源。 + *
+ *+ * 该方法存在设置一个特殊的属性值“text”(默认),表示获取元素的文本节点内容,其他的值均为 + * 设置读取的属性值,建议设置的属性值的内容不存在重复,否则获取到的元素可能与预期不符。 + *
+ *+ * 注意:调用该方法时将自动获取一次元素内容,若未调用{@link #find(String, String...)}方法查找 + * 元素或查找的元素不存在时,调用该方法仅设置属性值。设置的属性名称不区分大小写 + *
* - * @param driver 浏览器的{@link WebDriver}对象 + * @param arributeName 属性名称 */ - public SelectBy(WebDriver driver) { - super(driver); - } - - /** - * 设置首个选项是否为不可选择的选项 - * @param fristIsEmpty 首个选项是否为不可选择 - */ - public void setFristIsEmpty(boolean fristIsEmpty) { - this.fristIsEmpty = fristIsEmpty; + public void setReadArributeName(String attributeName) { + this.attributeName = attributeName; + + //判断当前类中是否存在元素,若不存在,则结束运行 + if (elementList == null || elementList.size() == 0) { + return; + } + + //存在元素,则对元素内容,按照设置的查找方式进行查找 + findElementContent(); } @Override - public void add(String name, ByType byType) { - add(new ElementInformation(name, byType, ElementType.SELECT_OPTION_ELEMENT)); - } - - @Override - public void add(String name) { - add(new ElementInformation(name, null, ElementType.SELECT_OPTION_ELEMENT)); - } - - @Override - void add(ElementInformation elementInformation) { - //判断传入的元素是否在xml文件中,若存在再判断是否自动切换窗体,若需要,则获取元素的所有父窗体并进行切换 - if (xml != null && xml.isElement(elementInformation.name) && isAutoSwitchIframe) { - switchFrame(getParentFrameName(elementInformation.name)); - } - - //清除原存储的内容 - clear(); - - //获取元素的By对象 - By by = recognitionElement(elementInformation); - //根据By获取元素 - List文件名:AbstractElement.java
- *用途:
- *- * 对辅助化测试工具selenium的获取元素代码进行的二次封装,通过类中提供的方法以及配合相应存储元素的 - * xml文件,以更简便的方式对页面元素进行获取,减少编程时的代码量。 - *- *
编码时间:2020年4月25日 下午4:18:37
- *修改时间:2020年4月25日 下午4:18:37
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 12 - */ -public abstract class AbstractBy { - /** - * 用于指向存储控件定位方式的xml文件,设置属性为静态,用于在编写脚本时不需要频繁切换xml文件 - */ - static ReadXml xml; - - /** - * 用于存储浏览器对象 - */ - AbstractBrower brower; - /** - * 存储单个控件的等待时间 - */ - private HashMap- * 用于根据传入的控件名称或定位方式,对控件在页面上定位,返回其WebElement对象。形参可以传入在xml文件中元素的名称, - * 亦可以传入页面元素的定位方式,但目前识别只支持xpath和css两种方式。 - * 该方法获取的是一组元素,可用于对列表元素事件中。 - *
- *
- * 元素识别判断方式按照以下步骤进行:
- * 1.先对xml文件进行扫描,若存在该元素对应的标签,则读取xml文件的定位方式,并识别有效的定位方式一一匹配,直到正确为止;
- * 2.若在xml文件中查找不到该元素,则按照xpath和css的规则进行匹配,直到判断出该元素的定位方式位置;
- * 3.若仍找不到元素,则抛出UnrecognizableLocationModeException
- *
文件名:AbstractElement.java
- *用途: - * 存储获取元素时的信息 - *
- *编码时间:2020年5月9日上午7:57:24
- *修改时间:2020年5月22日上午8:18:39
- * @author 彭宇琦 - * @version Ver1.1 - * @since JDK 1.8 - * - */ - class ElementInformation { - /** - * 存储元素的名称或定位内容 - */ - public String name; - /** - * 存储元素的定位方式 - */ - public ByType byType; - /** - * 用于标记元素的类型 - */ - public ElementType elementType; - /** - * 用于存储在xml文件中需要外链的词语 - */ - public List文件名:CommonElement.java
- *用途: - * 提供在辅助化测试中,对页面单一元素获取的方法。类中获取元素的方法兼容传入定位方式对 - * 元素进行查找,建议使用xml对页面元素的定位方式进行存储,以简化编码时的代码量,也便于 - * 对代码的维护 - *
- *编码时间:2020年4月26日下午10:34:55
- *修改时间:2020年4月26日下午10:34:55
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 8 - * - */ -public class CommonBy extends AbstractBy { - /** - * 通过浏览器对象{@link AbstractBrower}进行构造 - * @param brower {@link AbstractBrower}对象 - */ - public CommonBy(AbstractBrower brower) { - super(brower); - } - - /** - * 用于根据xml文件中元素的名称,返回对应的{@link Element}对象。该方法亦可传入元素 - * 定位内容,通过遍历所有的定位方式,在页面上查找元素,来获取元素的WebElement对象。 - * 建议传入的定位内容为xpath路径或绝对的css路径,若非这两路径,则在识别元素时会很慢,降低 - * 程序运行速度。若非xml文件中的元素,且不是xpath路径或绝对的css路径,建议使用{@link #getElement(String, ByType)}方法 - * @param name 元素的名称或元素定位内容 - * @return {@link Element}对象 - */ - public Element getElement(String name) { - return getElement(new ElementInformation(name, null, ElementType.COMMON_ELEMENT, null)); - } - - /** - * 用于根据xml文件中元素的名称,与定位方式,返回对应的{@link Element}对象。该方法亦可传入元素 - * 定位内容,并根据定位方式,对页面数据进行查找 - * @param name 元素的名称或元素定位内容 - * @return {@link Element}对象 - */ - public Element getElement(String name, ByType byType) { - return getElement(new ElementInformation(name, byType, ElementType.COMMON_ELEMENT, null)); - } - - /** - * 用于根据xml文件中元素的名称,与定位方式,返回对应的{@link Element}对象。该方法亦可传入元素 - * 定位内容,并根据定位方式,对页面数据进行查找。该方法可对由xml文件读取的内容进行词语替换,根据 - * 传参中词语的顺序,对需要替换的词语进行替换 - * @param name 元素名称或定位方式内容 - * @param byType 元素定位方式 - * @param links 替换词语 - * @return {@link Element}对象 - */ - public Element getElement(String name, ByType byType, String...links) { - return getElement(new ElementInformation(name, byType, ElementType.COMMON_ELEMENT, Arrays.asList(links))); - } - - /** - * 用于根据xml文件中元素的名称,返回对应的{@link Element}对象。该方法亦可传入元素 - * 定位内容,通过遍历所有的定位方式,在页面上查找元素,来获取元素的WebElement对象。 - * 建议传入的定位内容为xpath路径或绝对的css路径,若非这两路径,则在识别元素时会很慢,降低 - * 程序运行速度。若非xml文件中的元素,且不是xpath路径或绝对的css路径,建议使用{@link #getElement(String, ByType, String...)}方法 - * @param name 元素的名称或元素定位内容 - * @param links 替换词语 - * @return {@link Element}对象 - */ - public Element getElement(String name, String...links) { - return getElement(new ElementInformation(name, null, ElementType.COMMON_ELEMENT, Arrays.asList(links))); - } - - /** - * 获取元素的底层方法 - * @param elementInformation 元素信息类对象 - * @return WebElement对象 - */ - private Element getElement(ElementInformation elementInformation) { - Element element = new Element(brower, elementInformation.name, elementInformation.elementType); - element.setWaitTime(getWaitTime(elementInformation.name)); - element.setByList(recognitionElement(elementInformation)); - element.setElementIndex(1); - - //构造元素的父层元素,若元素不存在窗体结构,则不进行构造 - if (elementInformation.iframeList != null && elementInformation.iframeList.size() != 0) { - setIframeElement(element, elementInformation); - } - - return element; - } -} diff --git a/src/main/java/pres/auxiliary/work/selenium/element/delect/DataListBy.java b/src/main/java/pres/auxiliary/work/selenium/element/delect/DataListBy.java deleted file mode 100644 index 3fcea33..0000000 --- a/src/main/java/pres/auxiliary/work/selenium/element/delect/DataListBy.java +++ /dev/null @@ -1,167 +0,0 @@ -package pres.auxiliary.work.selenium.element.delect; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.openqa.selenium.NoSuchElementException; - -import pres.auxiliary.work.selenium.brower.AbstractBrower; - -/** - *文件名:DataListElement.java
- *用途: - * 提供在辅助化测试中,对页面列表元素获取的方法,并对列表元素的获取做了优化。 - * 类中获取元素的方法兼容传入定位方式对元素进行查找,建议使用xml对页面元素的 - * 定位方式进行存储,以简化编码时的代码量,也便于对代码的维护。 - *
- *编码时间:2020年4月29日下午6:18:46
- *修改时间:2020年4月29日下午6:18:46
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 8 - */ -public class DataListBy extends ListBy { - //TODO 添加获取最大列方法 - - /** - * 通过浏览器对象{@link AbstractBrower}进行构造 - * @param brower {@link AbstractBrower}对象 - */ - public DataListBy(AbstractBrower brower) { - super(brower); - } - - /** - * 返回元素最多列的元素个数 - * @return 元素最多列的元素个数 - */ -// public int getMaxColumnSize() { -// return maxColumnSize; -// } - - /** - * 返回元素最多列的列名称 - * @return 元素最多列的列名称 - */ -// public List文件名:Element.java
- *用途: - * 用于返回和查找页面元素,以方便在元素过期时能进行重新获取 - *
- *编码时间:2020年5月18日上午8:39:05
- *修改时间:2020年5月18日上午8:39:05
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 8 - * - */ -public class Element implements Cloneable { - /** - * 用于对文本进行分隔 - */ - private final String SPILT_SIGN = ","; - - /** - * 存储元素 - */ - private WebElement element = null; - /** - * 存储查找元素的By对象 - */ - private List文件名:EelementType.java
- *用途: - * 用于标记当前传入的元素是以何种方式进行获取 - *
- *编码时间:2020年5月22日上午7:57:32
- *修改时间:2020年5月22日上午7:57:32
- * @author - * @version Ver1.0 - * @since JDK 12 - * - */ -public enum ElementType { - /** - * 指向普通类型元素 - */ - COMMON_ELEMENT, - /** - * 指向数据列表类型元素 - */ - DATA_LIST_ELEMENT, - /** - * 指向下拉框选择类型元素 - */ - SELECT_ELEMENT, -} diff --git a/src/main/java/pres/auxiliary/work/selenium/element/delect/ListBy.java b/src/main/java/pres/auxiliary/work/selenium/element/delect/ListBy.java deleted file mode 100644 index b140ba3..0000000 --- a/src/main/java/pres/auxiliary/work/selenium/element/delect/ListBy.java +++ /dev/null @@ -1,165 +0,0 @@ -package pres.auxiliary.work.selenium.element.delect; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; - -import org.openqa.selenium.TimeoutException; - -import pres.auxiliary.work.selenium.brower.AbstractBrower; -import pres.auxiliary.work.selenium.xml.ByType; - -/** - *文件名:ListElement.java
- *用途: - * 提供获取列表类型元素时的基本方法 - *
- *编码时间:2020年5月22日上午7:54:55
- *修改时间:2020年5月22日上午7:54:55
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 12 - * - */ -public abstract class ListBy extends AbstractBy { - /** - * 用于存储获取到的列表一列元素,key为列表名称,value为列表元素 - */ - LinkedHashMap文件名:SelectBy.java
- *用途:
- * 提供获取下拉框中选项元素的方法,支持标准型下拉框选项(由select与option标签组成的下拉框)以及
- * 非标准型下拉框选项(由普通的div、li等元素组成的选项),并支持根据关键词查找选项。需要注意的是,
- * 标准下拉选项和非标准下拉选项需要传入的参数不同,例如,
- * 标准下拉框:
- * <select id='test'>
- * <option>男</option>
- * <option>女</option>
- * <option>其他</option>
- * </select>
- * 对于该标准的下拉框选项,只需要定位到//select[@id='test'],得到其WebElement对象即可,但对于非标准的下拉框其下拉框是由input和button标签构成:
- * <div>
- * <span><input/></span>
- * <span><button/></span>
- * </div>
- * 点击button对应的按钮后,其下也能弹出选项,但其选项是由div标签写入text构成:
- * <div id='test'>
- * <div>男</div>
- * <div>女</div>
- * <div>其他</div>
- * </div>
- * 对于这种非标准的下拉框选项,需要传入选项所在的所有div标签对应的WebElement元素,在上例,则需要定位到//div[@id='test']/div,
- * 注意,末尾的div不指定数字,则可以代表整个选项。
- *
编码时间:2020年5月24日下午3:30:00
- *修改时间:2020年5月24日下午3:30:00
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 12 - * - */ -public class SelectBy extends ListBy { - /** - * 用于指向存储的元素名称 - */ - private String name; - /** - * 用于指向存储的外链词语 - */ - private List文件名:UnrecognizableLocationModeException.java
- *用途:在元素定位方式无法被识别的情况下,抛出的异常
- *编码时间:2019年9月24日下午3:19:43
- *修改时间:2019年9月24日下午3:19:43
- * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 12 - * - */ -public class UnrecognizableLocationModeException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public UnrecognizableLocationModeException() { - super(); - } - - public UnrecognizableLocationModeException(String message, Throwable cause, boolean enableSuppression, - boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } - - public UnrecognizableLocationModeException(String message, Throwable cause) { - super(message, cause); - } - - public UnrecognizableLocationModeException(String message) { - super(message); - } - - public UnrecognizableLocationModeException(Throwable cause) { - super(cause); - } - -} diff --git a/src/main/java/pres/auxiliary/work/selenium/event/ClickEvent.java b/src/main/java/pres/auxiliary/work/selenium/event/ClickEvent.java index 5526b6e..0803a7b 100644 --- a/src/main/java/pres/auxiliary/work/selenium/event/ClickEvent.java +++ b/src/main/java/pres/auxiliary/work/selenium/event/ClickEvent.java @@ -1,126 +1,126 @@ -package pres.auxiliary.work.selenium.event; - -import org.openqa.selenium.ElementClickInterceptedException; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.ExpectedConditions; - -import pres.auxiliary.work.selenium.element.Element; - -/** - *文件名:ClickEvent.java
- *用途: - * 定义了对控件进行点击操作相关的方法,可通过该类,对页面进行基本的点击操作 - *
- *编码时间:2019年8月29日下午3:24:34
- *修改时间:2020年7月10日上午16:49:37
- * - * @author 彭宇琦 - * @version Ver2.0 - * @since JDK 12 - * - */ -public class ClickEvent extends AbstractEvent { - /** - * 构造ClickEvent类对象 - * - * @param driver WebDriver类对象 - */ - public ClickEvent(WebDriver driver) { - super(driver); - } - - /** - * 鼠标左键单击事件 - * - * @param element 通过查找页面得到的控件元素对象 - */ - public void click(Element element) { - //在等待时间内判断元素是否可以点击 - try { - wait.until(ExpectedConditions.elementToBeClickable(element.getWebElement())); - } catch (Exception e) { - } - - //进行操作,若仍抛出ElementClickInterceptedException异常,则再等待,直到不再抛出异常 - wait.until((driver) -> { - try { - element.getWebElement().click(); - return true; - } catch (ElementClickInterceptedException e) { - return false; - } catch (StaleElementReferenceException e) { - element.findElement(); - return false; - } - }); - } - - /** - * 鼠标左键双击事件 - * - * @param element 通过查找页面得到的控件元素对象 - */ - public void doubleClick(Element element) { - //在等待时间内判断元素是否可以点击 - try { - wait.until(ExpectedConditions.elementToBeClickable(element.getWebElement())); - } catch (Exception e) { - } - //进行操作,若仍抛出ElementClickInterceptedException异常,则再等待,直到不再抛出异常 - wait.until((driver) -> { - try { - new Actions(driver).doubleClick(element.getWebElement()).perform(); - return true; - } catch (ElementClickInterceptedException e) { - return false; - } catch (StaleElementReferenceException e) { - element.findElement(); - return false; - } - }); - } - - /** - * 鼠标右键点击事件 - * @param element 通过查找页面得到的控件元素对象 - */ - public void rightClick(Element element) { - //在等待时间内判断元素是否可以点击 - try { - wait.until(ExpectedConditions.elementToBeClickable(element.getWebElement())); - } catch (Exception e) { - } - //进行操作,若仍抛出ElementClickInterceptedException异常,则再等待,直到不再抛出异常 - wait.until((driver) -> { - try { - new Actions(driver).contextClick(element.getWebElement()).perform(); - return true; - } catch (ElementClickInterceptedException e) { - return false; - } catch (StaleElementReferenceException e) { - element.findElement(); - return false; - } - }); - } - - /** - * 连续进行指定次数的鼠标左键点击事件 - * @param element 通过查找页面得到的控件元素对象 - * @param clickCount 点击次数 - * @param sleepInMillis 操作时间间隔,单位为毫秒 - */ - public void continuousClick(Element element, int clickCount, long sleepInMillis) { - for(int i = 0; i < clickCount; i++) { - click(element); - - try { - Thread.sleep(sleepInMillis); - } catch (InterruptedException e) { - continue; - } - } - } -} +package pres.auxiliary.work.selenium.event; + +import org.openqa.selenium.ElementClickInterceptedException; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; + +import pres.auxiliary.work.selenium.element.AbstractBy.Element; + +/** + *文件名:ClickEvent.java
+ *用途: + * 定义了对控件进行点击操作相关的方法,可通过该类,对页面进行基本的点击操作 + *
+ *编码时间:2019年8月29日下午3:24:34
+ *修改时间:2020年7月10日上午16:49:37
+ * + * @author 彭宇琦 + * @version Ver2.0 + * @since JDK 12 + * + */ +public class ClickEvent extends AbstractEvent { + /** + * 构造ClickEvent类对象 + * + * @param driver WebDriver类对象 + */ + public ClickEvent(WebDriver driver) { + super(driver); + } + + /** + * 鼠标左键单击事件 + * + * @param element 通过查找页面得到的控件元素对象 + */ + public void click(Element element) { + //在等待时间内判断元素是否可以点击 + try { + wait.until(ExpectedConditions.elementToBeClickable(element.getWebElement())); + } catch (Exception e) { + } + + //进行操作,若仍抛出ElementClickInterceptedException异常,则再等待,直到不再抛出异常 + wait.until((driver) -> { + try { + element.getWebElement().click(); + return true; + } catch (ElementClickInterceptedException e) { + return false; + } catch (StaleElementReferenceException e) { + element.againFindElement(); + return false; + } + }); + } + + /** + * 鼠标左键双击事件 + * + * @param element 通过查找页面得到的控件元素对象 + */ + public void doubleClick(Element element) { + //在等待时间内判断元素是否可以点击 + try { + wait.until(ExpectedConditions.elementToBeClickable(element.getWebElement())); + } catch (Exception e) { + } + //进行操作,若仍抛出ElementClickInterceptedException异常,则再等待,直到不再抛出异常 + wait.until((driver) -> { + try { + new Actions(driver).doubleClick(element.getWebElement()).perform(); + return true; + } catch (ElementClickInterceptedException e) { + return false; + } catch (StaleElementReferenceException e) { + element.againFindElement(); + return false; + } + }); + } + + /** + * 鼠标右键点击事件 + * @param element 通过查找页面得到的控件元素对象 + */ + public void rightClick(Element element) { + //在等待时间内判断元素是否可以点击 + try { + wait.until(ExpectedConditions.elementToBeClickable(element.getWebElement())); + } catch (Exception e) { + } + //进行操作,若仍抛出ElementClickInterceptedException异常,则再等待,直到不再抛出异常 + wait.until((driver) -> { + try { + new Actions(driver).contextClick(element.getWebElement()).perform(); + return true; + } catch (ElementClickInterceptedException e) { + return false; + } catch (StaleElementReferenceException e) { + element.againFindElement(); + return false; + } + }); + } + + /** + * 连续进行指定次数的鼠标左键点击事件 + * @param element 通过查找页面得到的控件元素对象 + * @param clickCount 点击次数 + * @param sleepInMillis 操作时间间隔,单位为毫秒 + */ + public void continuousClick(Element element, int clickCount, long sleepInMillis) { + for(int i = 0; i < clickCount; i++) { + click(element); + + try { + Thread.sleep(sleepInMillis); + } catch (InterruptedException e) { + continue; + } + } + } +} diff --git a/src/main/java/pres/auxiliary/work/selenium/event/EventAction.java b/src/main/java/pres/auxiliary/work/selenium/event/EventAction.java index 9c8a968..fa6291d 100644 --- a/src/main/java/pres/auxiliary/work/selenium/event/EventAction.java +++ b/src/main/java/pres/auxiliary/work/selenium/event/EventAction.java @@ -1,12 +1,12 @@ package pres.auxiliary.work.selenium.event; -import pres.auxiliary.work.selenium.element.Element; +import pres.auxiliary.work.selenium.element.Element_Old; /** *文件名:EventAction.java
*用途: * 用于执行事件增强的方法,方法中可通过{@link EventInformation}类对象,回调事件的操作的步骤 - * 以及传入到事件中的{@link Element}类对象 + * 以及传入到事件中的{@link Element_Old}类对象 *
*编码时间:2020年7月10日下午3:40:13
*修改时间:2020年7月10日下午3:40:13
@@ -16,7 +16,7 @@ import pres.auxiliary.work.selenium.element.Element; */ public interface EventAction { /** - * 事件增强的方法,可通过形参回调事件的操作步骤以及传入到事件中的{@link Element}类对象 + * 事件增强的方法,可通过形参回调事件的操作步骤以及传入到事件中的{@link Element_Old}类对象 * @param name {@link EventInformation}类对象 */ void action(EventInformation elemenetInformation); diff --git a/src/main/java/pres/auxiliary/work/selenium/event/EventInformation.java b/src/main/java/pres/auxiliary/work/selenium/event/EventInformation.java index 56f2c48..035c955 100644 --- a/src/main/java/pres/auxiliary/work/selenium/event/EventInformation.java +++ b/src/main/java/pres/auxiliary/work/selenium/event/EventInformation.java @@ -4,7 +4,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; -import pres.auxiliary.work.selenium.element.Element; +import pres.auxiliary.work.selenium.element.Element_Old; /** *文件名:EventInformation.java
@@ -29,7 +29,7 @@ public class EventInformation { /** * 存储传入到方法中的元素类对象,由args进行分离 */ - private ArrayList文件名:EventProxy.java
@@ -205,9 +205,9 @@ public class EventProxy- * 文件名:JsEvent.java - *
- *- * 用途:用提供通过Javascript来修改或者获取页面元素内容的方法 - *
- *- * 编码时间:2018年12月2日 下午12:51:19 - *
- *- * 修改时间:2020年5月17日 下午5:21:44 - *
- * - * @author 彭宇琦 - * @version Ver1.0 - * @since JDK 12 - */ -public class JsEvent extends AbstractEvent { - /** - * 用于使用js - */ - private JavascriptExecutor js; - - /** - * 构造对象 - * - * @param driver 页面WebDriver对象 - */ - public JsEvent(WebDriver driver) { - super(driver); - js = (JavascriptExecutor) this.driver; - } - - /** - * 获取元素的指定的属性值,若属性不存在时,则返回空串。 - * - * @param element 元素 - * @param attributeName 属性名 - * @return 元素对应属性的内容 - */ - public String getAttribute(Element element, String attributeName) { - // 获取对应元素的内容 - String text = (String) (js.executeScript("return arguments[0].getAttribute('" + attributeName + "');", - wait.until(driver -> { - try { - return element.getWebElement(); - } catch (StaleElementReferenceException e) { - element.findElement(); - return null; - } - }))); - // 返回对应属性的内容,若传入的属性不存在,则返回空串 - return (text == null) ? "" : text; - } - - /** - * 设置元素的属性值,并返回属性的原值,若设置的属性名不存在时,则在该元素上增加相应的属性 - * - * @param element 元素 - * @param attributeName 需要设置的属性名 - * @param value 需要设置的属性值 - * @return 属性的原值 - */ - public String putAttribute(Element element, String attributeName, String value) { - // 获取原属性中的值 - String oldValue = getAttribute(element, attributeName); - - // 执行代码 - js.executeScript("arguments[0].setAttribute('" + attributeName + "','" + value + "');", wait.until(driver -> { - try { - return element.getWebElement(); - } catch (StaleElementReferenceException e) { - element.findElement(); - return null; - } - })); - return oldValue; - } - - /** - * 在指定的元素下方添加一个元素,元素将带一个名为temp_attribute的属性,其属性的值为一个uuid,并且添加成功后 - * 方法返回该元素定位xpath,格式为“//标签名[@temp_attribute='uuid']” - * - * @param element 元素 - * @param elementName 新元素(标签)的名称 - * @return 新增元素的定位方式 - */ - public String addElement(Element element, String elementName) { - // 获取并将其作为 - String script = "var oldElement = arguments[0];"; - // 拼接添加元素的代码 - script += "var newElement = document.createElement('" + elementName + "');"; - // 给新的元素添加一个属性,并将其值设为UUID,使其可被搜索得到 - String uuid = UUID.randomUUID().toString(); - script += "newElement.setAttribute('temp_attribute', '" + uuid + "');"; - // 向指定位置添加节点 - script += "oldElement.appendChild(newElement);"; - - // 执行代码 - js.executeScript(script, wait.until(driver -> { - try { - return element.getWebElement(); - } catch (StaleElementReferenceException e) { - element.findElement(); - return null; - } - })); - - return "//" + elementName + "[@temp_attribute='" + uuid + "']"; - } - - /** - * 根据json中的属性及元素名称信息,在指定元素下添加一个元素,元素将带一个 - * 名为temp_attribute的属性,其属性的值为一个uuid,并且添加成功后 - * 方法返回该元素定位xpath,格式为“//标签名[@temp_attribute='uuid']”。 - * 传入的json格式可以参照{@link #deleteElement(WebElement)}方法中 返回的json形式 - * - * @param element 元素 - * @param elementJson 新元素(标签)的信息 - * @return 新增元素的定位方式 - */ - public String addElement(Element element, JSONObject elementJson) { - // 添加元素 - String elementName = elementJson.getString("tagname"); - - // 获取新添加元素的xpath - String xpath = addElement(element, elementName); - // 查找新添加的元素(由于是新添加的元素,肯定能查找到,故无需编写等待) - Element newElement = new Element(driver, "TeamElement", ElementType.COMMON_ELEMENT); - List- * { - * "tagname":元素标签名称 - * "attributes":[ - * { - * "name":属性1名称 - * "value":属性1值 - * }, - * { - * "name":属性1名称 - * "value":属性1值 - * }, - * ... - * ] - * } - *- * - * @param element 元素 - * @return 元素的信息 - */ - public JSONObject deleteElement(Element element) { - //获取元素信息 - JSONObject json = getElementInfromation(wait.until(driver -> { - try { - return element.getWebElement(); - } catch (StaleElementReferenceException e) { - element.findElement(); - return null; - } - })); - - // 获取节点 - String script = "var deleteNode = arguments[0];"; - // 获取节点的父节点 - script += "var parentNode = deleteNode.parentNode;"; - // 通过父节点来删除子节点 - script += "parentNode.removeChild(deleteNode)"; - - // 执行代码,由于在获取元素信息时已经对元素的过期进行了判断,故此处无需在做判断 - js.executeScript(script, element.getWebElement()); - - /* - var a = document.getElementById('psd') - var aa = a.parentNode - aa.removeChild(a) - * - * */ - return json; - } - - /** - * 用于执行已经写好的js脚本 - * - * @param script js脚本 - * @return 执行结果 - */ - public Object runScript(String script) { - // 执行代码 - return js.executeScript(script); - } - - /** - * 用于执行已经写好的js脚本 - * - * @param script js脚本 - * @param args 传入的参数 - * @return 执行结果 - */ - public Object runScript(String script, Object... args) { - // 执行代码 - return js.executeScript(script, args); - } - - /** - * 获取元素所有的属性信息,以json的形式返回。格式为: - * - *
- * { - * "tagname":元素标签名称 - * "attributes":[ - * { - * "name":属性1名称 - * "value":属性1值 - * }, - * { - * "name":属性1名称 - * "value":属性1值 - * }, - * ... - * ] - * } - *- * - * @param element 元素 - * @return 元素属性的信息,以json的形式返回 - */ - @SuppressWarnings("unchecked") - private JSONObject getElementInfromation(WebElement element) { - JSONObject elementJson = new JSONObject(); - - // 添加元素的标签名称 - elementJson.put("tagname", element.getTagName()); - - JSONArray attArray = new JSONArray(); - // 获取元素的所有属性信息 - ((ArrayList