首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Appium自动化(十一)实现一个简单的登陆功能

Appium自动化(十一)实现一个简单的登陆功能

作者头像
雷子
发布2021-03-12 11:38:28
发布2021-03-12 11:38:28
9680
举报

前言

在之前的文章,我们分享了一系列的文章,那么我们这次分享,找一个app为demo,进行简单的一个功能的测试,后续文章会围绕该app进行实战化讲解。

正文

1.app实战选择

选择了哔哩哔哩的客户端。

2.下载客户端,启动体验,测试模块登陆模块。

3.对启动过程进行分析。

3.1首先启动后,会出现同意框

3.2 出现加载文件,需要联网,等待即可。

3.3元素定位

工具集合:uiautomatorviewer和hierarchyviewer都可以。

4.梳理登录流程

4.1 启动app

4.2 点击登录

4.3跳转到登录界面

4.4我们选择用户名密码登录

4.5定位用户名输入框,清空,输入用户名

4.6 定位密码输入框,清空,输入用户名密码

4.7 点击登录

4.8 断言是否成功

那么我们转化成脚本如何实现呢。代码如下

代码语言:javascript
复制
from time import sleep
from appium import webdriver
from androguard.core.bytecodes.apk import APK
import os
apk_path = "/Users/lileilei/Downloads/iBiliPlayer-bili.apk"
def get_devices() -> list:
    all_devices = []
    cmd = "adb devices"
    reslut = os.popen(cmd).readlines()[1:]
    for item in reslut:
        if item != "\n":
            all_devices.append(str(item).split("\t")[0])
    return all_devices


def getPlatForm(dev: str) -> str:
    cmd = 'adb -s {} shell getprop ro.build.version.release'.format(dev)
    reslut = os.popen(cmd).readlines()[0]
    return str(reslut).split("\n")[0]


def get_apkname(apk):
    a = APK(apk, False, "r")
    return a.get_package()


def get_apk_lautc(apk):
    a = APK(apk, False, "r")
    return a.get_main_activity()


def isinstallapk(packname: str, devname: str) -> bool:
    cmd = "adb -s {} shell pm list packages -3".format(devname)
    reslut = os.popen(cmd).readlines()
    all_apkname = []
    for i in reslut:
        apkname = str(i).split('\n')[0].split(":")[1]
        all_apkname.append(apkname)
    if packname in all_apkname:
        return True
    return False


def uninstallapk(packname: str, devname: str) -> bool:
    cmd = "adb -s {} shell pm list packages -3".format(devname)
    reslut = os.popen(cmd).readlines()
    all_apkname = []
    for i in reslut:
        apkname = str(i).split('\n')[0].split(":")[1]
        all_apkname.append(apkname)
    if packname in all_apkname:
        cmd = 'adb -s %s uninstall %s ' % (devname, packname)
        os.system(cmd)
        return True
    return False


def installapk(paknamepath: str, devname: str) -> bool:
    cmd = 'adb -s %s install %s' % (devname, paknamepath)
    os.system(cmd)
    return True


def testqqlogin():
    packname = get_apkname(apk_path)
    dev = get_devices()[0]
    is_first_install=False
    # 1.判断是否安装app
    is_install = isinstallapk(packname, dev)
    if is_install is False:
        # 2.如果没有安装,则安装
        installapk(apk_path, dev)
        is_first_install=True

    # 3.启动apk测试
    apkname=get_apkname(apk_path)
    launcheractivity=get_apk_lautc(apk_path)
    desired_caps = {
        'platformName': 'Android',
        'deviceName': dev,  # adb  deivces
        'platformVersion': getPlatForm(dev),  # 从设置中可以获取
        'appPackage':apkname ,  # 包名
        'appActivity': launcheractivity,  # apk的launcherActivity
        # 'skipServerInstallation': True
    }

    driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
    sleep(10)
    # 启动同意用户协议
    driver.find_element_by_id("tv.danmaku.bili:id/agree").click()
    if is_first_install :
        # 首次安装需要加载文件
        sleep(50)
    sleep(10)
    driver.find_element_by_xpath("//*[@text='登录']").click()
    driver.find_element_by_id('tv.danmaku.bili:id/btn_change_account').click()

    username=driver.find_element_by_id('tv.danmaku.bili:id/username')
    username.clear()
    username.send_keys("name")
    password=driver.find_element_by_id('tv.danmaku.bili:id/passport_tag')
    password.clear()
    password.send_keys("123456")
    login=driver.find_element_by_id('tv.danmaku.bili:id/btn_login')
    login.click()
    driver.close()


if __name__ == "__main__":
    testqqlogin()

整个流程特别简单,那么接下来,我们去启动appium服务去完成对应的测试即可。appium可以选择客户端,也可以用命令行启动。

在整个测试的过程中,appium给我们详细的日志,我们可以根据日志去查看我们对应的报错。

执行完毕,正常的我们就登录成功了我们B站的账号。这是一个简单的流程的组织,后续会结合unittest和ddt数据驱动去管理我们的测试用例。

后记

上面给予大家一个简单的示例,后续还会给大家分享更多,更加有用的内容,欢迎持续关注雷子说测试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档