Selenium + VBA pour contrôler Chrome

J'utilise selenium + vba pour lancer chrome pour ouvrir 10 URL listées dans la plage de cellules ("A1: A10"). Je ne suis pas familier avec le selenium, après avoir essayé beaucoup de fois, je suis enfin passé sous les codes clunky.

Private selenium As New ChromeDriver Sub test() Dim cell As Range Dim keys As New selenium.keys Dim pageNo As Integer pageNo = 0 selenium.Start "chrome", "http://www.google.com/" For Each cell In Range("A1:A10") If pageNo >= 1 Then selenium.SendKeys keys.Control & "t" + keys.Control & "t" selenium.SwitchToNextWindow End If selenium.Get cell.Value pageNo = pageNo + 1 Next End Sub 

Plusieurs problèmes et questions posés:

  1. Je suis confus pourquoi je dois envoyer 2 fois les touches "Ctrl + t" pour ouvrir avec succès un nouvel onglet.

  2. Pourquoi dois-je append selenium.SwitchToNextWindow après avoir ouvert un nouvel onglet, ou la prochaine URL sera ouverte sur l'onglet d'origine, pas un nouvel onglet?

  3. Très souvent après avoir ouvert 3 ~ 5 urls, vba triggers une erreur "pas assez de memory" et arrête de charger l'url suivante. Mais si je lance les codes ligne par ligne dans l'environnement de debugging, les 10 URL peuvent être ouvertes avec succès. Pourquoi ça?

  4. J'ai googlé que si je veux que chrome ne quitte pas après avoir fini d'exécuter une macro, je dois déclarer le selenium d'object à l'extérieur du sous, bien que je ne trouve pas tout à fait le motif. Quelqu'un pourrait-il m'aider à m'expliquer de façon claire?

Si des experts peuvent m'aider à optimiser mes codes, cela serait très apprécié! Mon système est Win7 64bit + Excel 2010.

Merci avec mes meilleures salutations.

Je suis confus pourquoi je dois envoyer 2 fois les touches "Ctrl + t" pour ouvrir avec succès un nouvel onglet.

La touche de modification doit être dans le premier argument et la key dans la seconde:

 driver.SendKeys Keys.Control, "t" 

Dans votre cas, une meilleure façon serait d'ouvrir une nouvelle window avec un peu de Javascript:

 Private Keys As New selenium.Keys Private driver As New selenium.ChromeDriver Sub test() Const JS_NEW_WINDOW = "window.open(arguments[0], name);" driver.Get "http://www.google.com/" For i = 0 To 9 If i Then driver.ExecuteScript JS_NEW_WINDOW, "http://www.google.com/" driver.SwitchToNextWindow driver.FindElementById("lst-ib").SendKeys "some text " & i End If Next End Sub 

Pourquoi dois-je append selenium.SwitchToNextWindow après avoir ouvert un nouvel onglet, ou la prochaine URL sera ouverte sur l'onglet d'origine, pas un nouvel onglet?

Le context du pilote rest le même lorsqu'une nouvelle window est ouverte. Vous devez indiquer explicitement au conducteur que vous souhaitez opérer sur une autre window.

Très souvent après avoir ouvert 3 ~ 5 urls, vba triggers une erreur "pas assez de memory" et arrête de charger l'url suivante. Mais si je lance les codes ligne par ligne dans l'environnement de debugging, les 10 URL peuvent être ouvertes avec succès. Pourquoi ça?

Probablement parce qu'une partie de la memory est relâchée une fois que la page est entièrement chargée. Mais puisque vous chargez toutes les pages d'affilée, il ne peut pas laisser au browser suffisamment de time pour gérer sa memory. J'essayerais de désactiver les plugins, le cas échéant (en particulier Flash) et append de l'attente:

 Dim driver As New Selenium.ChromeDriver driver.SetPreference "plugins.plugins_disabled", Array("Adobe Flash Player") For i = 0 To 9 driver.Get "http://www.google.com/" Waiter.wait 500 ' waits 500ms Next 

J'ai googlé que si je veux que chrome ne quitte pas après avoir fini d'exécuter une macro, je dois déclarer le selenium d'object à l'extérieur du sous, bien que je ne trouve pas tout à fait le motif. Quelqu'un pourrait-il m'aider à m'expliquer de façon claire?

Le pilote est automatiquement terminé une fois que la variable qui retient le pilote n'est plus utilisée. Consultez ce lien pour get plus d'informations sur les variables et les étendues: https://support.microsoft.com/en-gb/kb/141693 . Pour garder le conducteur en vie en dehors d'une procédure, il doit être déclaré à l'extérieur:

 Dim driver As Selenium.ChromeDriver Sub Main Set driver = New Selenium.ChromeDriver driver.Get "http://www.google.com/" End Sub