Используя селен здесь впервые, мне было интересно, почему:
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? Я быстро просмотрел баг-трекер в Selenium, но ничего об этом не увидел. Я хотел спросить здесь, прежде чем поднимать вопрос, в котором нет необходимости. Также, насколько я понимаю, это не работает в IE6, но кого это волнует. Я использовал firefox для этого запуска.
Ответ 1 · рейтинг 8 · BoltClock
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, который содержит и идентификатор, и классы).
Ответ 2 · рейтинг 11 · mandu
На самом деле это два совершенно разных селектора.
Вот ваш cssSelector:
div#someId.aClass.andAnother input[type=text]
Но на самом деле вы хотели написать:
div#someId .aClass.andAnother input[type=text]
обратите внимание на пробел между идентификатором и классом. вам это нужно.