J'ai récemment tenté d'utiliser la fonction RC de Selenium. GetAttribute mais s'est immédiatement heurté à un problème. J'ai essayé d'exécuter une méthode très simple selenium.GetAttribute("//a/@href")
mais le code a déclenché une SeleniumException avec le message suivant "ERROR : Impossible de trouver l'attribut de l'élément : //a/@href" . En substituant selenium.GetText("//a[@href]")
à la place de la GetAttribute j'ai confirmé qu'un élément était bel et bien présent, puisque cette déclaration a correctement renvoyé le texte du lien.
J'ai alors essayé :
- en pointant vers une page web différente avec un protocole différent (file:/// vs http://) -- même problème.
- en utilisant un localisateur xpath différent pointant vers un attribut différent -- même problème.
- utiliser un localisateur DOM
selenium.GetAttribute("document.getElementsByTagName('a')[0].getAttribute('href')")
-- même problème ; message d'erreur légèrement différent (et il manque la parenthèse finale dans le message d'erreur) : "ERROR : Element document.getElementsByTagName('a')[0].getAttribute('href' not found" . Notez que cette expression exacte fonctionne correctement dans la console de Firebug. - en utilisant un adressage xpath absolu plutôt que relatif, avec
selenium.GetText("xpath=/html/body/a[@href]")
pour confirmer l'existence et ensuiteselenium.GetAttribute("xpath=/html/body/a/@href")
pour obtenir l'attribut - et ça a marché !
Alors que le manuel indique clairement que relatif Les localisateurs xpath n'ont pas besoin d'un type de localisateur explicite (c'est-à-dire le préfixe "xpath=") ; il est silencieux à ce sujet. absolu xpath locators ; j'en déduis que le préfixe est nécessaire. Mais par curiosité, je suis retourné à mon expression relative et j'ai ajouté le préfixe explicite - en changeant selenium.GetAttribute("//a/@href")
à selenium.GetAttribute("xpath=//a/@href")
-- et cela a également fonctionné !
Enfin, mes expériences avec le très pratique Trouvez dans Selenium IDE montre qu'il fonctionne bien avec les éléments mais échoue avec les attributs. Je peux comprendre qu'il n'est pas utile de mettre en évidence un attribut puisque les attributs ne sont pas des éléments de page visibles, mais pourquoi ne pas mettre en évidence l'élément contenant l'attribut, et le faire dans une couleur différente ? Ce n'est peut-être pas une tâche triviale...
Mes questions :
J'ai ramené les résultats des expériences ci-dessus à ces questions ; c'est le but de mon post ici ! Chacune de ces questions me semble être un bug, mais faites-moi savoir si vous pensez que mon utilisation est incorrecte ou s'il existe une solution de contournement :
- Pourquoi GetAttribute avec un type de localisateur XPath nécessite-t-il uniquement un fichier explicite le type de locator lorsque d'autres méthodes (par exemple GetText) ne le font pas ?
- Pourquoi le DOM locator a-t-il échoué avec une erreur 'not found' ? (Le manuel indique clairement que les localisateurs DOM ne peuvent pas être utilisés par les utilisateurs. pas nécessite un préfixe de type de localisateur explicite, mais j'ai néanmoins essayé d'ajouter "dom=" comme préfixe sur le test DOM ; cela a encore échoué).
- Pourquoi Selenium IDE n'échoue-t-il pas plus gracieusement lorsqu'il tente de mettre en évidence (trouver) un attribut ? Avec le même
"xpath=//a/@href"
En appuyant sur le bouton "Trouver", vous obtenez ce vilain message : "[error] locator not found : xpath=//a/@href, error = [Exception... "Impossible de convertir l'argument JavaScript arg 0 [inIFlasher.scrollElementIntoView]" nsresult : "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" localisation : "JS frame : : chrome://selenium-ide/content/selenium-runner.js : : showElement : : line 386" data : no]"
Votre contribution est également demandée pour les points suivants : Le modèle que je voulais pour chaque test ici était (A) GetText ( locator-for-element-with-attribute ) pour confirmer la présence de l'élément puis (B) GetAttribute ( locator-for-attribute-itself ). Sur les 6 créneaux du tableau ci-dessous, j'en ai résolu 3 avec succès comme je viens de le détailler, et un 4ème semble être un bug. Y a-t-il des solutions pour les deux créneaux restants ?
Type GetText GetAttribute
XPath //a\[@href\] xpath=//a/@href
CSS css=a\[href\] ??
DOM ?? document.getElementsByTagName('a')\[0\].getAttribute('href')
(Détails : Selenium RC version 1.0.3, Navigateur : Firefox 3.6.13, Mon code cible en C#)