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
提出了几个麻烦和问题:
-
我很困惑为什么我必须发送2次“Ctrl + t”键才能成功打开新标签页。
-
为什么我要添加selenium.SwitchToNextWindow在打开新标签之后,还是会在原来的标签上打开下一个url,而不是新标签?
-
经常打开3〜5个URL后,vbapopup“内存不足”的错误,停止加载下一个url。 但是如果我在debugging环境中逐行运行代码,那么所有10个URL都可以成功打开。 为什么?
-
我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