Selenium Select - 选择部分文本的下拉选项

时间:2015-04-21 12:21:15

标签: java selenium selenium-webdriver webdriver selenium-chromedriver

班级Selenium Select有3种不同的选项选择方法:

  1. selectByIndex
  2. selectByValue
  3. selectByVisibleText
  4. 现在,我有一种情况,我希望通过某些文字选择一个选项,部分出现在其中一个选项可见文本中(不要让自己暴露于整个文本)。

    例如:

    <option value="0" label="not-intresting">VERY-LONG-TEXT-THAT-I-NEED-TO-SELECT-DOLLAR</option>
    

    我只想通过提供&#34; DOLLAR&#34;来选择此选项,例如:

    select.selectByPartOfVisibleText("DOLLAR") 
    

    你将如何有效地实施它?

8 个答案:

答案 0 :(得分:4)

您可以尝试这样的逻辑希望这有助于

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

答案 1 :(得分:2)

我的解决方案是使用xpath查找select的子项。任何xpath方法都可用于查找select;在这个例子中,我找到了id的选择。

List<WebElement> options = driver.findElements(By.xpath("//select[@id = 'selectId')]/option"));

for (WebElement option : options) {
    if (option.getText().contains("DOLLAR")) {
        option.click();
        break;
    }
}

经过一番思考后,我意识到完全可以使用xpath找到该选项:

driver.findElements(By.xpath("//select[@id = 'selectId')]/option[contains(text(), 'DOLLAR')]")).click();

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在最新的Selenium版本3.x或4.x中,可以使用Select类从下拉列表中选择一个选项。

例如:存在一个风味下拉列表,需要它选择包含名称为Vanilla的风味。

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

答案 4 :(得分:0)

获取所有option值的列表,然后检查该值是否包含您的部分文本。像这样:

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

答案 5 :(得分:0)

最后我在这里结合了答案,结果是:

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.electByIndex(Integer.parseInt(optionIndex));
            break;
        }
    }

    Thread.sleep(300);
}

Scala (最终需要它在Scala中)看起来像:

  def selectByPartOfVisibleText(value: String) = {
    val optionElements: util.List[WebElement] = selectElement.findElements(By.tagName("option"))

    breakable {
      optionElements.foreach { elm =>
        if (elm.getText.contains(value)) {
          val optionIndex = elm.getAttribute("index")
          selectByIndex(optionIndex.toInt)
          break
        }
      }
    }
    Thread.sleep(300)
  }

答案 6 :(得分:0)

这将起作用

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

答案 7 :(得分:-1)

这就是我用来解决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)