ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 源理

[原创] vba中使用Selenium

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 13:59 | 显示全部楼层
chis3 发表于 2018-12-20 08:56
請問下樓主
官方是否不再更新vba的版本了?所以要用舊的firefox?

官方的VBA 一直没怎么动过了.但和用旧版本的firefox无关
这个是一个老外用.net封装的一个包装器,这个老外不更新了.最新的更新到2016年3月份了
不过.net封装程序是开源的一个项目,也说不定那个VBA 大神可能去搞一下,更新一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 14:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
chis3 发表于 2018-12-20 09:19
我有一個工作需要在網站重覆百多次的操作,希望這個幫到忙自動化就好了

肯定能行,不过我还没有写到,框架,异步求请
如果你没有这些需求,只是简单的操作应该都没有问题

TA的精华主题

TA的得分主题

发表于 2018-12-20 18:55 | 显示全部楼层
源理 发表于 2018-12-20 13:59
官方的VBA 一直没怎么动过了.但和用旧版本的firefox无关
这个是一个老外用.net封装的一个包装器,这个老 ...

也就是說,如果現在去官網下載的firefox是不能用的是不是?

TA的精华主题

TA的得分主题

发表于 2018-12-20 18:56 | 显示全部楼层
源理 发表于 2018-12-20 14:01
肯定能行,不过我还没有写到,框架,异步求请
如果你没有这些需求,只是简单的操作应该都没有问题

啊,謝謝
有個網要不停登入很多帳號再把pdf下載,很麻煩
和發薪時要登入銀行需要一個一個的輸入再提交形式的
沒有整個import file的提交,希望能自動化

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 21:22 | 显示全部楼层
本帖最后由 源理 于 2018-12-22 10:47 编辑

8、FindElementByXpath
说明: 查找与XPath查询相匹配的第一个元素。
语法基本与上面的一致这里略!
XPath也是一个很重要的东东,基本能定位到所有的元素,但用法很奇特,学习较困难。要在这里细说不太可能,我只能说一下概念。首先什么是xpath?》我的理解就是像文件地址一样的东东,然后用它来定位树形结构中的元素,,这种树形结构特指xml结构。具体学习地址:http://www.w3school.com.cn/xpath/index.asp这里有详解
下面是常用的一个路径示例截图

04-04

04-04
当然不指这点路径的功能,他还能通过他的“轴”(这个概念不好理解!)来定位与他相关的元素如:兄弟、儿子、父亲等等

04-05

04-05
轴的用法是轴名::节点
示例child::book  选取所有属于当前节点的子元素的 book 节点
常用函数有:Contains、starts-with、text、
我在这里列举几个用法
示例13

网页的dom结构

04-06

04-06
我们要查的是VBA版块中第一个帖子,(置顶的不算)。我们可以看到我们要找的网页元素的id是一个后台生成的可变的id,可能今天能用,明天就不行了。现在的思路是,通过separatorline这个固定的id查找到tbody,然后定位他后面的第一个tbody就是我们要的元素了。
效果

04-07

04-07
代码
  1. Sub 示例13()
  2.     Dim cd As New ChromeDriver
  3.     cd.Get"http://club.excelhome.net/forum-2-1.html"
  4.     '查找ExcelHome论坛 VBA版块中第一个帖子(置顶的不算)
  5.     Debug.Printcd.FindElementByXPath("//*[@id='separatorline']/following::tbody").Text
  6.    
  7.     '//从任意节点开始,不是从根节点
  8.     'tbody是标签节点
  9.     '[]是谓语的用法,谓语用来查找某个特定的节点或者包含某个指定的值的节点
  10.     '谓语中的@id节点的属性  ,即网页中的标签的id  @id='separatorline' 表示,id必须是 forumnewshow
  11.     'following::轴,表示与本元素相邻的兄弟元素

  12. End Sub
复制代码


示例14
这里演示两个函数的用法

04-08

04-08
代码:
  1. Sub 示例14()
  2.     Dim cd As New ChromeDriver
  3.     cd.Get"http://club.excelhome.net/forum-2-1.html"
  4.     Debug.Print cd.FindElementByXPath("//p[contains(text(),'讨论与VSTO')]").Text
  5.     '这里用了两个函数 contains 包含字符串的函数
  6.     'text节点的text文字
  7.     '这里是指包含了讨论与VSTO文字 的p标签 ,打印出来是VBA的一个子版块VSTO中的一个p标签
  8.     cd.Quit
  9. End Sub
