11
votes

Comment éviter l'erreur de nom de classe composée dans l'objet de la page?

Lorsque j'essaie d'utiliser le nom de la classe qui ayant de l'espace class = "nom de pays" xxx

Comment puis-je Utilisez le nom de la classe qui ayant de l'espace.

par exemple: xxx


5 Réponses :


0
votes

Si vous avez des noms de classe qui ont des espaces dans eux, vous obtiendrez cette erreur. Une façon d'éviter consiste à créer un xpath pour identifier l'élément. Si vous affichez le HTML, je peux créer le XPath. Essayez également d'utiliser des noms de classe comme plusieurs objets auront le même nom de classe.


3 commentaires

Utilisation de xpath ( // * [@ class = nom de pays '] ou même pire // * [contient (@class, "pays") et contient (@class, "nom" )] ) est très faux. Il traite la classe extrart comme texte lorsque nous savons que c'est une liste de jetons séparés par l'espace et nous avons les outils pour interagir avec intelligemment (via CSS Selectors). Que se passe-t-il si l'élément obtient une nouvelle classe en plus des classes existantes? Que se passe-t-il si les classes sont échangées dynamiquement? Chaque fois que nous pouvons traiter des données logiquement au lieu de stupidement, nous devrions. La seule exception est que nous sommes vraiment sûrs que nous voulons faire correspondre des classes texte et non logiques


Quoi qu'il en soit, si vous souhaitez vraiment utiliser des expressions XPath pour faire correspondre des classes, l'équivalent des sélecteurs CSS est celui-ci: // * [contient (concat ('', espace normalisé (@class), '') ') Et contient (Concat (' ', Normalize-Space (@class),' '),' Nom ')]] . Assez long et complexe, hein? Cela traite la liste des classes comme une liste logique et non comme un texte muet.


Eh bien, mon seul problème est s'il y a plusieurs objets avec le même nom de classe. Si HTML est fourni, je peux créer un simple XPath, ce qui pourrait probablement ne pas nous obliger à utiliser le nom de la classe, logiquement



0
votes

Vous devrez supprimer l'espace du nom de la classe, auquel cas Sélénium devrait toujours dans la théorie trouver les éléments dont vous avez besoin ou, utilisez un sélecteur CSS et combinez-le avec une période / complète Arrêtez-vous de concaténer les noms de classe ensemble.

IE, à l'aide d'un sélecteur CSS pour cibler ceci: xxx

Vous pouvez utiliser: xxx

ou vous pouvez rendre votre sélecteur un peu plus élaboré: xxx


1 commentaires

Div.Country.Code est la solution correcte (peut être même sans la partie div ). Je voterais contre [class = 'code de pays'] à tout moment par jour. Ceci traite l'attribut Classe en tant que texte simple pendant que nous savons que c'est une liste de jetons séparées par l'espace et que nous avons les outils pour interagir avec elle de manière intelligente. Que se passe-t-il si l'élément obtient une nouvelle classe en plus des classes existantes? Que se passe-t-il si les classes sont échangées dynamiquement? Dans les deux cas, la solution naïf [class = 'code'] ne correspond pas à quelque chose comme quelque chose comme .country.code ou * [Classe ~ = Pays] [Classe ~ = code] fonctionnera.



18
votes

Utilisez un sélecteur CSS à la place:

.country.name


1 commentaires

Devons-nous échapper aux slashes et aux citations? Je suis en python au fait.



2
votes

Vous pouvez utiliser l'un de ces noms de classe, par exemple

:xpath => '//div[@class='country code']


0 commentaires

3
votes

Vous pouvez utiliser avec ce xxx


0 commentaires