我使用selenium + vba启动chrome来打开单元格范围(“A1:A10”)中列出的10个urls。我对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提出的几个问题和问题:
如果有专家能帮我优化我的代码,那将是非常感谢的!我的系统是Win7 64位+ Excel 2010。
带着最好的问候谢谢。
发布于 2016-02-20 05:08:57
我很困惑为什么我必须发送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之后,vba会弹出“内存不足”错误,并停止加载下一个url。但是,如果在调试环境中逐行运行代码,则可以成功打开所有10个urls。为什么会这样呢?
可能是因为部分内存是在页面完全加载后释放的。但是,由于您是在一行中加载所有页面,所以它可能没有给浏览器留下足够的时间来管理它的内存。如果有的话,我会尝试禁用插件(特别是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我在googled上搜索到,如果我想在运行完宏后不退出,我必须在子程序之外声明object selenium,尽管我不太明白原因。有人能用简单的方式解释我吗?
一旦不再使用保存驱动程序的变量,驱动程序就会自动终止。请查看此链接以获取有关变量和作用域的更多信息: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 Subhttps://stackoverflow.com/questions/35449770
复制相似问题