手机:HUAWEI,DIG-AL00,EMUI4.1,Android6.0
微信:6.7.3
不同手机上,或者不同版本的微信,控件的ID、文本也不尽相同;根据屏幕位置进行的操作更要做好适配。
黑产,灰产,群控,刷量
1.1启动微信
1 2 3 4 5 6 7 8 9 10 |
private void launcherWechatApp(String taskName) { try { String result = device.executeShellCommand("am start -n com.tencent.mm/com.tencent.mm.ui.LauncherUI"); Log.e("ard", "启动微信shell," + taskName + " 反馈:" + result); } catch (IOException e) { e.printStackTrace(); } } |
1.2切换首页的标签页
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/** * 切换首页的标签页 * * @param tabName 微信、通讯录、发现、我 */ private void switchTab(String tabName) { device.wait(Until.hasObject(By.text(tabName)), 5000); UiObject2 tabObject = device.findObject(By.text(tabName)); if ("微信".equals(tabName)) { tabObject = device.findObject(By.res("com.tencent.mm", "cw5")); } if (null != tabObject) { tabObject.click(); } else { UiObject object = device.findObject(new UiSelector().text(tabName)); if ("微信".equals(tabName)) { object = device.findObject(new UiSelector().resourceId("com.tencent.mm:id/cw5")); } try { object.click(); } catch (UiObjectNotFoundException e) { e.printStackTrace(); } } Log.e(TAG, "点击了标签-" + tabName); } |
1.3滑动到通讯录顶部
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * 手指头从屏幕顶部向底部滑动,ListView的内容滚动到顶部item */ private void swipeListViewToTopItem() { int start_x = 50; int start_y = 200; int end_x = 50; int end_y = device.getDisplayHeight() - 200; int stepTop = 50; device.swipe(start_x, start_y, end_x, end_y, stepTop); Log.e(TAG, "滚动到屏幕顶部-------"); } |
1.4查找目标“新的朋友”项,进入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/** * 点击"通讯录"顶部的"新的朋友"选项,进入查找好友或者查看陌生人的好友请求 */ private void gotoNewFriend() { device.wait(Until.hasObject(By.res("com.tencent.mm", "lm")), 5000); UiObject2 lm = device.findObject(By.res("com.tencent.mm", "lm"));// 右边的字母快捷操作条 Rect rect = lm.getVisibleBounds(); int clickX = rect.centerX(); int clickY = rect.top + 10; // 向上箭头的位置 device.click(clickX, clickY); // 点击回到ListView的顶端 Boolean hasNewFriendObject = device.wait(Until.hasObject(By.textContains("新的朋友")), 5000); if (hasNewFriendObject) { device.wait(Until.hasObject(By.textContains("新的朋友")), 5000); UiObject2 object = device.findObject(By.textContains("新的朋友")); object.click(); Log.e(TAG, "点击了-新的朋友"); } else { ////////////////////////////////////// 如有有主动的好友请求,这里关键字会被遮挡 // com.tencent.mm:id/bm6 Boolean hasBm6Object = device.wait(Until.hasObject(By.res("com.tencent.mm", "bm6")), 5000); Log.e(TAG, "是否有新到好友请求:" + hasBm6Object); if (hasBm6Object) { UiObject2 object = device.findObject(By.res("com.tencent.mm", "bm6")); object.click(); Log.e(TAG, "点击了-新朋友请求"); } else { //[28,144][672,248] int x = (672 - 28) / 2; int y = (248 - 144) / 2; device.click(x, y); Log.e(TAG, "点击了-坐标x:" + x + "y:" + y); } } } |
1.5设置备注名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/** * 设置备注名 * * @param phone 原电话号码 * @param oldNoteName 原备注名 */ private void gotoSetNoteName(String phone, String oldNoteName) { // 此时在"备注名"界面 device.wait(Until.hasObject(By.textContains("设置备注")), 5000); UiObject2 object = device.findObject(By.textContains("设置备注")); object.click(); // nextAty 进入设置备注界面 device.wait(Until.hasObject(By.textContains("备注名")), 5000); List<UiObject2> editTextList = device.findObjects(By.clazz(EditText.class)); for (int i = 0; i < editTextList.size(); i++) { UiObject2 edit = editTextList.get(i); String editClassName = edit.getClassName(); // android.widget.EditText edit.setText(""); // 清空默认填入的称呼,使关键字词hint显示 } object = device.findObject(By.textContains("新的备注名称")); // edittext文本框界面 object.setText(phone + splitFlag + oldNoteName); // phone作为备注名 object = device.findObject(By.textContains("保存")); object.click(); Log.e(TAG, "点击了-保存新的备注名称"); // 此时自动退出"备注名"界面 } |
2.完整流程
启动 -> 通讯录 -> 新的朋友 -> 添加朋友 -> 放大镜(微信号/QQ号/手机号) -> 【输入】 -> [出现“搜索:xxxx],点击 -> [出现搜索结果:分支] -> 分支1:用户存在即设置备注发送加好友请求,分支2:已经是好友了直接返回,分支3:用户不存在直接返回。
这个流程比较繁琐,可能不是最优的。直接从标题栏的放大镜进入也是可以进行查找的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
@Test public void testAddFriend() { Bundle bundle = InstrumentationRegistry.getArguments(); String phone = bundle.getString("number"); Log.e(TAG, "查找好友shell指令收到电话:" + phone); if (TextUtils.isEmpty(phone)) { return; } launcherWechatApp("查找加好友"); switchTab("通讯录"); swipeListViewToTopItem(); gotoNewFriend(); // nextAty,进入下一个界面,"新的好友",查找好友界面 device.wait(Until.hasObject(By.textContains("添加朋友")), 5000); // 添加朋友 UiObject2 object = device.findObject(By.textContains("添加朋友")); object.click(); Log.e(TAG, "点击了-添加朋友"); // nextAty,进入下一个"添加朋友"界面,有多种添加方式:雷达、面对面、扫一扫等 device.wait(Until.hasObject(By.textContains("微信号/QQ号/手机号")), 5000); // 7.x版微信没有'QQ号' // 搜索微信号/QQ号/手机号 object = device.findObject(By.textContains("微信号/QQ号/手机号")); // textview //String className = object.getClassName(); object.click(); Log.e(TAG, "点击了-微信号/手机号 放大镜按钮"); // nextAty,输入界面,这里输入目标电话号码 // 输入号码xxx,搜索xxx页面 device.wait(Until.hasObject(By.res("com.tencent.mm", "jh")), 5000); object = device.findObject(By.textContains("微信号/QQ号/手机号")); // edittext文本框界面 //className = object.getClassName(); object.setText(""); object.setText(phone); Log.e(TAG, "输入了-微信号/手机号:" + phone); device.wait(Until.hasObject(By.textContains("搜索:")), 5000); object = device.findObject(By.textContains("搜索:")); object.click(); Log.e(TAG, "点击了-搜索"); // 如果查无此人,则当前页面显示"该用户不存在"。否则进入详细资料界面。 Boolean noWxid = device.wait(Until.hasObject(By.textContains("该用户不存在")), 5000); if (noWxid) { // 查无此人 SQLiteUtil.getInstance(context) .insertSearch(phone, "none", "none", "none", "none"); for (int i = 0; i < 6; i++) { device.pressBack(); } return; } // nextAty,如果找到了该用户,会调转到下一个界面:详细资料 String[] friendDetails = getFriendDetails(2); // 查找号码,加好友 String wxid = friendDetails[0]; String notename = friendDetails[1]; String nickname = friendDetails[2]; Boolean hasAdd2ContactObject = device.wait(Until.hasObject(By.textContains("添加到通讯录")), 5000); if (hasAdd2ContactObject) { // 还不是好友 gotoSetNoteName(phone, notename); // back aty 返回详细信息界面 // 好友信息界面 object = device.findObject(By.textContains("添加到通讯录")); object.click(); Log.e(TAG, "点击了-添加到通讯录"); // nextAty,进入发送界面 device.wait(Until.hasObject(By.textContains("发送")), 5000); // 发送界面 object = device.findObject(By.textContains("发送")); object.click(); Log.e(TAG, "点击了-发送"); // back aty,此时返回到“添加到通讯录”界面。 // 一种是等待通过,仍然显示"添加到通讯录" // 一种是直接通过,更新显示"发消息" SQLiteUtil.getInstance(context) .insertSearch(phone, wxid, notename, nickname, "yes"); // 这里暂不处理,统一到聊天流程 for (int i = 0; i < 6; i++) { device.pressBack(); // 返回桌面,重置下一次测试的条件 } return; } // 之前加过了,已经是好友了 Boolean hasSendMsgObject = device.wait(Until.hasObject(By.textContains("发消息")), 5000); if (hasSendMsgObject) { // 已经添加了好友 // 这里暂不处理,统一到聊天流程 for (int i = 0; i < 6; i++) { device.pressBack(); // 一次返回,即回到首页 } return; } } |
end
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/2343.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设