Appium 使用 Appium 简单模拟 Wechat (Android) 登录

appium · 2016年03月14日 · 最后由 menma 回复于 2016年05月25日 · 4151 次阅读

第一 絮叨
使用 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,程序大概处理流程

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

共收到 22 条回复 时间 点赞

突然想到运行程序的方法
appium-doc --android检查前期准备工作是否完成
appium打开 appium
python wechat.py即可

简单清晰,新手必备。

#2 楼 @t880216t 多谢支持👌

挺好的入门帖,下次再被问这样的问题就直接贴你的帖子了😄有一点错误指出下啊
Android
Mac OSX 10.7+ or Windows 7+ or Linux
Android SDK ≥ 16 (SDK < 16 in Selendroid mode)
应该是 4.1 以下需要使用 selendroid 模式

我感觉官方也不太清晰,有两处写到 automationName 的说明:
第一个,http://appium.io/slate/en/master/?python#running-your-test-app-with-appium-(android-devices-<-4.2,-and-hybrid-tests)
文档链接 1
第二个,http://appium.io/slate/en/master/?python#automating-hybrid-android-apps
文档链接 2

#5 楼 @wut0n9 拿 ui automator viewer 找元素的时候,4.1 以下会报错的需要 api16+ 的错误的。我记得我跑 api16 还是 17 的时候,用 appium 模式是可以跑的😄

#6 楼 @neyo automationName 可能是在混合应用中需要我们依据系统版本指定具体值?

#7 楼 @wut0n9 嗯,第二段的意思是 selendroid 测 4.4 以下的 webview。webview 方面各版本我就没验证过,不知道啦

#7 楼 @wut0n9 第一段的文档也有问题,api16 应该是支持的

appium #10 · 2016年03月14日 Author

#9 楼 @neyo 代码更新快于文档,应该是这样吧

学习一下 非常感谢

学习一下。非常感谢

这个是刚安装时候才能用,如果是已经登陆过又退出的,重新打开软件时候界面就不一样了哦,最好多些判断什么的

我用 java 语言写的,但是就是启动 app 的时候,报 appium 的有多个启动,但是我只启动了一个啊

#14 楼 @sunny_sun 亲 JAVA 代码能帐号出来大家一起学习下么?

#14 楼 @sunny_sun 和楼主的一样吗?我也想看看 Java 的代码

多谢楼主了,在你的代码基础上可以写出一个简单的微信操作代码了~我现在想关注一个微信公众号,请求支援。。。

desired_capabilities['appPackage'] = 'com.android.calculator2'
desired_capabilities['appActivity'] = '.Calculator'
请问这两句什么意思

#18 楼 @abcfleeting 测试的包名和启动的 activity

20楼 已删除

def test_gestureUnlock(self):
#time.sleep(5)
el1 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[10]")
print el1
time.sleep(2)
el2 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[13]")
print el2
time.sleep(2)
el3 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[16]")
print el3
time.sleep(2)
el4 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[17]")
print el4
time.sleep(2)
Gesture = TouchAction().press(el1).move_to(el2).move_to(el3).move_to(el4).release()
print Gesture
time.sleep(2)
Gesture.perform()

请问 手势密码这一段有什么问题啊 一直提示如下错误:

File "/Library/Python/2.7/site-packages/appium/webdriver/common/touch_action.py", line 94, in perform
self._driver.execute(Command.TOUCH_ACTION, params)
AttributeError: 'NoneType' object has no attribute 'execute'

我在启动微信的时候老是闪退 我的包和类名有问题吗
capabilities.setCapability("appPackage", "com.tencent.mm");
capabilities.setCapability("appActivity", ".ui.LauncherUI");

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册