Selenium + VBA 来控制 Chrome

Hun*_*t01 2 excel selenium vba google-chrome

我使用 selenium + vba 启动 chrome 以打开单元格范围(“A1:A10”)中列出的 10 个网址。我对 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
Run Code Online (Sandbox Code Playgroud)

提出的几个麻烦和问题:

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

  2. 为什么我必须在打开新标签后添加 selenium.SwitchToNextWindow ,或者下一个 url 将在原始标签上打开,而不是新标签?

  3. 经常在打开3~5个url后,vba弹出“内存不足”错误,停止加载下一个url。但是如果我在调试环境中逐行运行代码,则可以成功打开所有10个url。为什么?

  4. 我在谷歌上搜索到,如果我希望 chrome 在运行完宏后不退出,我必须在 sub 之外声明对象 selenium,尽管我不太明白原因。谁能帮我用简单的方式解释一下?

如果任何专家可以帮助我优化我的代码,那将不胜感激!我的系统是Win7 64位+ Excel 2010。

致以最诚挚的问候。

Flo*_* B. 5

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

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

driver.SendKeys Keys.Control, "t"
Run Code Online (Sandbox Code Playgroud)

在您的情况下,更好的方法是使用一些 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
Run Code Online (Sandbox Code Playgroud)

为什么我必须在打开新标签后添加 selenium.SwitchToNextWindow ,或者下一个 url 将在原始标签上打开,而不是新标签?

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

经常在打开3~5个url后,vba弹出“内存不足”错误,停止加载下一个url。但是如果我在调试环境中逐行运行代码,则可以成功打开所有10个url。为什么?

可能是因为页面完全加载后会释放一些内存。但是由于您正在连续加载所有页面,因此浏览器可能没有足够的时间来管理它的内存。如果有的话,我会尝试禁用插件(尤其是 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
Run Code Online (Sandbox Code Playgroud)

我在谷歌上搜索到,如果我希望 chrome 在运行完宏后不退出,我必须在 sub 之外声明对象 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 Sub
Run Code Online (Sandbox Code Playgroud)