Java Selenium Select-按部分文本选择下拉选项
该类有3种不同选项选择的方法:Java Selenium Select-按部分文本选择下拉选项,java,selenium,selenium-webdriver,webdriver,selenium-chromedriver,Java,Selenium,Selenium Webdriver,Webdriver,Selenium Chromedriver,该类有3种不同选项选择的方法: selectByIndex selectByValue 按可视文本选择 现在,我遇到了这样一种情况:我想通过某个文本选择一个选项,该文本部分出现在某个选项可见文本中(不想让自己暴露在整个文本中的更改中) 例如: <option value="0" label="not-intresting">VERY-LONG-TEXT-THAT-I-NEED-TO-SELECT-DOLLAR</option> 您将如何有效地实现它?您可以尝试这样的逻辑
<option value="0" label="not-intresting">VERY-LONG-TEXT-THAT-I-NEED-TO-SELECT-DOLLAR</option>
您将如何有效地实现它?您可以尝试这样的逻辑,希望这能有所帮助
List <WebElements> optionsInnerText= driver.findElements(By.tagName("option"));
for(WebElement text: optionsInnerText){
String textContent = text.getAttribute("textContent");
if(textContent.toLowerCase.contains(expectedText.toLowerCase))
select.selectByPartOfVisibleText(expectedText);
}
}
列出选项InnerText=driver.findElements(按.tagName(“选项”));
用于(WebElement文本:选项InnerText){
字符串textContent=text.getAttribute(“textContent”);
if(textContent.toLowerCase.contains(expectedText.toLowerCase))
select.selectByPartOfVisibleText(expectedText);
}
}
获取所有选项值的列表,然后检查该值是否包含部分文本。大概是这样的:
List<WebElement> list = driver.findElements(By.tagName("option"));
Iterator<WebElement> i = list.iterator();
while(i.hasNext()) {
WebElement wel = i.next();
if(wel.getText().contains("your partial text"))
{
//select this option
}
}
List List=driver.findElements(按.tagName(“选项”);
迭代器i=list.Iterator();
while(i.hasNext()){
WebElement-wel=i.next();
如果(wel.getText()包含(“您的部分文本”))
{
//选择此选项
}
}
最终我将答案组合在这里,结果如下:
Select select = new Select(driver.findElement(By.xpath("//whatever")));
public void selectByPartOfVisibleText(String value) {
List<WebElement> optionElements = driver.findElement(By.cssSelector("SELECT-SELECTOR")).findElements(By.tagName("option"));
for (WebElement optionElement: optionElements) {
if (optionElement.getText().contains(value)) {
String optionIndex = optionElement.getAttribute("index");
select.selectByIndex(Integer.parseInt(optionIndex));
break;
}
}
Thread.sleep(300);
}
这就是我用python解决这个问题的方法
我使用了这个选项,所以它选择使用单词DOLLAR
的文本,而不是键入整个单词作为值
Select(driver.find_element_by_name(ELEMENT)).select_by_value("DOLLAR")
而不是
Select(driver.find_element_by_name(ELEMENT)).select_by_visible_text(text)
我的解决方案是使用xpath查找select的子选项。可以使用任何xpath方法来查找select;在这个例子中,我找到了selectbyid
List<WebElement> options = driver.findElements(By.xpath("//select[@id = 'selectId')]/option"));
for (WebElement option : options) {
if (option.getText().contains("DOLLAR")) {
option.click();
break;
}
}
使用Java 8 Stream/Lambda:
protected void selectOptionByPartText(WebElement elementAttr, String partialText) {
Select select = new Select(elementAttr);
select.getOptions().parallelStream().filter(option -> option.getAttribute("textContent").toLowerCase().contains(partialText.toLowerCase()))
.findFirst().ifPresent(option -> select.selectByVisibleText(option.getAttribute("textContent")));
}
在最新的Selenium版本3.x或4.x中,可以使用Select类从下拉列表中选择一个选项
例如:有一个风味下拉列表,它需要选择一种包含名称为香草的风味
WebElement flavour = driver.findElement(By.id("attribute178"));
Select select = new Select(flavour);
String expectedFlavourName = "Vanilla";
List<WebElement> allFlavourList = select.getOptions();
for (WebElement option : allFlavourList) {
String currentFlavourName = option.getText();
if (currentFlavourName.contains(expectedFlavourName)) {
select.selectByVisibleText(currentFlavourName);
}
}
WebElement-flavor=driver.findElement(By.id(“attribute178”);
选择=新选择(风味);
字符串ExpectedFlavorName=“香草”;
List allFlavourList=select.getOptions();
for(WebElement选项:allFlavourList){
字符串currentFlavorName=option.getText();
if(CurrentFlavorName.contains(ExpectedFlavorName)){
select.selectByVisibleText(CurrentFlavorName);
}
}
这将起作用
WebElement element = driver.findEle(By.xpath(loc));
Select select = new Select(element);
for(int i=1;i<=select.getOptions().size();i++)
{
if(select.getOptions().get(i-1).getText().contains(containsTxt))
{
select.selectByIndex(i-1);
break;
}
if(i==select.getOptions().size())
{
//"Fail"
}
}
WebElement=driver.findEle(By.xpath(loc));
选择=新选择(元素);
对于(int i=1;ii如果只有部分文本可见,您可以使用regex,然后看到这个问题-如果选项具有text content
属性,这可能会起作用,但在OP的情况下,它没有。检查元素并查看DOM面板,您将找到包括textcontentThank在内的所有属性,这与我需要的类似。只是代替text.getAttribute(“textContent”)part I think element.getText应该使用。很酷,谢谢。我只是不太喜欢显式使用迭代器,会做得有点不同。效果很好。虽然如果您不想筛选页面上的每个选项,只想搜索内部文本,您可以尝试:protected void SelectOptions ByPartText(WebElement select,String partialText){select s=new select(select);s.getOptions().stream().filter(option->option.getText().toLowerCase().contains(partialText.toLowerCase())).findFirst().ifPresent(option->s.selectByValue(option.getAttribute(“value”);}
我遇到了一个问题,下一个操作没有发生,因为下拉闭包的渲染速度不够快。
protected void selectOptionByPartText(WebElement elementAttr, String partialText) {
Select select = new Select(elementAttr);
select.getOptions().parallelStream().filter(option -> option.getAttribute("textContent").toLowerCase().contains(partialText.toLowerCase()))
.findFirst().ifPresent(option -> select.selectByVisibleText(option.getAttribute("textContent")));
}
WebElement flavour = driver.findElement(By.id("attribute178"));
Select select = new Select(flavour);
String expectedFlavourName = "Vanilla";
List<WebElement> allFlavourList = select.getOptions();
for (WebElement option : allFlavourList) {
String currentFlavourName = option.getText();
if (currentFlavourName.contains(expectedFlavourName)) {
select.selectByVisibleText(currentFlavourName);
}
}
WebElement element = driver.findEle(By.xpath(loc));
Select select = new Select(element);
for(int i=1;i<=select.getOptions().size();i++)
{
if(select.getOptions().get(i-1).getText().contains(containsTxt))
{
select.selectByIndex(i-1);
break;
}
if(i==select.getOptions().size())
{
//"Fail"
}
}