Селектор Selenium CSS по идентификатору и нескольким классам

Используя селен здесь впервые, мне было интересно, почему:

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 для этого запуска.


person Renaud    schedule 29.01.2013    source источник


Ответы (2)


arrow_upward
8
arrow_downward

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, который содержит и идентификатор, и классы).

person BoltClock    schedule 29.01.2013
comment
+1 к этому ответу. В качестве проверки работоспособности всякий раз, когда вы сталкиваетесь с подобной проблемой в WebDriver, откройте консоль JavaScript браузера (Firebug для Firefox, инструменты разработчика F12 для IE и инструменты разработчика WebKit для Chrome) и используйте document.querySelector (), используя то же селектор, который не удался вам в вашем коде WebDriver. Если селектор не возвращает ожидаемый элемент в консоли JavaScript, можете быть уверены, что в WebDriver этого никогда не произойдет. - person JimEvans; 29.01.2013
comment
Спасибо за ответ и комментарии, я не знал, что могу использовать селекторы из инструментов разработчика, +1. Рен. - person Renaud; 30.01.2013

arrow_upward
11
arrow_downward

На самом деле это два совершенно разных селектора.

Вот ваш cssSelector:

div#someId.aClass.andAnother input[type=text]

Но на самом деле вы хотели написать:

div#someId .aClass.andAnother input[type=text]

обратите внимание на пробел между идентификатором и классом. вам это нужно.

person mandu    schedule 19.07.2013