• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[技术交流] 【院刊】-【201507期】有了这个函数,就没有找不到的页面元素 [复制链接]

1#
本帖最后由 66球 于 2015-7-3 18:34 编辑

利用全局索引定位难缠的页面元素



本文按键学院提供技术支持



按键学院交流①群(1群已满):376122403

按键学院交流②群(2群):372671254

按键学院交流③群(3群):170084238




超级链接是网站中使用非常频繁的HTML元素,因为网站的各种页面都是由超链接串接而成,超级链接完成了页面之间的跳转。可以说超级链接是浏览者和服务器的交互的主要手段,之前我们已经说过了有点击链接时,大部分情况下都需要使用txt属性,因为链接没有其他属性可以用来匹配,但是不是所有的超链接都支持txt属性特征串的,如果不支持txt属性的,我们就只能通过索引+标签来定位唯一元素特征字符串了

您所在的用户组无法下载或查看附件


咱们来举个栗子,比如我们想点击淘宝淘金币网址上的登陆查看金币明细这个页面元素,正常手动点击的话是会弹出账号登陆窗口的,咱们如图启用网页分析工具按F9分析一下,发现这个肉眼看上去貌似是按钮的东西TAG标签属性上显示的是a,说明它也是个 超链接,所以它也只有TAG—标签属性、txt—文本属性和index—索引属性,且我们测试元素特征字符串的时候发现这个超链接就是[backcolor=rgb(249, 249, 249)]不支持txt属性的,然后我们把它改成索引就正常定位到了,so-easy,我们高高兴兴码出如下代码
  1. Call Plugin.Web.Bind("WQM.exe")//启动wqm第一位就是要先绑定下wqm
  2. Call Plugin.Web.Go("http://taojinbi.taobao.com/index.htm") //go命令跳转到淘金币页面,注意这个go命令会等页面正常加载完后再执行下面代码,所以不需要判断页面是否加载完成
  3. Call Plugin.Web.HtmlClick("tag:A&index:135")//点击刚刚我们测试可以正常获取到的登陆位置的特征字符串
复制代码
然后我们调试发现,根本没有我们预想到的会弹出账号登陆的窗口,而是直接跳转到其他页面去了,为什么会这样呢?

小编通过多台电脑测试发现,每台电脑打开时候分析到的全局索引值都是不一样的,比如小编这边分析到的是全局索引:135,其他电脑分析到的却是:144,或者有些更变态的网站每次刷新页面后索引值都会变化,那到底有没有办法能通过这种实时变化的索引值来点击元素特征串呢?

[tr=rgb(154, 205, 50)]
如何准确定位变化的全局索引值?

首先感谢下论坛18452大大最近发表的一篇文章,通过自带的web网页插件命令,用一个函数,就比较好的解决了这种问题,个人认为这种思路很巧妙,完全有必要推广下,学习后觉得有用的童鞋赶紧给他送花去~
  1. //函数
  2. Function 匹配文字获取全局索引值(获取类型, 特征串,匹配文字)
  3. Num = Plugin.Web.HtmlExists(特征串)
  4. For i = 1 To Num
  5. Txt = Plugin.Web.HtmlGet(获取类型, 特征串&"&index:" & i)
  6. If Txt = 匹配文字 Then
  7. 匹配文字获取全局索引值 = i
  8. TracePrint 匹配文字获取全局索引值
  9. //下面我加入了一个 匹配到全局索引后点击!
  10. Call Plugin.Web.HtmlClick(特征串 & "&index:" & 匹配文字获取全局索引值)
  11. End If
  12. Next
  13. End Function
复制代码
思路:这个函数里面他用到了web网页插件里的俩个比较好用的命令,首先通过[backcolor=rgb(46, 139, 87)]HtmlExists命令获取页面符合特征串的数量(这个特征串不仅仅局限于Tag—标签),然后通过for循环与[backcolor=rgb(46, 139, 87)]HtmlGet命令搭配环进行返回的文字匹配,如果与我们要找的文字匹配的话则返回全局索引值

