关于excel:硒+ VBA控制Chrome

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