复制代码



小结:xpath真的很强大,基本上是算是一个如正则一样的神器。只有你想不到的表达示,没有他做不到的。强力推荐使用这种方法,因为他具有广范性。当然也有一点小难度。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 21:24 | 显示全部楼层
chis3 发表于 2018-12-20 18:56
啊,謝謝
有個網要不停登入很多帳號再把pdf下載,很麻煩
和發薪時要登入銀行需要一個一個的輸入再提交形 ...

没有什么变态的登录验证的话这个没问题。如12306那种,或是滑动验证什么的。

TA的精华主题

TA的得分主题

发表于 2018-12-21 07:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
只要浏览器的版本与调试工具Selenium的版本匹配,就可以很好的使用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-22 10:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 源理 于 2018-12-22 10:24 编辑

9、FindElement
说明:返回符合by所查询元素机制的第一个元素
returnValue = instance.FindElement(by, timeout, raise)
以上的参数,除了by其它的都讲过,不重复了。这里的by是一个类,他是一种包含了查询元素的机制,他也包含了以前我们讲过的通过class、css、linkText、Name、PartialLinkText、Xpath来查询。
By的方法截图

05-01

05-01
他最主要的功能是有一个Any方法可以组合以上查询所得到的所有元素。
语法:returnValue = By.Any(by1, by2, by3,by4, by5, by6)
当然这个放到FindElements中会更有意义。
示例11:

演示by其中的id、PartialLinkText的示例说明by的用法,对比一下和以前讲过的FindElementByXXX发现其实是一样的。

05-02

05-02
  1. Sub 示例11()
  2.     Dim cd As New ChromeDriver
  3.     cd.Get "http://club.excelhome.net/forum-2-1.html"
  4.     Dim by As New by  '新建一个by类,在by类中可以构造自己定位方法如下
  5.     Debug.Print "通过by.id方法获得元素:" & cd.FindElement(by.ID("mn_N2de8")).Text
  6.     Debug.Print "通过FindElementById获得:" & cd.FindElementById("mn_N2de8").Text
  7.     Debug.Print "##############################################"
  8.     Debug.Print "通过by.id方法获得元素:" & cd.FindElement(by.partiallinktext("Excel 2016数据透视表应用大全")).Text
  9.     Debug.Print "通过FindElementById获得:" & cd.FindElementByPartialLinkText("Excel 2016数据透视表应用大全").Text
  10.     '通过以上两个示例可以看出通过by方法和FindElementByXXXX是一样的,by只是提供了一种定位的机制
  11.     Stop
  12.     cd.Quit
  13. End Sub
复制代码
示例 12
通过by.any一次性抓取三个不相关的元素
效果

05-03

05-03
  1. Sub 示例12()
  2.     Dim cd As New ChromeDriver
  3.     cd.Get "http://club.excelhome.net/forum-2-1.html"
  4.     Dim by As New by  '新建一个by类,在by类中可以构造自己定位方法如下
  5.     Set bt = by.Any(by.ID("mn_N2de8"), by.ID("mn_N3b30"), by.XPath("//td[@class='fl_icn']/following::td[1]")) '用了这个感觉就像是在点将台中点大将一样,很爽
  6.     '上面第一个参数by构造了查询id为mn_N2de8的第一种机制(你叫条件也行)、
  7.     '上面第一个参数by构造了查询id为mn_N3b30的第二种机制、
  8.     '上面第一个参数by构造了查询XPath为
  9.     '当程序解读dom时,当元素满足任意一个机制就被添加进 FindElements 中
  10.     cd.FindElements(bt).Text.ToExcel Range("A1")
  11.     Stop
  12.     cd.Quit
  13. End Sub
复制代码

10、FindElementBy
说明:通过给定的策略和所对应的值来定位元素。
语法
returnValue = instance.FindElementsBy(strategy, value,minimum, timeout)
其中strategy是一个枚举型,他包含了所有的策略类型。其实也是我们上面所讲的一些方法 class、css、linkText、Name、PartialLinkText、Xpath、any.

下面是他的成员:

05-04

05-04
示例13

通过strategy的id和PartialLinkText查询元素,也做了一个对比自己看一下很简单

05-05

