首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >硒+ VBA控制铬

硒+ VBA控制铬
EN

Stack Overflow用户
提问于 2016-02-17 06:50:18
回答 1查看 23.4K关注 0票数 2

我使用selenium + vba启动chrome来打开单元格范围(“A1:A10”)中列出的10个urls。我对selenium并不熟悉,经过多次尝试之后,我终于在笨重的代码下面出来了。

代码语言:javascript
复制
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个urls。为什么会这样呢?
  4. 我在googled上搜索到,如果我想在运行完宏后不退出,我必须在子程序之外声明object selenium,尽管我不太明白原因。有人能用简单的方式解释我吗?

如果有专家能帮我优化我的代码,那将是非常感谢的!我的系统是Win7 64位+ Excel 2010。

带着最好的问候谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-02-20 05:08:57

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

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

代码语言:javascript
复制
driver.SendKeys Keys.Control, "t"

在您的示例中,更好的方法是使用Javascript打开一个新窗口:

代码语言: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),并添加一些等待:

代码语言:javascript
复制
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。因此,为了使司机活在程序之外,必须在程序外部声明:

代码语言:javascript
复制
Dim driver As Selenium.ChromeDriver

Sub Main
  Set driver = New Selenium.ChromeDriver
  driver.Get "http://www.google.com/"

End Sub
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35449770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档