【问题标题】:Selenium + VBA to Control ChromeSelenium + VBA 控制 Chrome
【发布时间】:2016-05-28 17:57:15
【问题描述】:

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

提出的几个麻烦和问题:

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

  2. 为什么我打开新标签后必须添加 selenium.SwitchToNextWindow,否则下一个 url 会在原来的标签上打开,而不是新标签?

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

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

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

致以最诚挚的谢意。

【问题讨论】:

    标签: excel vba google-chrome selenium


    【解决方案1】:

    我很困惑为什么我必须发送 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 会弹出 "not enough memory" 错误并停止加载下一个 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
    

    我在谷歌上搜索,如果我希望 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
    

    【讨论】:

    • 非常感谢您的清晰解释,florentbr。我尝试了您的代码并稍微延长了等待时间,然后效果很好。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2015-11-16
    相关资源
    最近更新 更多