Селектор Selenium CSS по id и нескольким классам
используя селен в первый раз здесь, мне было интересно, почему:
final WebElement justAnId = findElement(By.cssSelector("#someId"));
final WebElement whatIWant = justAnId.findElement(
By.cssSelector(".aClass.andAnother input[type=text]")
);
работает, но не:
final WebElement whatIWant = findElement(By.cssSelector(
"div#someId.aClass.andAnother input[type=text]"
));
хотя они кажутся мне эквивалентными, я получаю:
org.openqa.selenium.NoSuchElementException: Unable to locate element:
{"method":"css selector","selector":"div#someId.aClass.andAnother input[type=text]"}
это предполагаемое поведение или ошибка в Selenium? Я быстро заглянул в трекер ошибок в Селене, но я ничего не видел об этом. Я хотел спросить здесь, прежде чем поднимать вопрос, который не должен быть. Также насколько я понимаю, это не работает в IE6, но кого это волнует. Я использовал firefox для этого запуска.
2 ответов
findElement()
находит элемент в текущем контексте, что означает, что ваш первый фрагмент кода действительно находит элемент, который соответствует .aClass.andAnother input[type=text]
, который находится внутри #someId
. Элемент с этим идентификатором может содержать или не содержать два класса; WebDriver не предполагает, что вы ссылаетесь на один и тот же элемент; он просто находит input
пока его предки #someId
и .aClass.andAnother
.
совсем div#someId.aClass.andAnother input[type=text]
, который находит все input[type=text]
внутри div#someId.aClass.andAnother
только (т. е. это div
, содержащую и ID и классы).
На самом деле это два совершенно разных селектора.
вот ваш cssSelector:
div#someId.aClass.andAnother input[type=text]
но то, что вы действительно хотели написать, было:
div#someId .aClass.andAnother input[type=text]
обратите внимание на пространство между ID и class. вам нужно.