将下拉选项的文本选择方法由全匹配改为关键词匹配

This commit is contained in:
彭宇琦 2020-05-24 15:54:26 +08:00
parent cf40291e9d
commit fe2df99c39
2 changed files with 64 additions and 25 deletions

View File

@ -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;
/**
* <p><b>文件名</b>SelectBy.java</p>
* <p><b>用途</b>
* 提供获取下拉框中选项元素的方法支持标准型下拉框选项由select与option标签组成的下拉框以及
* 非标准型下拉框选项由普通的divli等元素组成的选项并支持根据关键词查找选项需要注意的是
* 标准下拉选项和非标准下拉选项需要传入的参数不同例如<br>
* 标准下拉框<br>
* &lt;select&nbsp;id='test'&gt;<br>
* &emsp;&lt;option&gt;&lt;/option&gt;<br>
* &emsp;&lt;option&gt;&lt;/option&gt;<br>
* &emsp;&lt;option&gt;其他&lt;/option&gt;<br>
* &lt;/select&gt;<br>
* 对于该标准的下拉框选项只需要定位到//select[@id='test']得到其WebElement对象即可但对于非标准的下拉框其下拉框是由input和button标签构成<br>
* &lt;div&gt;<br>
* &emsp;&lt;span&gt;&lt;input/&gt;&lt;/span&gt;<br>
* &emsp;&lt;span&gt;&lt;button/&gt;&lt;/span&gt;<br>
* &lt;/div&gt;<br>
* 点击button对应的按钮后其下也能弹出选项但其选项是由div标签写入text构成<br>
* &lt;div&nbsp;id='test'&gt;<br>
* &emsp;&lt;div&gt;&lt;/div&gt;<br>
* &emsp;&lt;div&gt;&lt;/div&gt;<br>
* &emsp;&lt;div&gt;其他&lt;/div&gt;<br>
* &lt;/div&gt;<br>
* 对于这种非标准的下拉框选项需要传入选项所在的所有div标签对应的WebElement元素在上例则需要定位到//div[@id='test']/div
* 注意末尾的div不指定数字则可以代表整个选项<br>
* </p>
* <p><b>编码时间</b>2020年5月24日下午3:30:00</p>
* <p><b>修改时间</b>2020年5月24日下午3:30:00</p>
* @author 彭宇琦
* @version Ver1.0
* @since JDK 12
*
*/
public class SelectBy extends MultiBy {
/**
* 用于存储获取下拉选项时的信息
@ -110,19 +145,36 @@ public class SelectBy extends MultiBy {
}
/**
* 根据选项内容返回相应的选项元素当传入的元素名称不存在时则返回null当存在重复的选项
* 名称时则选择第一个选项
* 根据关键词组查找选项并返回选项元素当传入的元素名称不存在时则抛出NoSuchElementException异常
* 当查询到有多个包含关键词的选项时则选择第一个选项<br>
* 注意当传入多个关键词时其选项需要全部满足才会返回相应的选项
*
* @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));
}

View File

@ -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", "-", "银行接口"));
}
}