[backcolor=rgb(46, 139, 87)]HtmlExists 命令
命令名称:HtmlExists 判断网页元素是否存在
命令功能:判断指定特征的网页元素是否存在,并返回匹配的个数
命令参数:参数1:字符串型,网页元素特征字符串
返 回 值:整数型,符合特征串的网页元素个数

这个命令主要用于判断符合特征串的页面元素是否存在,总共有多少个
比如我们可以用它来判断账号是否登陆了,以我们按键论坛为例,很多论坛账号登陆界面都有且仅有一个自动登陆的选项,我们就可以用这个命令去获取这个自动登陆元素是否存在来判断当前状态是否登陆了,相关代码示例
  1. Call Plugin.Web.Bind("WQM.exe")
  2. Call Plugin.Web.Go("http://bbs.anjian.com/forum.php")
  3. 元素个数 = Plugin.Web.HtmlExists("tag:LABEL&txt:自动登录")
  4. If 元素个数 > 0 Then
  5. Call Plugin.Web.Tips("您还没有登陆论坛,请在弹出的窗口上登陆下")
  6. Call Plugin.Web.HtmlClick("tag:EM&txt:登录")
  7. Else
  8. Call Plugin.Web.Tips("您已经登陆论坛,点击签到按钮")
  9. Call Plugin.Web.HtmlClick("id:pper_b")
  10. End If
复制代码


命令名称: HtmlGet 获取网页元素的信息
命令功能: 获取网页元素指定属性的信息
命令参数: 参数1:字符串型,网页元素属性类型:texthtml outerHtmlvalue src href offset
参数2:字符串型,网页元素特征字符串

这个命令主要用于页面某个元素的其他信息,比如文本内容等,具体使用方式可以查看:
【院刊】-【201409期】抓取网页指定内容(资料),获取网页里的图片

[tr=rgb(154, 205, 50)]
重新调试

您所在的用户组无法下载或查看附件

言归正传,我们回到之前淘金币登陆点击的问题上,因为我们要获取的是元素文本内容,我们把"text"、"Tag:A"、"登录查看金币明细"分别代入函数后调试再看下,是不是就可以正确点击到了
  1. Call Plugin.Web.Bind("WQM.exe")
  2. Call Plugin.Web.Go("http://taojinbi.taobao.com/index.htm")
  3. Call 匹配文字获取全局索引值("text", "Tag:A", "登录查看金币明细")
  4. '函数
  5. Function 匹配文字获取全局索引值(获取类型, 特征串,匹配文字)
  6. Num = Plugin.Web.HtmlExists(特征串)
  7. For i = 1 To Num
  8. Txt = Plugin.Web.HtmlGet(获取类型, 特征串&"&index:" & i)
  9. If Txt = 匹配文字 Then
  10. 匹配文字获取全局索引值 = i
  11. TracePrint 匹配文字获取全局索引值
  12. //下面我加入了一个 匹配到全局索引后点击!
  13. Call Plugin.Web.HtmlClick(特征串 & "&index:" & 匹配文字获取全局索引值)
  14. End If
  15. Next
  16. End Function
复制代码

[tr=rgb(154, 205, 50)]
后记

