Selenium + VBA 控制 Chrome

2023-12-10

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

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. 我很困惑为什么我必须发送两次“Ctrl+t”键才能成功打开新选项卡。

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

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

  4. 我在谷歌上搜索到,如果我希望 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,否则下一个网址将在原始选项卡上打开,而不是在新选项卡上打开?

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

通常在打开 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,尽管我不太明白原因。有人可以帮我简单地解释一下吗?

一旦不再使用保存驱动程序的变量,驱动程序就会自动终止。 检查此链接以获取有关变量和范围的更多信息: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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium + VBA 控制 Chrome 的相关文章

  • 滚动在 chrome 中的 svg 异物内不起作用

    我在 svg 异物中有 div 带有溢出 auto 滚动仅适用于鼠标滚轮 无法拖动栏 它适用于 Firefox 但不适用于 chrome safari 如果 svg g 元素上没有转换 它就可以工作 参见小提琴 http jsfiddle
  • 当第二个工作表中存在值时删除整行

    我有 2 张纸 sheet1 和sheet2 我在单元格 A3 sheet1 中有一个值 该值不是恒定的 Sheets2 中还有许多文件 我想做的是 当单元格 A3 Sheet1 中的值与 A 列 Sheet2 中的值相同时 它将删除找到该
  • 无法使用 chrome.desktopCapture 和 RecortRTC 获取扬声器 + 麦克风音频

    我正在尝试构建一个 chrome 扩展程序 用于捕获用户屏幕及其扬声器音频 计算机音频 和麦克风音频 使用 RecordRTC 中的示例 我将以下内容拼凑在一起 但是当我打开录制的 webm文件我根本听不到任何声音 我还应该做些什么来获取音
  • 如何创建动态变量名VBA

    我正在尝试根据单元格中的值在 VBA 中创建动态数量的变量 本质上我想要的结果是这样的Team1 Team2 to TeamX 任何帮助是极大的赞赏 Dim i x As Integer Set x Range J4 Value Dim T
  • 使用 javascript/jquery 检查 .css 样式表的名称

    我正在尝试为论坛制作一个小 chrome 扩展 但我只希望它在论坛的某个区域中工作 问题是我不能只做 matches subforum 因为该论坛中的线程无法通过 URL 区分它们所在的子论坛 subforum 有自己的 css 样式表 所
  • 在 Excel 中打印 MATLAB 图窗并调整其大小

    我在 MATLAB 中有两个带有手柄的图形hFig1 and hFig2 我想将它们打印到 Excel 中的特定单元格 单元格 E3 和 I3 并将它们重新调整为 2 英寸 x 3 英寸 我尝试过使用 AddPictures对象处理程序和使
  • 如何在自定义数据验证中使用用户定义的函数?

    In my Worksheet我有一个Table并想要定义Data validation对于包含日期的列 如下所示 S2M B2 lt gt Error 在上面 S2M 是一个用户定义的函数 用于将日期转换为Persian date to
  • 卡片栏嵌入推文:Chrome 和其他浏览器之间的差异

    我使用 Bootstrap 4 卡栏在我的网站上分享推文 我注意到 Chrome 和其他浏览器之间的区别 事实上 Chrome 丢失了第二列和第三列的一些信息 您可以在捕获中看到这一点 你可以帮帮我吗 抱歉我的英语不好 我是年轻的法国开发者
  • 将单独的范围放入二维数组中

    我正在尝试获取大小的二维数组 x 3 填充 X只是工作表的大小 行数 并且有 3 列我感兴趣 例如 这些列彼此不靠近arr i 0 应从 AA 栏开始填写 arr i 1 应来自 K 列 并且arr i 2 需要来自 L 列 我尝试按以下方
  • Chrome 中的 CSS 列不平衡

    我想使用以下方法在多列中动态显示一些 Bootstrap 列表组CSS 列 https developer mozilla org en US docs Web Guide CSS Using multi column layouts 但我
  • ATL创建的COM接口继承IDispatch但后期绑定不起作用

    这是我的 IDL 文件 IFrame 是一个双接口 同时继承了 IDispatch 和 IUnknown object uuid C5AD0517 37FC 479C 9C7A A063B17E4A2E dual nonextensible
  • Excel countif 单元格中的日期大于或等于另一个单元格中的日期

    这已经让我难受有一段时间了 我只需要计算一个单元格中的日期是否大于或等于另一个单元格中的日期 减去 x 天 例如 A1 2014 年 2 月 20 日 B1 2014年1月20日 COUNTIF B1 gt A1 30 30 就是负 30
  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • 请参阅使用代号的表

    我在此代码中收到 类型不匹配 错误 With Worksheets Sheet1 Error here my code here End With 我的床单CodeName is sheet1 有人可以帮我消除错误吗 1 按索引参阅表 Wi
  • MS Excel 对于每个循环:插入行

    我有一个包含 242 行的工作表 我想在每个现有行下面创建一个新行 相反 我的代码在第 1 行下方创建了 242 行 我花了整个下午的时间在 Google 和 Stack Overflow 上 尝试了各种想法 但遇到了同样的问题 这是我的代
  • 遍历 Excel 工作表

    这是我的代码 我是 VBA 新手 所以我不确定如何迭代多个页面 这是我的代码 Dim ws As Worksheet Sub spellCheck For Each ws In ActiveWorkbook Worksheets Cells
  • Excel 对象库文件在哪里

    我正在寻找 Excel 对象库文件以将其导入 LabVIEW 我安装了 MS Office 2013 可以找到 MSACC olb MSOUTL olb MSPPT olb 和 MSWORD olb 但无法确定要导入哪个文件 olb 或 d
  • Excel VBA 公式德语/法语/意大利语/俄语/荷兰语/外国函数

    当我将数据添加到工作簿时 需要将公式从较早的单元格复制到新单元格 我使用以下公式来计算我的增长率 WENN ODER K9 L9 WENNFEHLER L9 K9 K9 由于这非常耗时 我想用宏来改进它 因此编写了以下代码 Sub Grow
  • Selenium 网页抓取与动态内容和隐藏数据表上的美丽汤

    真的需要这个社区的帮助 我正在使用 Selenium 和 Beautiful Soup 对 Python 中的动态内容进行网页抓取 问题是定价数据表无法解析为 Python 即使使用以下代码 html browser execute scr
  • 如何以可读的方式重写Excel公式?

    我有一个 Excel 文件 其中包含以下公式 IF OR ISERROR G16 ISERROR G17 X16 IF OR G16 xxx G16 yyy G16 zzz Y16 IF G16 333 N A IF G17 333 Z16

随机推荐