InvalidSelectorException en utilisant le sélecteur CSS pour localiser les “données” de l'attribut éléments notés

Motivation

À utiliser Sélénium sélecteur CSS mécanisme côtés avec attribut CSS sélecteurs et le HTML5 data- attribut personnalisé afin de répondre à certaines des crochets pour les éléments.

Question

Tout en utilisant la ci-dessus pour localiser un élément attribué avec un CSS classname et la data- attribut, l'exception suivante est générée:

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)

Code

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

Qu'ai-je essayé

  • remplacement des guillemets simples avec échappé des guillemets à l'intérieur du sélecteur d'attributs de la requête.
  • la spécification de l'attribut sélecteur au lieu de l'attribut-sélecteur de valeur, c'est à dire ".gs-a-btn[\"data-value\"]" plutôt ".gs-a-btn[data-value='" + type + "']".
  • pour rechercher des informations dans les références, telles que la Le Sélénium De Référence, pour les restrictions sur l'attribut CSS sélecteurs. le document stipule que:

    Actuellement le sélecteur css locator prend en charge tous les css1, css2 et css3
    sélecteurs à l'exception de l'espace de noms dans le css3, les pseudo-classes(:nth-of-type,
    :nth-last-of-type, :first-of-type, :last-of-type, :only-of-type,
    :visited, :hover, :active, :focus, :indeterminate) et pseudo
    éléments(::first-line, ::first-letter, ::selection, ::before,
    ::after).

Avez-vous essayé de les remplacer ou de s'échapper les guillemets dans la type valeur?
yup, en vain. poursuit maintenant dans l'enquête, il semble comme un problème de timing, comme le choix de By.cssSelector avec sélecteur d'attribut semble prendre plus de temps que de simplement en utilisant By.className. c'est à défaut de façon sporadique.
By.className utilise en interne (au moins sur Firefox) document.getElementsByClassName() (ce qui est mis en cache) et doit, par conséquent, être presque instantanée. By.cssSelector utilise document.querySelector() et document.querySelectorAll() qui prend un certain temps à analyser et à traiter. Si c'est un problème de timing, je m'attends à une occasionnelle NoSuchElementException (qui peut être fixe), pas un étrange UnknownServerException.

OriginalL'auteur Eliran Malka | 2012-06-19