ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] vba中使用Selenium

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-18 15:17 | 显示全部楼层
可以的。就是浏览器版本比较旧啊。

TA的精华主题

TA的得分主题

发表于 2018-12-18 21:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
正需要这方面的知识,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-19 07:13 来自手机 | 显示全部楼层
本帖最后由 源理 于 2018-12-20 21:24 编辑

六、元素定位
      这里我会花大量篇幅来写一下元素定位。为什么呢,其实各位看客可以说是对Excel模型、vb语法都很熟了。可能对网页上的东东了解不多,导致不能很快的上手。换句话说就是你把网页上的元素抓到了,就像你获得了Excel中的Range对象 ,你想干什么就干什么了。所以获得网页元素这个非常重要,也是一个难点。获取网页元素的方法有多少呢?大约是下面几种
03-00.png
先分一下类其中以FindElementBY开头为一类。这一类是定位到这一类型元素的第一个元素“注意不带S”,好理解吧!!第二类以FindElementsBY开头的为一类。这一类是定位到这一类型元素的所有元素“注意带S”。返回的是一组元素组。上面的方法20个,其实都是重复的,只需要弄明白其中一个就行了,另一个也就理解了。我按我的理解把10种方法的语法和理解写一下,然后分别做一些示例。当然个人理解难免有误,有大侠们看出来了可以提出来,以免误了各位看客。
1FindElementByClass
说明:查找元素通过元素的Class。
语法:
Dim instance As SearchContext
Dim classname As String
Dim timeout As Integer
Dim raise As Boolean
Dim returnValue As WebElement
returnValue = instance.FindElementByClass(classname, timeout, raise)

参数
classname 类型:字符串;Class的名字
timeout (可选)类型:整型;设置超时时间,单位毫秒
raise (可选) 类型:布尔型;当超时后是否引发异常
Return Value 类型:WebElement(网页元素); 返回网页元素或空值

通过网页元素的Class类型查找定位元素.什么是class?Class就是网页元素用来定义其外形(如字体大小、颜色、显示、边框等等)的一个属性的。举例说明一下Class用谷哥打开ExcelHome的首页http://www.excelhome.net/。按F12打开开发人员工具,再按Ctrl+Shift+C选中页面的头部,如下图:

03-01

03-01
从图中可以看到,右边这一堆代码就是ExcelHome的html代码(这里你应该会一些些html代码知识吧),我用红框框住的就是Class。多个元素当然可以有同一个Class,我们用FindElementByClass返回的仅是能找Class的第一个元素。

示例7

03-02

03-02
Sub 示例6()
   Dim cd As New ChromeDriver
   cd.Get "http://www.excelhome.net/"
   Dim element As WebElement
   Set element = cd.FindElementByClass("header", 3000, False)
   Debug.Print element.Text
   cd.Quit
End Sub
很简单就是用ByClass获得到了元素并显示出text值。其中text会得到子元素的text.
2FindElementByCss
说明:根据样式选择器找到指定的元素
语法:
Dim instance As SearchContext
Dim cssselector As String
Dim timeout As Integer
Dim raise As Boolean
Dim returnValue As WebElement
returnValue =instance.FindElementByCss(cssselector, timeout, raise)
参数:
cssselector 类型:字符串; CSS选择器
timeout (可选) 类型:整型;timeout in milliseconds
timeout (可选)类型:整型;设置超时时间,单位毫秒
raise (可选) 类型:布尔型;当超时后是否引发异常
Return Value 类型:WebElement(网页元素); 返回网页元素或空值
      重点说明CSS选择器。什么CSS选择器,我只能做简单说明,因为这里的知识能写一本书。简单说一下我的理解,就是样式告诉浏览器那些元素需要应用我这种样式来显示我这种选择器。可分为元素选择器、关系选择器、属性选择器、伪类选择器、伪对象选择器。其中元素选择器分为类型选器、id选择器、class选择器。关系选择器分为:包含选择器、子选择器、相领选择器、兄弟选择器。(其它选择器详情百度CSS吧)


03-03

03-03

03-04

03-04

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-19 07:14 来自手机 | 显示全部楼层
本帖最后由 源理 于 2018-12-19 22:46 编辑


示例8
效果
03-03.png
代码
Sub 示例8()
   Dim cd As New ChromeDriver
   cd.Get "http://www.excelhome.net/"
   Dim element As WebElement
   '类型选择器,选择第一个li
   Set element = cd.FindElementByCss("li", 3000, True)
   Debug.Print element.Text
    Debug.Print "=======类型选择器=========="
   'ID选择器,选择ID为five2的li元素
   Set element = cd.FindElementByCss("li#five2", 3000, True)
   Debug.Print element.Text
   'class选择器,选择class为header的div元素
   Set element = cd.FindElementByCss("div.header")
   Debug.Print element.Text
   Debug.Print "=======class选择器=========="
   '包含选择器,选择class为header的div元素,再选择div里面li元素,再反选li里面的a元素
   Set element = cd.FindElementByCss("div.header li a")
   Debug.Print element.Text
   Debug.Print "========包含选择器========="
   '子选择器,选择class为header的div元素,再选择div子元素中的ul元素,再选择ul的子元素li,再选择li中的a元素
   '注意区别,这个是子元素,上面那个包含可以是孙元素,从孙元素
   Set element =cd.FindElementByCss("div.header>ul>li>a")
   Debug.Print element.Text
   Debug.Print "========子选择器========="
   '相邻选择器,选择id为xxx的div元素,再选择div的script子元素,选择script子元素后最近的ins
   '注意最后一个为相邻选择器
   Set element = cd.FindElementByCss("div#xxx>script+ins")
   Debug.Print element.Attribute("id")
   Debug.Print "========相邻选择器========="
   '兄弟选择器,选择class为menu的ul元素,再选择ul的子元素li,选择li子元素兄弟元素li,
   '与相邻选择符不同的是,兄弟选择符会命中所有符合条件的兄弟元素,而不强制是紧邻的元素。
   Set element = cd.FindElementByCss("ul.menu>li~li")
   Debug.Print element.Text
   Debug.Print "========兄弟选择器========="
   cd.Quit