05-05
代码
  1. Sub 示例13()
  2.     Dim cd As New ChromeDriver
  3.     cd.Get "http://club.excelhome.net/forum-2-1.html"
  4.      cd.FindElementBy Strategy.Strategy_Id, "mn_N2de8"
  5.      Debug.Print "通过Strategy的id方法获得元素:" & cd.FindElementBy(Strategy.Strategy_Id, "mn_N2de8").Text
  6.      Debug.Print "通过FindElementById获得:" & cd.FindElementById("mn_N2de8").Text
  7.      Debug.Print "##############################################"
  8.      Debug.Print "通过StrategyPartialLinkText方法获得元素:" & cd.FindElementBy(Strategy.Strategy_PartialLinkText, "Excel 2016数据透视表应用大全").Text
  9.      Debug.Print "通过FindElementById获得:" & cd.FindElementByPartialLinkText("Excel 2016数据透视表应用大全").Text
  10. End Sub
复制代码

至此,所有关于定位元素的都讲完了。这里很重要!!!!!!!!!!!!是操作网络对象的基础!!!



评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-22 12:34 | 显示全部楼层
关于定位元素的都讲完了。这里很重要!!!!!!!!!!!!是操作网络对象的基础!!!

——掌握了这点,才算是开始摸着门道了

希望楼主后面能讲下获取链接的例子(url),最终获取图片、视频、文档等原始数据

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-22 13:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
七、框架
所见不一定所得,因为网页元素中有一个框架的东西。即iframe标签,这个标签能嵌套一个网站。记得第一次抓网上的东东时,发现和教程都一样就是获得不了网页元素,后来才发现就是iframe的问题。
本来想找一个好的网站做示例,但发现大型网站都没有iframe,在工作中用的系统管理软件也不能做例子。只能广告网页作成例子说明一下:

06-01

06-01
从上图可以看到  广告页面是一个单独的页面,他嵌套在了iframe中。那我们定位这个广告页中的元素,直接通过findelement是不行的,因为他只能找主框架中的dom元素。那么怎么办呢?
Selenium中提供了转向子框架的方法
SwitchToFrame 这个方法就能跳到子框架中去,当跳到子框架中后对需要操作的网页元素进行了操作后,如何跳转回主框架呢?需要用到SwitchToParentFrame方法。
SwitchToFrame语法:
returnValue = instance.SwitchToFrame(identifier, timeout,raise)
其中instance:WebDriver(驱动,即我常用的cd);
Identifier:iframe的名字(字符串)或者iframe在主框架中的标签索引index(从0开始)。
示例14:

获得上面网站广告中的标题

06-02

06-02
  1. Sub 示例14()
  2.     Dim by As New by
  3.     Dim cd As New ChromeDriver
  4.     Dim ele As WebElement
  5.     cd.Get "http://news.sina.com.cn/c/2018-12-21/doc-ihqhqcir9093218.shtml"
  6.    '通过name名称跳进第一层框架
  7.    cd.SwitchToFrame ("sinaadtk_sandbox_id_0")
  8.    '获得框架所在网页元素,这里采用了xpath 定位
  9.    Set ele = cd.FindElementByXPath("//div[contains( @id,'BAIDU_SSP__wrapper')]/iframe")
  10.    '通过ele.Attribute("name")获得框架元素的name值,由于这个值是变化的,所以只能通过这种方法获得
  11.    cd.SwitchToFrame (ele.Attribute("name"))
  12.    '由于广告每一次都不一样,所以我采用by.any来设置可能存在的网页元素
  13.    Set bt = by.Any(by.Class("adTitle"), by.Class("pic_title"), by.Class("title_under_pic"))
  14.    '通过上面设置的机制,获得最终框架中的网页元素,并打印出其text
  15.    Debug.Print "这两层框架下的一元素:" & cd.FindElement(bt).Text
  16.    '跳回主框架,有两层,没办法找不到简单的例子
  17.    cd.SwitchToParentFrame
  18.    cd.SwitchToParentFrame
  19.    Debug.Print "这是主框架中的标题:" & cd.FindElementByClass("main-title").Text
  20.    Stop
  21.    cd.Quit
  22. End Sub
复制代码
小结:框架是一个坑,跳来跳去很烦。其实直接用get转到框架中的网页是最正确的做法,这样网页中的元素更好定位。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 05:18 , Processed in 0.039124 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表