代码之家  ›  专栏  ›  技术社区  ›  Bhuvanesh Mani

无法使用Selenium中的CSS选择器选择同级

  •  2
  • Bhuvanesh Mani  · 技术社区  · 5 年前

    Selenium WebDriver在尝试使用CSS选择器单击下一个同级元素时抛出InvalidSelectorException。

    <div class="checkbox-group">
       <div>     
           <span class="checkbox">::after</span> <!--click on this span makes the checkbox checked-->
           <span class="checkbox-name">Male</span> <!--click on this span doesn't make the checkbox checked-->
       </div>
       <div>
          <span class="checkbox">::after</span>
          <span class="checkbox-name">Female</span>
       </div>
    </div>
    

    我的Java代码是:

    @FindAll(@FindBy(css=".checkbox-name"))
    List<WebElement> checkboxes;
    
    public void selectCheckbox(String value){
        for(WebElement checkbox : checkboxes){
            String text = checkbox.getText();
            if(text.equalsIgnoreCase(value)){
                WebElement control = checkbox.findElement(By.cssSelector("+.checkbox"));//Exception thrown here     
                control.click();
            }
        }
    }
    

    org.openqa.selenium.InvalidSelectorException: invalid selector: An invalid or illegal selector was specified. 
    ** Element info: {Using=css selector, value=+.checkbox} 
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Sameer Arora    5 年前

    checkbox-name 检查里面是否有 String value ,您可以使用 text 在xpath中。
    following-sibling 在xpath中获取 span 它是可点击的。

    您只能在一个xpath中完成所有这些操作,例如:

    public void selectCheckbox(String value){
        WebElement checkBox = driver.findElement(By.xpath("//div[@class='checkbox-group']//span[text()="+value+"]//following-sibling::span"));
        checkBox.click();
    }
    
        2
  •  0
  •   Bhuvanesh Mani    5 年前

    在其他人指出使用xpath可以很容易地解决这个问题之前,让我告诉您我已经有了这个解决方案。但这个问题的目的是找出为什么即使我的CSS选择器是正确的,selenium也不能工作。

    Xpath解决方案:

    public void selectCheckbox(String value){
        for(WebElement checkbox : checkboxes){
            String text = checkbox.getText();
            if(text.equalsIgnoreCase(value)){
                WebElement control = checkbox.findElement(By.xpath("./parent::div/span[@class='checkbox']"));
                control.click();
            }
        }
    }