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
).
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
Vous devez vous connecter pour publier un commentaire.
La référence que vous avez lié est pour Selenium IDE.
Selenium WebDriver documentation peut être trouvé principalement sur le site officiel ici (utilisation de base) et ici (utilisation avancée), mais aussi ici (un.k."Ce que ne pas le faire dans les docs encore", en particulier l' FAQ, Avancée Des Interactions De L'Utilisateur et beaucoup d'infos sur le Sélénium internes). Le principale source d'information sont, bien sûr, la La documentation javadoc.
De toute façon. Les Sélecteurs CSS pris en charge par le Sélénium sont ceux pris en charge par le navigateur en dessous (à l'exception de Selenium RC qui a un Grésillement moteur CSS), de sorte que votre exemple devrait certainement travailler. À l'aide de cette simple testpage:
J'ai été en mesure d'exécuter avec succès dans IE 8 (!!) et Firefox 13:
J'ai donc creusé plus. Si vous essayez d'exécuter tout cela dans FF13 console de Firebug:
il renvoie le bon élément. Cependant, tout cela:
échoue avec "Un invalide ou illégale de la chaîne a été spécifié" erreur (à la fois dans Firefox et IE), qui est correcte (et, par conséquent, le message d'erreur que vous avez obtenu a droite, le sélecteur n'est pas valide).
S'il vous plaît, essayez une fois de plus, se débarrasser de tout devis, assurez-vous que votre
type
variable ne contient pas toutes les citations ou des barres obliques inverses ou autres joyeusetés. La construction devrait certainement travailler. Si ça ne marche pas, poste le nouveau trace de pile d'exception afin que nous puissions voir exactement sélecteur qui l'a causé.Exactement. C'est pourquoi je suis très perplexe sur le problème. L'exception était une erreur évidente, mais l'extrait de code dans le
Relevant code
section de la question devrait fonctionner. Je suis vraiment impatient de la nouvelle trace de la pile.grand. merci beaucoup, vous avez absolument raison - ce qui devrait avoir travaillé, et il semble que je ai eu deux problèmes: 1. les problèmes de synchronisation dans le cadre de l'essai de débit, c'est à dire l'élément n'a pas été jointe à l'heure de l'accès, alors j'ai utilisé répétitif affirmations de débogage, et 2. les guillemets manifeste des erreurs, j'étais pas au courant.
Sur le calendrier le plus souvent une chose à faire sont Implicite attend et, le cas échéant, Explicite attend, aussi.
récemment, j'ai appris à connaître ce, et le lien d'éclaircir les choses un peu. merci.
OriginalL'auteur Petr Janeček