2
votes

Comment compter les éléments d'une classe avec VBA + SELENIUM en chrome?

Je veux compter le nombre d'éléments visant à obtenir tous leurs noms et à les stocker dans un tableau.

Les noms sont surlignés comme indiqué dans l'image

Mon code:

  Set a = bot.findElementsByClassName("board-canvas", 5).Count

J'ai essayé:

  Public Sub seleniumtutorial()
  Dim bot As New SeleniumWrapper.WebDriver
  Dim a As WebElement
  Dim b As WebElement
  Dim x() As Integer

  bot.Start "chrome", "https://trello.com/login"
  bot.get "/"

  bot.Type "name=user", "biaverly@id.uff.br"
  bot.Type "name=password", "carambola69"
  bot.clickAndWait "id=login"
  bot.findElementByLinkText("Gestão de Pessoas").Click

et trouve des éléments par xpath et id.


3 commentaires

Veuillez ne pas publier de photos de HTML. Utilisez l'outil de capture via l'édition.


Je suis nouveau ici, ils ne me laissent pas encore faire ça. :\ J'ai essayé


Oh vraiment? Vous pouvez utiliser l'outil d'extrait de code? Si vous utilisez pastebin.com, je peux le modifier pour vous à partir du lien que vous partagez


3 Réponses :


0
votes

findElementsByClassName est certainement ce que vous voulez mais votre utilisation ne semble pas correcte. Je suis presque sûr que .count renvoie un long, pas un élément Web ou un tableau d'éléments Web. Je suis également presque sûr que cela ne prend pas un deuxième paramètre, qu'essayez-vous d'accomplir avec , 5 et quel était votre message d'erreur?

Pour obtenir le nombre d'éléments dans cette classe

Dim classTxt as String
Set a = bot.findElementsByClassName("board-canvas")
For each b in a
classTxt = b.Text
Next b

Se référant au dernier élément de cette classe

bot.findElementsByClassName("board-canvas").Item(classCount).Text

Le contenu du dernier élément de cette classe

bot.findElementsByClassName("board-canvas").Item(classCount)

Maintenant, malheureusement, c'est là que je peux dévier un peu parce que je n'ai pas mon travail disponible pour référence, mais je pense que vous pouvez récupérer la collection et parcourir la classe comme ça

Dim classCount as Long
classCount = bot.findElementsByClassName("board-canvas").Count


0 commentaires

2
votes

Attention: ce qui suit est pour le sélénium basique vba. Cela utilise la bibliothèque de types Selenium et est basé sur le développement de @ florentbr à partir de ici . La syntaxe que vous utilisez me fait penser que la question est potentiellement mal étiquetée car la syntaxe, pour la plupart, concerne sélénium IDE . Vous ne savez pas si vous convertissez un script? Je ne me souviens pas que VBA soit une langue prise en charge pour l'EDI mais ......


Les en-têtes Trello seront le nom de classe list-header-name .

J'utiliserais plus rapidement .FindElementsByCss

So,

Option Explicit

Public Sub SeleniumTutorial()
    Dim bot As WebDriver, titles As Object, i As Long
    Dim numberOfWebElements As Long, names(), t As Date
    Const MAX_WAIT_SEC As Long = 10

    Set bot = New ChromeDriver

    With bot
        .get "https://trello.com/login"
        .Window.Maximize
        .FindElementById("user").SendKeys "userName"
        .FindElementById("password").SendKeys "passWord"
        .FindElementById("login").Click
        .FindElementByLinkText("Gestão de Pessoas", timeout:=5000).Click  '< named argument

        t = Timer
        Do
            On Error Resume Next
            Set titles = bot.FindElementsByCss(".list-header-name")
            numberOfWebElements = titles.Count
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While numberOfWebElements = 0

        If numberOfWebElements = 0 Then Exit Sub

        ReDim names(1 To numberOfWebElements)

        For i = 1 To titles.Count
            names(i) = titles.item(i).Text
        Next

        Stop 'delete me later

    End With
End Sub

Le "." avant list-header-name est un css sélecteur de classe . Les navigateurs modernes sont optimisés pour cela.


Le , 5 est la valeur de l'argument minimum ; comme vous n'avez pas utilisé d'arguments nommés, la correspondance sera positionnelle. Le troisième argument serait timeout . Le minimum et le timeout sont facultatifs.


Désormais, lorsque vous utilisez le mot-clé Set , il s'agit de l'attribuer à un variable objet:

Dim numberOfWebElements As Long
numberOfWebElements = titles.Count

Vous n'essayez pas de récupérer une propriété en même temps. Tentative:

Set titles = bot.FindElementsByCss(".list-header-name").Count

devrait conduire à une erreur de non-concordance de type .

Vous pouvez prendre séparément le décompte webElement de la collection avec

Dim titles As Object
Set titles = bot.FindElementsByCss(".list-header-name")

Pour trello, il existe des identifiants que vous pouvez utiliser pour vous connecter. J'utiliserais ceux-ci et la méthode SendKeys


Exemple de plan:

bot.FindElementsByCss(".list-header-name")


5 commentaires

Ah, merci d'avoir expliqué le deuxième paramètre. Dans mon travail, je n'utilise pas d'attentes explicites. Je le jette dans une boucle pour continuer à essayer jusqu'à ce qu'il réussisse, j'appuie sur une touche pour arrêter, ou un nombre arbitraire d'itérations s'est terminé et je suis invité à quitter ou à continuer d'essayer.


Tout ce qui fonctionne pour vous :-) Je préfère trouver la méthode qui m'offre la première sortie, bien que ce ne soit pas toujours facile / possible (du moins d'après mon expérience) à trouver.


N'utilisez pas ça. Voir ma réponse ci-dessus.


Si j'utilise Set title = bot.FindElementsByCss (". List-header-name"). Count affiche le message objet ne prend pas en charge cette propriété ou méthode sinon si je utilisez le code de trou de do, les titres sont vides donc numberOfWebElements = 0.


Pas à pas avec F8 - mon code utilise une boucle pendant jusqu'à 10 secondes pour permettre aux titres de cartes trello d'être présents. Le sous-marin doit quitter Si numberOfWebElements = 0. Utilisez-vous le code exactement comme ci-dessus mais avec vos informations d'identification?



0
votes

J'ai obtenu le xpath à partir d'un élément aléatoire de la classe "js-list list-wrapper" et c'était: //*[@id="board"letter/div[5ITED.

Donc je l'ai résolu en utilisant

 Dim titles As Object
 Set titles = 
 bot.findElementsByXPath("//[@id=""board""]/div")
 Dim ab As Long
 ab = titles.Count
 MsgBox ab


0 commentaires