Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 硒+;VBA控制Chrome_Excel_Vba_Google Chrome_Selenium - Fatal编程技术网

Excel 硒+;VBA控制Chrome

Excel 硒+;VBA控制Chrome,excel,vba,google-chrome,selenium,Excel,Vba,Google Chrome,Selenium,我使用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 "ch

我使用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
提出了几个问题:

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

  • 为什么我必须在打开新选项卡后添加selenium.SwitchToNextWindow,否则下一个url将在原始选项卡而不是新选项卡上打开

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

  • 我在谷歌上搜索到,如果我想让chrome在运行完宏后不退出,我必须在sub之外声明对象selenium,尽管我不太明白原因。谁能帮我简单地解释一下吗

  • 如果有专家能帮助我优化我的代码,那将不胜感激!我的系统是Win7 64位+Excel 2010

    谢谢,并致以最良好的问候

    我很困惑为什么我必须发送两次“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个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,尽管我不太明白原因。谁能帮我简单地解释一下吗

    一旦保存驱动程序的变量不再使用,驱动程序将自动终止。 检查此链接以获取有关变量和作用域的详细信息:。 因此,为了使驱动程序在程序外保持活动状态,必须在程序外声明:

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

    非常感谢你的清楚解释,弗洛伦特。我试过你的代码,把等待时间延长了一点,然后效果很好。再次感谢你。