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

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> 您将如何有效地实现它?您可以尝试这样的逻辑

该类有3种不同选项选择的方法:

  • selectByIndex
  • selectByValue
  • 按可视文本选择
  • 现在,我遇到了这样一种情况:我想通过某个文本选择一个选项,该文本部分出现在某个选项可见文本中(不想让自己暴露在整个文本中的更改中)

    例如:

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