第一 絮叨
使用 Appium 测试框架有没有觉得很给力呀,当然,遇到麻烦的异常错误除外,包括这些问题也无妨嘛,网上解决方案还是可以搞定问题的。总结下我使用 Appium 模拟登录 Wechat 的过程以防忘记。
第二 配置重要参数
appPackage
该参数用于指定待运行的 APP,获取该参数值的方法下面介绍。
appActivity
该参数用来指定待启动的活动。获取方法如下:
1,手机连接电脑,打开手机调试功能,并运行待测试 APP,终端执行:
adb shell
2,接着,执行:
dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
直接查看输出结果中 mFocusedApp 的值,比如
mFocusedApp=AppWindowToken{372f88d6 token=Token{3b7b14f1 ActivityRecord{20692498 u0 com.tencent.mm/.ui.LauncherUI t895}}}
那么,以上两个参数appPackage
和appActivity
的具体配置如下:
'appPackage': 'com.tencent.mm',
'appActivity': '.ui.LauncherUI',
特别注意,appActivity
的值打头的点号.
,不要遗漏。
还有两个对处理中文字符很重要的参数:
resetKeyboard
unicodeKeyboard
这两个参数默认值均为 False,需要我们在程序中指定为True
,如:
'unicodeKeyboard': True,
'resetKeyboard': True,
最后一个参数'deviceName'
指定手机型号,比如我的手机型号ZTEQ519T
。
'deviceName': 'ZTEQ519T'
需要说明的是,如果手机 Android 版本低于4.4
,还需要设置'automationName'
参数来指定测试引擎,更高系统版本的测试引擎默认为Appium
,无需再设置该参数了。
# Android < 4.4
'automationName': 'selendroid'
第三 程序简单实现
# coding:utf8
import logging
import os
import glob
import unittest
from time import sleep
import time
import sys
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.common.by import By
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO)
YOUR_QQ = 'YOUR_QQ'
YOUR_PASSWORD = 'YOUR_PASSWORD'
PLATFORM_VERSION = '5.1.1'
class Wechat():
def __int__(self):
app = os.path.abspath(
os.path.join(os.path.dirname(__file__),
'weixin6313android740.apk'))
desired_caps = {
'app': app,
'appPackage': 'com.tencent.mm',
'appActivity': '.ui.LauncherUI',
'platformName': 'Android',
'platformVersion': PLATFORM_VERSION,
'deviceName': 'ZTEQ519T', # emulator-22 It's True
# 'automationName': 'selendroid',
'newCommandTimeout': 90, # default 60s
'unicodeKeyboard': True,
'resetKeyboard': True,
'autoWebviewTimeout': 3000,
'autoWebview': True
}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
self.loginWechat()
def loginWechat(self):
self.driver.implicitly_wait(40)
button_login = self.driver.find_element_by_name(u'语言')
# sleep(20)
button_login.click()
sleep(1)
self.driver.find_elements_by_xpath('//android.widget.CheckBox')[4].click()
self.driver.find_element_by_name(u'保存').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_name('Log In').click()
self.driver.find_element_by_name('Change Login Mode').click()
username = self.driver.find_element_by_name('WeChat ID/Email/QQ ID')
sleep(0.3)
username.send_keys(YOUR_QQ)
sleep(0.3)
password = self.driver.find_elements_by_xpath('//android.widget.EditText')[1]
sleep(0.3)
password.send_keys(YOUR_PASSWORD)
self.driver.find_element_by_name('Log In').click()
self.driver.implicitly_wait(30)
try:
self.driver.find_element_by_name('No').click()
except:
pass
self.driver.implicitly_wait(100) # 必须?
self.driver.find_element_by_name('Discover').click()
sleep(.1)
self.driver.find_element_by_name('Moments').click()
sleep(3)
self.getall()
def getall(self):
start = time.time()
while True:
# swipe down
self.driver.swipe(start_x=520, start_y=1000, end_x=520, end_y=0, duration=400) # duration越小,swipe跨度越大
end = time.time()
if end - start > 15:
logging.info('See you !')
break
self.driver.quit()
if __name__ == '__main__':
Wechat().__int__()
提示,账号密码参数需要修改下,
YOUR_QQ = 'YOUR_QQ'
YOUR_PASSWORD = 'YOUR_PASSWORD'
第四 一些注解
1,下行代码设定微信 APP 所在目录,该 APP 名称不一定与此一致,需修改之。
app = os.path.abspath(
os.path.join(os.path.dirname(__file__),
'weixin6313android740.apk'))
2,登录成功后跳过检查手机通讯录新好友,如果微信绑定了手机号(好像现在是只能手机号注册了,新注册的微信号都绑定了手机号)
try:
self.driver.find_element_by_name('No').click()
except:
pass
3,程序大概处理流程
输入账号与密码-->成功登录-->跳过新好友检测-->从聊天子菜单跳转至发现菜单-->进入朋友圈-->程序退出