第一 絮叨
使用 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}}}

那么,以上两个参数appPackageappActivity的具体配置如下:

'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,程序大概处理流程

输入账号与密码-->成功登录-->跳过新好友检测-->从聊天子菜单跳转至发现菜单-->进入朋友圈-->程序退出


↙↙↙阅读原文可查看相关链接,并与作者交流