Selenium + VBA to Control Chrome
我使用硒+ vba启动chrome,以打开单元格范围(" A1:A10")中列出的10个网址。
在尝试了很多次之后,我终于对笨拙的代码有所了解,我对硒并不熟悉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |
提出了一些麻烦和问题:
我很困惑为什么我必须发送两次" Ctrl + t"键才能成功打开新标签页。
为什么我必须在打开新标签后添加selenium.SwitchToNextWindow,否则下一个URL将在原始标签而非新标签上打开?
在打开3?5个网址后,vba经常会弹出"内存不足"错误并停止加载下一个网址。但是,如果我在调试环境中逐行运行代码,则可以成功打开所有10个url。为什么?
我用谷歌搜索,如果我想让chrome在完成运行宏后不退出,我必须在子程序外声明对象硒,尽管我不太清楚原因。谁能以简单的方式帮助我解释一下?
如果有任何专家可以帮助我优化代码,将不胜感激!我的系统是Win7 64位+ Excel 2010。
致以最诚挚的谢意。
I am confused why I have to send 2 times of"Ctrl+t" keys to successfully open new tab.
修饰键应在第一个参数中,键应在第二个参数中:
1 | driver.SendKeys Keys.Control,"t" |
在您的情况下,更好的方法是使用某些Javascript打开新窗口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
Why that I have to add selenium.SwitchToNextWindow after opening new tab, or the next url will be opened on the original tab, not new tab?
当打开新窗口时,驱动程序的上下文保持不变。您必须明确告诉驱动程序您要在另一个窗口上进行操作。
Quite often after opening 3~5 urls, vba pops up"not enough memory" error and stops loading the next url. But if I run the codes line by line in debugging environment, all 10 urls can be successfully opened. Why's that?
可能是因为在页面完全加载后释放了一些内存。但是,由于您要连续加载所有页面,因此可能不会使浏览器有足够的时间来管理其内存。
我会尝试禁用插件(如果有的话)(尤其是Flash)并添加一些等待:
1 2 3 4 5 6 | 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 |
I googled that if I want chrome not to exit after finishing running macro, I have to declare object selenium outside the sub though I do not quite get the reason. Could anyone help explain me in plain way?
一旦不再使用保存驱动程序的变量,驱动程序将自动终止。
检查此链接以获取有关变量和范围的更多信息:https://support.microsoft.com/en-gb/kb/141693。
因此,要使驱动程序在过程之外仍然存在,必须在外部进行声明:
1 2 3 4 5 6 7 | Dim driver As Selenium.ChromeDriver Sub Main Set driver = New Selenium.ChromeDriver driver.Get"http://www.google.com/" End Sub |