【Autojs教程】03-Autojs 控件学习 | 淘宝关注店铺取消实战
【Autojs教程】03-Autojs 控件学习 | 淘宝关注店铺取消实战
写在前面
本篇教程构思良久,笔者希望通过一个实际的例子,将枯燥无味的函数放到程序中进行讲解,前面一部分是理论教程(还是更加希望大家看下理论的),后半部分是脚本运行教程(有一定基础的可以直接看这一部分)
关注微信公众号获取更多教程信息
开发环境
开发环境搭建笔者在上一篇博文中已有讲解,还没环境的朋友可以参考,传送门:https://blog.csdn.net/xchl123/article/details/109746371
基础知识
选择器
UiSelector即选择器,用于通过各种条件选取屏幕上的控件,再对这些控件进行点击、长按等动作。这里需要先简单介绍一下控件和界面的相关知识。
一般软件的界面是由一个个控件构成的,例如图片部分是一个图片控件(ImageView),文字部分是一个文字控件(TextView);同时,通过各种布局来决定各个控件的位置,例如,线性布局(LinearLayout)里面的控件都是按水平或垂直一次叠放的,列表布局(AbsListView)则是以列表的形式显示控件。
控件有各种属性,包括文本(text), 描述(desc), 类名(className), id等等。我们通常用一个控件的属性来找到这个控件。
我们经常使用的 text('文字').findOne() 就是选择器的一种使用方法
而且,控件不仅仅只有一个属性,以下这些都是可以通过选择器来寻找控件的属性(标红部分是笔者经常使用的选择器属性)
函数 | 含义解释 |
---|---|
className | 类名。类名表示一个控件的类型,例如文本控件为"android.widget.TextView", 图片控件为"android.widget.ImageView"等 |
desc | 描述。对一个控件的描述 |
text | 控件文本 |
id | 控件的ID |
packageName | 包名。包名表示控件所在的应用包名,例如QQ界面的控件的包名为"com.tencent.mobileqq"。 |
bounds | 控件在屏幕上的范围 |
drawingOrder | 控件在父控件的绘制顺序 |
indexInParent | 控件在父控件的位置 |
clickable | 控件是否可点击 |
longClickable | 控件是否可长按 |
checkable | 控件是否可勾选 |
checked | 控件是否已勾选 |
scrollable | 控件是否可滑动 |
selected | 控件是否已选择 |
editable | 控件是否可编辑 |
visibleToUser | 控件是否可见,可以筛选在屏幕可视范围内的组件 |
enabled | 控件是否已启用 |
depth | 控件的布局深度 |
某些情况下,无法使用单一的属性唯一确定一个控件,这里就需要用到链式调用了,比如 className("ImageView").depth(10).findOne() 这样就可以通过布局深度以及类名确定一个控件了
控件
UiObject表示一个控件,可以通过这个对象获取到控件的属性,也可以对控件进行点击、长按等操作。
获取一个UiObject通常通过选择器的findOne(), findOnce()等函数,也可以通过UiCollection来获取,或者通过UiObject.child(), UiObject.parent()等函数来获取一个控件的子控件或父控件。
觉得下面内容枯燥的可以先跳过下表,等遇到不懂得函数再来看下表即可!
函数 | 释义 | 备注 | ||||||||||
UiObject.click() | 点击控件,返回是否成功 | |||||||||||
UiObject.longClick() | 长按控件,返回是否成功 | |||||||||||
UiObject.setText(text) |
设置输入框控件的文本内容,并返回是否设置成功 |
该函数只对可编辑的输入框(editable为true)有效 |
||||||||||
UiObject.copy() |
对输入框文本的选中内容进行复制,并返回是否操作成功 |
该函数只能用于输入框控件,并且当前输入框控件有选中的文本。可以通过setSelection()函数来设置输入框选中的内容 |
||||||||||
UiObject.cut() |
对输入框文本的选中内容进行剪切,并返回是否操作成功 |
该函数只能用于输入框控件,并且当前输入框控件有选中的文本。可以通过setSelection()函数来设置输入框选中的内容 |
||||||||||
UiObject.paste() |
对输入框控件进行粘贴操作,把剪贴板内容粘贴到输入框中,并返回是否操作成功 |
|||||||||||
UiObject.setSelection(start, end) |
对输入框控件设置选中的文字内容,并返回是否操作成功 索引是从0开始计算的;并且,选中内容不包含end位置的字符。例如,如果一个输入框内容为"123456789",要选中"4567"的文字的代码为et.setSelection(3, 7)。 该函数也可以用来设置光标位置,只要参数的end等于start,即可把输入框光标设置在start的位置。例如et.setSelection(1, 1)会把光标设置在第一个字符的后面。 |
|||||||||||
UiObject.scrollForward() |
对控件执行向前滑动的操作,并返回是否操作成功。 向前滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考) |
|||||||||||
UiObject.scrollBackward() |
对控件执行向后滑动的操作,并返回是否操作成功。 向后滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考)。 |
|||||||||||
UiObject.select() |
对控件执行"选中"操作,并返回是否操作成功。"选中"和isSelected()的属性相关,但该操作十分少用 |
|||||||||||
UiObject.collapse() |
对控件执行折叠操作,并返回是否操作成功 |
|||||||||||
UiObject.expand() |
对控件执行展开操作,并返回是否操作成功 |
|||||||||||
UiObject.show() |
对集合中所有控件执行显示操作,并返回是否全部操作成功 |
|||||||||||
UiObject.scrollUp() UiObject.scrollDown() UiObject.scrollLeft() UiObject.scrollRight() |
对集合中所有控件执行向下/下/左/右滑的操作,并返回是否全部操作成功 |
|||||||||||
children() |
返回该控件的所有子控件组成的控件集合。可以用于遍历一个控件的子控件 返回类型是UiCollection |
|||||||||||
childCount() |
返回子控件数目 |
|||||||||||
child(i) |
返回第i+1个子控件。如果i>=控件数目或者小于0,则抛出异常。 |
|||||||||||
parent() |
返回该控件的父控件。如果该控件没有父控件,返回null |
|||||||||||
bounds() |
返回控件在屏幕上的范围,其值是一个Rect对象,Rect对象属性如下:
|
|||||||||||
boundsInParent() |
返回控件在父控件中的范围,其值是一个Rect对象 |
|||||||||||
drawingOrder() |
返回控件在父控件中的绘制次序。该函数在安卓7.0及以上才有效,7.0以下版本调用会返回0 |
|||||||||||
id() |
获取控件的id,如果一个控件没有id,则返回null |
|||||||||||
text() |
获取控件的文本,如果控件没有文本,返回"" |
|||||||||||
findByText(str) |
返回 UiCollection 根据文本text在子控件中递归地寻找并返回文本或描述(desc)包含这段文本str的控件,返回它们组成的集合。 该函数会在当前控件的子控件,孙控件,曾孙控件…中搜索text或desc包含str的控件,并返回它们组合的集合 |
|||||||||||
findOne(selector) |
根据选择器selector在该控件的子控件、孙控件…中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null |
|||||||||||
find(selector) |
根据选择器selector在该控件的子控件、孙控件…中搜索符合该选择器条件的控件,并返回它们组合的集合 |
项目实战
项目起因
原因1:双十二过后,笔者想要删除淘宝上关注的一些店铺,当时满以为会有批量选择这种按钮给我操作时,我发现,必须得手动一个个删除,我这小暴脾气怎么可能愿意做这种事情,我猿人的精神何在???
PS:我发现京东上是可以批量删除关注店铺的,希望在这点上淘宝能够跟进
原因2:Autojs的教程到了需要讲UiObject、UiSelector以及UICollection的时候了,淘宝这个国民级的APP和它O疼的设计,刚好足够支撑本期教程
原因3:800多个店铺要一个个取关实在是太麻烦了
实战过程
1、分析界面(这里使用Autojs自带的工具哦)
找到"取消关注"和店铺名称的相对位置关系哦,笔者这里是先找"取消关注",后面再去布局层次分析中找到店铺名称控件的(这里需要一些经验)
2、代码编写
有了上面的界面分析过程(其实分析界面是最难的,笔者这里简化了,不同的APP需要大家反复测试)
就容易写出代码了,废话不多说,上代码,笔者这里做了详尽的注释了,
//等待开启无障碍模式
auto.waitFor();
//呼出控制台,用以显示日志信息
console.show();//程序执行函数
start();/*** 主程序执行函数*/
function start() {let getDeviceWidth = device.width; //获取设备的宽度let getDeviceHeight = device.height; //获取设备的高度console.setPosition(getDeviceWidth / 2.8, getDeviceHeight / 100);log('开始执行程序');while (!isInCorrectPage()) {log('当前未在“我的淘宝--关注店铺”页面,请手动前往');sleep(500);}while (isStillHave()) {let w = desc('取消关注').findOne(1000);if (w) {w.parent().click();let diapuName = w.parent().parent().child(0).child(1).child(0).child(0).desc();log('取消关注:' + diapuName + ' 成功')sleep(2000);}}log('程序执行结束');
}
/*** 判断当前页面是否在我的淘宝--关注店铺页面*/
function isInCorrectPage() {if (currentPackage() == 'com.taobao.taobao') {let w = desc('店铺').findOne(1000);if (w) {return true;}}return false;
}/*** 判断是否仍有需要取关的店铺*/
function isStillHave() {//这里设置连续三次验证为无“取消关注”的店铺才确定取关完成//降低程序执行的错误概率(加载店铺的时候会出现“取消关注”识别不到的情况)let count = 0;while (count++ < 3) {//在一秒的时间内let w = desc('取消关注').findOne(1000);if (w) {return true;}sleep(1000);}return false;
}
3、代码调试
在编写过程中,大家需要多调试几次,毕竟一次性很难写出完美的代码,借助第二讲说的开发工具,在执行过程中多输出log,很容易发现bug的
4、程序运行
在店铺页面点击Autojs的悬浮球,选择需要运行的脚本即可
运行截图如下
写在最后
由于笔者的水平有限,如果文中出现错误性的描述,还请大家包容,写博客记录这些,不仅仅是记录知识,一定程度上也是在加深本人自己的理解,希望能与各位共同进步~
【Autojs教程】03-Autojs 控件学习 | 淘宝关注店铺取消实战相关推荐
- [译][Tkinter 教程10] Text 控件
已获原作者授权. 原系列地址: Python Tkinter 简介及简例 Text 控件用来显示多行文本. Tkinter 的 Text 控件很强大, 很灵活, 可以实现很多功能. 虽然这个控件的主要 ...
- [译][Tkinter 教程02] Message 控件
已获原作者授权. 原系列地址: Python Tkinter Message 控件 Message 控件用来展示一些文字短消息. Message 和 Label 控件有些类似, 但在展示文字方面比 L ...
- CGRidCtrl控件 学习心得
wuqinxiang0我的:收件箱资源博客空间设置|帮助|退出 首页 业界 移动 云计算 研发 论坛 博客 下载 更多 狂想盼盼 积累点点滴滴 目录视图 摘要视图 订阅 新版论坛系列介绍之二--功能介 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (四)
Xamarin XAML语言教程构建ControlTemplate控件模板 (四) 2.在页面级别中构建控件模板 如果开发者要在页面级别中构建控件模板,首先必须将ResourceDictionary添 ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (三)
Xamarin XAML语言教程构建ControlTemplate控件模板 (三) (3)打开MainPage.xaml.cs文件,编写代码,实现主题的切换功能.代码如下: using System; ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
Xamarin XAML语言教程构建ControlTemplate控件模板 (二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于ContentView中.代码如下: &l ...
- Xamarin XAML语言教程构建ControlTemplate控件模板
Xamarin XAML语言教程构建ControlTemplate控件模板 控件模板ControlTemplate ControlTemplate是从Xamarin.Forms 2.1.0开始被引入的 ...
- Xamarin iOS教程之页面控件
Xamarin iOS教程之页面控件 Xamarin iOS 页面控件 在iPhone手机的主界面中,经常会看到一排小白点,那就是页面控件,如图2.44所示.它是由小白点和滚动视图组成,可以用来控制翻 ...
最新文章
- php开发的程序怎么用加密狗加密,C# 简单的程序绑定、加密(类似加密狗)
- Linux makefile中的= := ?=操作符
- 【Docker】记一次docker container ping domain 和 ping ipv6地址不通问题
- Linux驱动入门基础基础知识
- 搭建MySQL+MHA服务易错位置
- 查看 linux 硬件信息:内存、分区、系统、环境变量、防火墙、路由、端口监听、进程、CPU...
- Vue报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- 事情没有想象中那么难--JX官网首页3D粒子效果
- 远程打开其他电脑的computer management
- python中-----数组中的排序
- 使用Microsoft Sync Framework做文件同步
- 苹果Mac环境如何配置定时任务?
- DH 算法思想 SSH解决内容篡改问题
- Windows 技巧集
- 浏览器 .avi视频播放demo
- 一种基于加密域的数字图像水印算法的设计与实现(附Matlab源码)
- 如何在Digital Ocean VPS上安装cpanel / whm
- linux质控命令,RNA-seq摸索:2.sra下载数据→fastqc质控→hisat2/bowtie2/STAR/salmon比对→Samtools格式转换→IGV可视化结果...
- 美味的黄油如果不冷藏,会变质吗?
- vue-router(妙味课堂)