End Sub
代码解释已在代码中写了

总结一下上述代码中选择器的语法
类型选器:直接写元素的标签  css中用   E表示
id选择器:E#id    id的字符串
class选择器:E.class   class的字符串
包含选择器:  E F         空格  F表示另一个标签
子选择器:E>F  
相领选择器:E+F
兄弟选择器:E~F
其它选择器语法请查Css文档很全。
小技巧

如何快捷验证我们所写的选择器,难道一直写到VBA中然后跑代码吗?不是这样的,可以在网上下载一些插件。当然我用的是谷哥的开发人员工具。使用方法按F12打开开发人员工具,在Elements选择卡中(即dom树中)按ctrl+f,会出现一个搜索框,这里就可以用来验证CSS选择器.当然后面用到Xpath也可以在这里验证。下面是一个验证截图。

03-04.png
未完待续。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-19 07:15 来自手机 | 显示全部楼层
本帖最后由 源理 于 2018-12-20 21:18 编辑

3、FindElementByID
说明:通过ID查找网页元素
语法:
Dim instance As SearchContext
Dim id As String
Dim timeout As Integer
Dim raise As Boolean
Dim returnValue As WebElement
returnValue = instance.FindElementByID(id, timeout, raise)
id 类型:字符串; ID
timeout (可选) 类型:整型;timeout in milliseconds
timeout (可选)类型:整型;设置超时时间,单位毫秒
raise (可选) 类型:布尔型;当超时后是否引发异常
Return Value 类型:WebElement(网页元素); 返回网页元素或空值
Id是网页元素的标识,在同一个dom中它是唯一的。他在网页中是这样的<div id=’list’> </div>。由于他是唯一的,如果你需要定位的元素有这个id值,你就可以很简单的定位到了它。注意有些网站返回的网页id不会是固定的,如asp.net中的控件元素生成的标签可能会不一样,这样的id常常后面根一堆数据,这样的id不可靠如
示例9
在立即窗口中打印VBA论坛的帖子统计列表数据

04-01

04-01

代码
Sub 示例9()
     Dim cd As New ChromeDriver
     cd.Get"http://club.excelhome.net/forum-2-1.html"
     Debug.Printcd.FindElementById("thread_types").Text
     Stop
     cd.Quit
End Sub
FindElementByID方法比较简单,如果你在网页中发现有id用他很方便。

4、FindElementByLinkText
说明:通过超连接文字定位网页元素。
语法:
Dim instance As SearchContext
Dim linktext As String
Dim timeout As Integer
Dim raise As Boolean
Dim returnValue As WebElement
returnValue = instance.FindElementByID(linktext, timeout, raise)
linktext  类型:字符串; 超连接文字
timeout (可选) 类型:整型;timeout in milliseconds
timeout (可选)类型:整型;设置超时时间,单位毫秒
raise (可选) 类型:布尔型;当超时后是否引发异常
Return Value 类型:WebElement(网页元素); 返回网页元素或空值

示例10

04-02

04-02

代码
Sub 示例10()
     Dim cd As New ChromeDriver
     cd.Get"http://club.excelhome.net/forum-2-1.html"
     Debug.Printcd.FindElementByLinkText("2018重磅力作《Excel 2016数据透视表应用大全》火热上市!").Text
     cd.Quit
End Sub

5、FindElementByPartialLinkText
与第4个基本一样。只是查找部份的超连接文本。
示例

04-03

04-03
'查找第一个包含Excel 2016数据透视表应用大全,并打印
Sub 示例10()
     Dim cd As New ChromeDriver
     cd.Get"http://club.excelhome.net/forum-2-1.html"
     Debug.Printcd.FindElementByPartialLinkText("Excel 2016数据透视表应用大全").Text
     cd.Quit
End Sub
6、FindElementByName
说明:通过Name查找元素,语法基本与上面的一致这里略!
示例11
Html代码:
<div name=”people”>张三</div>
VBA代码:
Debug.print cd.FindElementByName("name").text
结果:张三
7、FindElementByTag
说明:通过标签查找元素,语法基本与上面的一致这里略!
示例12
Html代码:
<div>
<span>
张三
</span>
</div>
<div>
李四
</div >
VBA代码:
Debug.print cd.FindElementByTag ("span").text
结果:张三

TA的精华主题

TA的得分主题

发表于 2018-12-19 08:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢分享,下载试用。

TA的精华主题

TA的得分主题

发表于 2018-12-19 08:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主,我的第一反应就是,赶紧写一个VBA的抢票神器。迄今为止,还没有看到哪位大师用VBA写过抢票程序。

TA的精华主题

TA的得分主题

发表于 2018-12-19 11:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhzwaz 发表于 2018-12-19 08:20
楼主,我的第一反应就是,赶紧写一个VBA的抢票神器。迄今为止,还没有看到哪位大师用VBA写过抢票程序。

12306已经有自己的抢票神器了!

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2018-12-20 09:19 | 显示全部楼层
我有一個工作需要在網站重覆百多次的操作,希望這個幫到忙自動化就好了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 13:34 , Processed in 0.050596 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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