小编利用这个功能,勉强弄了个半成品的自动登陆领取淘金币的功能,不知道为什么第一次点击都会弹出验证码,验证码方面还没弄,有兴趣的童鞋可以自己研究看看
  1. Call Plugin.Web.Bind("WQM.EXE")
  2. Call Plugin.Web.Go("http://taojinbi.taobao.com/index.htm")
  3. 网页源文件 = Lib.网络.获得网页源文件("http://taojinbi.taobao.com/index.htm")
  4. If instr(网页源文件, "登录查看金币明细") > 0 Then
  5. Call Plugin.Web.Tips("你未登录账号,请在弹出的窗口登陆下淘宝账号")
  6. Call 匹配文字获取全局索引值("text", "Tag:A", "登录查看金币明细", 1, 8)
  7. Call 判断是否登陆
  8. Else
  9. Call 判断是否登陆
  10. End If
  11. Function 匹配文字获取全局索引值(获取类型, 特征串,匹配文字,文字开始位置,文字结束位置)//相当于模糊搜索匹配文字
  12. Num = Plugin.Web.HtmlExists(特征串)
  13. TracePrint num
  14. For i = 1 To Num
  15. Txt = Plugin.Web.HtmlGet(获取类型, 特征串 & "&index:" & i)
  16. If mid(txt,文字开始位置,文字结束位置) = 匹配文字 Then
  17. // TracePrint txt
  18. // If txt=匹配文字 Then
  19. 匹配文字获取全局索引值 = i
  20. TracePrint 匹配文字获取全局索引值
  21. //下面我加入了一个 匹配到全局索引后点击!
  22. Call Plugin.Web.HtmlClick(特征串 & "&index:" & 匹配文字获取全局索引值)
  23. Exit Function
  24. End If
  25. Next
  26. End Function
  27. Function 判断是否登陆()
  28. TracePrint "开始进入循环"
  29. Do
  30. 网页源文件 = Lib.网络.获得网页源文件("http://taojinbi.taobao.com/index.htm")
  31. If instr(网页源文件, "今日可领") > 0 Then
  32. Call Plugin.Web.Tips("您已经登陆账号,稍后帮您自动领取淘金币")
  33. Call Plugin.Web.Go("http://taojinbi.taobao.com/index.htm")
  34. // Delay 1000
  35. Call 匹配文字获取全局索引值("text", "Tag:A", "今日可领", 1, 4)//只取今日可领这4个字,因为领取天数不同后面的数值会变,比如第一天是5金币,连续领取的话第二天就是10金币
  36. Exit do
  37. ElseIf instr(网页源文件, "今日已领") > 0 Then
  38. Msgbox "逗我呢,该账号已领取过淘金币,请手动更换其他账号再领取"
  39. ExitScript
  40. End If
  41. Delay 200
  42. Loop
  43. End Function
复制代码
其他相关联院刊:

【院刊】-【201507期】不要在一个元素特征字符串上吊死


抓取网页指定内容(资料),获取网页里的图片


想学习进阶版网页技术可以查看

【院刊】-【201505期】GET、POST初解析


点此查看院刊总目录


谢谢大家阅读,记得给小编送支花花 ! 顺手点个


[tr=rgb(143, 188, 143)]

按键精灵交流群

腾讯课堂视频课程

按键学院交流①群(1群已满):376122403
按键学院交流②群(2群):372671254
按键学院交流③群(3群):170084238
安卓按键精灵交流群:115768679

按键精灵2014基础教学视频
Q语言零基础知识
按键精灵自动化脚本功能开发
按键精灵Q语言脚本开发
点我进入按键学院报名啦 招生细节进群咨询招生办主任


    已有5评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2023/8/13 22:25:36 执行 审核帖子 操作
    2#

    【屁【开吗

    3#

    我来学习看看

    按键接单:承接各类办公脚本,网页填表,游戏脚本
    QQ:603438273
    IEWZ网页填表插件交流群:368821822
    4#

    666666666666666666666666

    5#

    顶起!!!

    唐银华
    6#


    7#

    dADad

    8#

    学习进步

    9#

    学习下

    10#

    】有了这个函数,就没有找不到的页面元素修改

    11#

    又是先回复 正看在兴头上呢

    12#

    3122123132

    13#

    kankasn da as

    14#

    看看,谢谢啊啊啊

    15#

    谢谢分享!@!@!@

    16#

    小编利用这个功能,勉强弄了个半成品的自动登陆领取淘金币的功能,不知道为什么第一次点击都会弹出验证码,验证码方面还没弄,有兴趣的童鞋可以自己研究看看

    17#

    学习学习

    18#

    sutdy

    19#

    学习学习,谢谢

    20#

    這個非常好用,謝謝!

    发新话题 回复该主题