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

Мотивация

Использовать механизм селектора 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/[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 + "']".
  • # P3 #
    # P4 #

person Eliran Malka    schedule 19.06.2012    source источник
comment
Вы пытались заменить или избежать кавычек в значении type?   -  person BoltClock    schedule 19.06.2012
comment
да, безрезультатно. Теперь, продолжая расследование, это похоже на проблему времени, поскольку выбор By.cssSelector с помощью селекторов атрибутов кажется медленнее, чем простое использование By.className. время от времени он дает сбой.   -  person Eliran Malka    schedule 19.06.2012
comment
@EliranMalka By.className внутренне использует (по крайней мере, в Firefox) document.getElementsByClassName() (который кэшируется) и, следовательно, должен быть почти мгновенным. By.cssSelector использует document.querySelector() и document.querySelectorAll(), что требует времени для анализа и обработки. Если это проблема времени, я бы ожидал случайного NoSuchElementException (который можно исправить), а не странного UnknownServerException.   -  person Petr Janeček    schedule 01.07.2012


Ответы (2)


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

Документацию по Selenium WebDriver можно найти в основном на официальном сайте здесь (базовое использование) и здесь (расширенное использование), но также здесь (также известный как" Что еще не вошло в документацию ", особенно 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();

Так что копал еще. Если вы попытаетесь запустить что-либо из этого в консоли FF13 Firebug:

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 не содержит кавычек, обратных косых черт и т. Д. Конструкция определенно должна работать. Если это не так, опубликуйте новую трассировку стека исключений, чтобы мы могли увидеть точный селектор, который ее вызвал.

person Petr Janeček    schedule 01.07.2012
comment
Ничего удивительного - IE8 поддерживает все селекторы CSS2.1 (а также IE7 с некоторыми странными ошибками). - person BoltClock; 01.07.2012
comment
@BoltClock Точно. Вот почему я так озадачен этой проблемой. Показанное исключение было явной ошибкой, но фрагмент в разделе Relevant code вопроса должен работать нормально. Я действительно с нетерпением жду новой трассировки стека. - person Petr Janeček; 01.07.2012
comment
Отлично. Большое спасибо, вы абсолютно правы - это должно было сработать, и, похоже, у меня были две проблемы: 1. проблемы с синхронизацией как часть потока тестирования, т.е. элемент не был прикреплен вовремя доступа, поэтому я использовал повторяющиеся утверждения для отладки, и 2. двойные кавычки выявляли ошибки, о которых я не знал. - person Eliran Malka; 02.07.2012
comment
О сроках - чаще всего нужно делать неявные ожидания и, если необходимо , Явное ожидание тоже. - person Petr Janeček; 02.07.2012
comment
@Slanec, я недавно узнал об этом, и ссылка немного скрашивает. Благодарю. - person Eliran Malka; 02.07.2012
comment
@EliranMalka Я также недавно написал это: stackoverflow.com/questions/11244697/ - person Petr Janeček; 02.07.2012
comment
В моем случае мне нужно было добавить одинарные кавычки - document.querySelector (.field [data-test = 'testytest']) - person acarlon; 28.11.2013

У меня тоже было такое же исключение.

Поэтому я попробовал найти элемент через Xpath вместо селектора Css, и проблема была решена.

Ниже был код с проблемой

By.CssSelector("Css selector").GetAttribute("value");

Код, который работал

By.XPath("Xpath of element").GetAttribute("value");
person Shubham Panhalkar    schedule 03.03.2021