Не удалось выбрать брата с помощью CSS Selector в Selenium - PullRequest
3 голосов
/ 14 марта 2020

Selenium WebDriver выдает InvalidSelectorException при попытке щелкнуть по следующему братскому элементу с помощью CSS Селектор.

Считайте, что мой DOM выглядит следующим образом:

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

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Вместо того, чтобы извлекать элемент по классу 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();
}
0 голосов
/ 15 марта 2020

Прежде чем другие люди отметят, что эту проблему легко решить с помощью xpath, позвольте мне сказать, что у меня уже есть это решение. Но цель этого вопроса - выяснить, почему селен не работает, даже если мой селектор CSS правильный.

Решение 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();
        }
    }
}
...