Selenium + VBA控制Chrome

我用selenium + vba启动chrome打开10个单元格区域(“A1:A10”)列出的URL。 我不熟悉selenium,经过很多次我终于出来下面笨重的代码。

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 

提出了几个麻烦和问题:

  1. 我很困惑为什么我必须发送2次“Ctrl + t”键才能成功打开新标签页。

  2. 为什么我要添加selenium.SwitchToNextWindow在打开新标签之后,还是会在原来的标签上打开下一个url,而不是新标签?

  3. 经常打开3〜5个URL后,vbapopup“内存不足”的错误,停止加载下一个url。 但是如果我在debugging环境中逐行运行代码,那么所有10个URL都可以成功打开。 为什么?

  4. 我search了一下,如果我想要chrome在完成运行macros之后不退出,我不得不在sub之外声明对象selenium,尽pipe我不太明白原因。 任何人都可以帮助解释我明白吗?

如果有专家可以帮助我优化我的代码,那将非常感谢! 我的系统是Win7 64bit + Excel 2010。

谢谢你最好的问候。

我很困惑为什么我必须发送2次“Ctrl + t”键才能成功打开新标签页。

修饰键应该在第一个参数中,在第二个键中:

 driver.SendKeys Keys.Control, "t" 

在你的情况下,更好的方法是用一些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 

为什么我要添加selenium.SwitchToNextWindow在打开新标签之后,还是会在原来的标签上打开下一个url,而不是新标签?

打开新窗口时,驱动程序的上下文保持不变。 你必须明确地告诉司机,你想在另一个窗口上操作。

经常打开3〜5个URL后,vbapopup“内存不足”的错误,停止加载下一个url。 但是如果我在debugging环境中逐行运行代码,那么所有10个URL都可以成功打开。 为什么?

可能是因为一旦页面被完全加载,一些内存被释放。 但是,由于您要连续加载所有页面,因此可能不会让浏览器有足够的时间pipe理内存。 我会尝试禁用插件,如果有(尤其是Flash),并添加一些等待:

 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 

我search了一下,如果我想要chrome在完成运行macros之后不退出,我不得不在sub之外声明对象selenium,尽pipe我不太明白原因。 任何人都可以帮助解释我明白吗?

一旦持有驱动器的variables不再使用,驱动程序将自动终止。 检查此链接以获取有关variables和作用域的更多信息: https : //support.microsoft.com/en-gb/kb/141693 。 所以为了让司机在程序外保持活跃状态​​,必须在外面声明:

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