From fe2df99c39286b7b4410c632dcba045f8218673b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E5=AE=87=E7=90=A6?= <465615774@qq.com> Date: Sun, 24 May 2020 15:54:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E4=B8=8B=E6=8B=89=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=9C=AC=E9=80=89=E6=8B=A9=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=94=B1=E5=85=A8=E5=8C=B9=E9=85=8D=E6=94=B9=E4=B8=BA=E5=85=B3?= =?UTF-8?q?=E9=94=AE=E8=AF=8D=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work/selenium/element/SelectBy.java | 72 ++++++++++++++++--- .../work/selenium/element/SelectByTest.java | 17 +---- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/main/java/pres/auxiliary/work/selenium/element/SelectBy.java b/src/main/java/pres/auxiliary/work/selenium/element/SelectBy.java index 4a06738..ce375d6 100644 --- a/src/main/java/pres/auxiliary/work/selenium/element/SelectBy.java +++ b/src/main/java/pres/auxiliary/work/selenium/element/SelectBy.java @@ -1,10 +1,12 @@ package pres.auxiliary.work.selenium.element; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; 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.Select; @@ -13,6 +15,39 @@ import org.openqa.selenium.support.ui.WebDriverWait; import pres.auxiliary.selenium.xml.ByType; import pres.auxiliary.work.selenium.brower.AbstractBrower; +/** + *

文件名: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 { /** * 用于存储获取下拉选项时的信息 @@ -110,19 +145,36 @@ public class SelectBy extends MultiBy { } /** - * 根据选项内容,返回相应的选项元素,当传入的元素名称不存在时,则返回null;当存在重复的选项 - * 名称时,则选择第一个选项 + * 根据关键词组查找选项,并返回选项元素,当传入的元素名称不存在时,则抛出NoSuchElementException异常; + * 当查询到有多个包含关键词的选项时,则选择第一个选项
+ * 注意,当传入多个关键词时其选项需要全部满足才会返回相应的选项。 * - * @param elementName 选项名称 + * @param keys 查询选项的关键词组 * @return 相应的选项元素 + * @throws NoSuchElementException 查找的选项不存在时抛出的异常 */ - public Element getElement(String elementName) { - //根据名称获取元素下标 - int index = optionText.indexOf(elementName); - //判断下标是否为-1(元素是否存在),若不存在则返回null - if (index == -1) { - return null; - } + public Element getElement(String...keys) { + //查找完全符合关键词的元素 + String elementName = optionText.stream().filter(text -> { + //遍历关键词,若元素不符合条件,则返回false + for (String key : keys) { + if (text.indexOf(key) < 0) { + return false; + } + } + + //若条件均符合,则返回true + return true; + }).findFirst().orElseThrow(() -> { + //若不存在符合条件的选项,则抛出NoSuchElementException异常,并返回相应的消息 + StringBuilder keyText = new StringBuilder("["); + //拼接查询条件 + Arrays.stream(keys).forEach(key -> { + keyText.append(key + ", "); + }); + + return new NoSuchElementException("不存在符合条件的选项:" + keyText.substring(0, keyText.length() - ", ".length()) + "]"); + }); return option.get(optionText.indexOf(elementName)); } diff --git a/src/test/java/pres/auxiliary/work/selenium/element/SelectByTest.java b/src/test/java/pres/auxiliary/work/selenium/element/SelectByTest.java index 808aa7c..03222ea 100644 --- a/src/test/java/pres/auxiliary/work/selenium/element/SelectByTest.java +++ b/src/test/java/pres/auxiliary/work/selenium/element/SelectByTest.java @@ -2,8 +2,6 @@ package pres.auxiliary.work.selenium.element; import java.io.File; -import org.openqa.selenium.By; -import org.openqa.selenium.WebElement; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -86,19 +84,8 @@ public class SelectByTest { //点击修复版本,未排期的第5个选项 ce.click(cby.getElement("//*[@id=\"fixVersions-multi-select\"]/span")); s.add("//div[contains(@class, 'ajs-layer box')]//*[text()='20200408-解决实名制平台响应慢问题']/../..//a"); - ce.click(s.getElement(5)); - } - - @Test - public void test() { - ce.click(cby.getElement("//*[@id=\"fixVersions-multi-select\"]/span")); - WebElement e = cb.getDriver().findElement(By.xpath("//div[contains(@class, 'ajs-layer box')]//*[text()='20200408-解决实名制平台响应慢问题']")); +// ce.click(s.getElement("2020", "-", "银行接口")); - System.out.println(e.getTagName()); - - cb.getDriver().findElements(By.xpath("//div[contains(@class, 'ajs-layer box')]//*[text()='20200408-解决实名制平台响应慢问题']/../..//a")). - stream().map(ele -> { - return ele.getText(); - }).forEach(System.out :: println); + ce.click(s.getElement("233", "-", "银行接口")); } }