InvalidSelectorException с использованием селектора CSS для определения атрибутов, присвоенных атрибуту "data-"

Мотивация

Использовать механизм селектора CSS Selenium наряду с селекторами атрибутов CSS и настраиваемым атрибутом HTML5 data- для адресации определенных крючков для элементов.

Проблема

При использовании вышеуказанного для определения элемента, назначенного с помощью имени класса CSS и атрибута data-, генерируется следующее исключение:

Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: The given selector .gs-a-btn["data-value"] is either invalid or does not result in a WebElement. The following error occurred:
[Exception... "An invalid or illegal string was specified"  code: "12" nsresult: "0x8053000c (NS_ERROR_DOM_SYNTAX_ERR)"  location: "file:///C:/DOCUME~1/eliranm/LOCALS~1/Temp/anonymous6109849275533680625webdriver-profile/extensions/[email protected]/components/driver_component.js Line: 5956"]
Build info: version: '2.23.1', revision: '17143', time: '2012-06-08 18:59:28'
System info: os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', java.version: '1.6.0_31'
Driver info: driver.version: unknown
    at <anonymous class>.<anonymous method>(file:///C:/DOCUME~1/eliranm/LOCALS~1/Temp/anonymous6109849275533680625webdriver-profile/extensions/fxdr[email protected]/components/driver_component.js:6537)

Соответствующий код

public void previous(String type) {
    By cssSelector = By.cssSelector(".gs-a-btn[data-value='" + type + "']");
    driver.findElement(cssSelector).click();
}

Что я пробовал

  • замена одиночных кавычек на экранированные двойные кавычки внутри запроса выбора атрибута.
  • указание селектора атрибутов вместо селектора атрибутов, т.е. ".gs-a-btn[\"data-value\"]" скорее ".gs-a-btn[data-value='" + type + "']".
  • для поиска информации в ссылках, например Selenium Reference, для любых ограничений на селектора атрибутов CSS. в документе конкретно указано, что:

    В настоящее время css-селектор поддерживает все css1, css2 и css3 селекторов, кроме пространства имен в css3, некоторых псевдо классов (:nth-of-type, :nth-last-of-type, :first-of-type, :last-of-type, :only-of-type, :visited, :hover, :active, :focus, :indeterminate) и псевдо элементы (::first-line, ::first-letter, ::selection, ::before, ::after).

Ответ 1

Ссылка, с которой вы связаны, предназначена для Selenium IDE.

Документацию Selenium WebDriver можно найти в основном на официальном сайте здесь (основное использование) и здесь (расширенное использование), но также здесь (aka "Что еще не попало в документы" - особенно FAQ, Расширенные взаимодействия с пользователем и много информации о внутренностях Selenium). Основным источником информации являются, конечно, JavaDocs.


В любом случае. Селекторы CSS, поддерживаемые Selenium, поддерживаются браузером под ним (за исключением Selenium RC с механизмом Sizzle CSS), поэтому ваш пример должен определенно работать. С помощью этой простой тестовой страницы:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
    </head>
    <body>
        <input type="text" id="myInput" class="field" data-test="testytest" />
    </body>
</html>

Я смог успешно запустить это как в IE 8 (!!), так и в Firefox 13:

WebDriver driver = new FirefoxDriver();
driver.get("path to the file");
By cssSelector = By.cssSelector(".field[data-test='testytest']");
        // or By.cssSelector(".field[data-test=testytest]")
        // or By.cssSelector(".field[data-test]")
driver.findElement(cssSelector).sendKeys("Hello");
driver.quit();

Итак, я выкопал больше. Если вы попытаетесь запустить любой из них в консоли Firebug FF13:

document.querySelector(".field[data-test]")
document.querySelector(".field[data-test=testytest]")
document.querySelector(".field[data-test='testytest']")

он возвращает правый элемент. Однако любое из этого:

document.querySelector(".field['data-test']")
document.querySelector(".field[\"data-test\"]")

не удалось установить ошибку "Неверная или незаконная строка" (как в Firefox, так и в IE), которая является правильной (и, следовательно, полученное вами сообщение об ошибке было правным, селектор недействителен).

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