Appium元素定位之应用登录

1. 概述

按照编码届的传统,学习一样技术,不打出“Hello World”不算入门,今天我们就来看看对于Appium 我们如何写出出“Hello World”级别的代码。继上一篇文章Windows下Appium环境搭建之后,这次先从页面元素查找,再到应用登录。

2.元素查找

正如我们所了解Python在页面元素查找支持Xpath,BeautifulSoup等等相关框架,同样Appium也是基于selenium的,那么它也是同样支持其相关特性的。下面简单从一个App考研帮的安装到点击讲起。

2.1 界面解析

我们启动Appium 客户端之后,可以看到如下界面:

appium_cmd.png

点击红色的区域即可进入到以下界面:
appium_par.png

填写左侧红色方框关于capability 的参数,即可以生成右侧JSON 格式配置参数,点击'Start Session'即可以连接真机,可以看到“跳过”的id
appium_element.png
为“com.tal.kaoyan:id/tv_skip”。根据以上我们就先来查找按钮“跳过”然后点击。
根据上述分析和需求,我们可以写出以下代码:

from  appium import webdriver

desired_caps={}
desired_caps['deviceName']='Nexus 6P'# 设备名称
desired_caps['platforVersion']='8.1.0'# 平台版本
desired_caps['udid']='8XV5T15A10001108'# 真机的uid
desired_caps['platformName'] = 'Android'# 设备操作系统
desired_caps['noReset']='True'# 是否重置app

desired_caps['app']='/Users/zhanxiuwen/Projects/Python/Appium/kyb.apk'# apk 路径
desired_caps['appPackage']='com.tal.kaoyan'#包名
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'# 启动页面

driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
#查找id 为 tv_skip 的元素
skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
#点击跳转
skipBtn.click()

连接手机,运行可以看出app自动点击“跳过”进入登录页面。我们从代码中可以看出和上述的JSON 格式一致,因此更加可以确定在[Windows下Appium环境搭建]中所说的“(https://www.jianshu.com/p/32a5aef630cc)Appium-desktop工具其实也封装了Appium server和Node.js依赖环境”。
这里有个细节就是
desired_caps['noReset']='True'# 是否重置app ,"noReset"参数故名思义就是app每次启动是否重置的开关,关于“capability” 后续文章会专门说到。
从上述显现配合“noReset”参数,我们可以用来控制app每次启动是否是重置,即第一次安装使用的效果,显然我们平时使用的过程中,只需要登录一次,“跳过”这个按钮不一定会出现。如果没有这个按钮,那么就会报出元素找不到异常。或许有人想到添加以下判断即可:

skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
if skipBtn:
    skipBtn.click()
else:
    print('no skipBtn')

但是实际上这样并不行,依旧会报出元素不存在的异常。
那么在Appium中我们可以作如下异常处理即可,简单完整代码如下:

from  appium import webdriver
from selenium.common.exceptions import NoSuchElementException
desired_caps={}
desired_caps['deviceName']='Nexus 6P'
desired_caps['platforVersion']='8.1.0'
desired_caps['udid']='8XV5T15A10001108'
desired_caps['platformName'] = 'Android'
desired_caps['noReset']='True'
desired_caps['app']='/Users/zhanxiuwen/Projects/Python/Appium/kyb.apk'
desired_caps['appPackage']='com.tal.kaoyan'
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(5)

def checkSkipElement():
    try:
        skipBtn = driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
        skipBtn.click()
        print('has element')
    except NoSuchElementException:
        print("no such element")
    pass
checkSkipElement()

从代码可以看出简单的try-except 就可以处理这种元素不存在的问题,这也是在Appium中的最根本处理方式。以上是对元素查找和元素操作的简单介绍,接下来相对复杂点对应用进行登录操作。

3.应用登录

根据上述对元素的定位和操作介绍,我们大概有个基本了解。根据Appium我们可以查找到应用的用户名和密码id
appium_login.png

根据该应用的使用情况,当应用登录成功后,界面会出现“我”这个元素,如下图:


appium_mine.png

因此这个元素是否存在可以作为应用是否登录的简单判断。有了上述逻辑分析,我们可以简单写出以下代码,代码结合上述代码一起理解很简单,看注释就可以懂,不做过多代码解释:
点击跳过:
# coding: utf8
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
from LoginUtils import find_myself


def connect_devices():
    desired_caps = {}
    desired_caps['deviceName'] = 'Nexus 6P'
    desired_caps['platforVersion'] = '8.1.0'
    desired_caps['udid'] = '8XV5T15A10001108'
    desired_caps['platformName'] = 'Android'
    desired_caps['noReset'] = 'True'
    desired_caps['app'] = '/Users/zhanxiuwen/Projects/Python/Appium/kyb.apk'
    desired_caps['appPackage'] = 'com.tal.kaoyan'
    desired_caps['appActivity'] = 'com.tal.kaoyan.ui.activity.SplashActivity'
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    return driver

def checkSkipElement( driver):
    try:
        skipBtn = driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
        skipBtn.click()
        print('has element')
    except NoSuchElementException:
        print("no such element")
    pass

def main():
    driver = connect_devices()
    driver.implicitly_wait(2)
    checkSkipElement(driver)
    find_myself(driver)
    pass

if __name__ == '__main__':
    main()

登录判断,输入密码点击登录

# coding: utf8
from selenium.common.exceptions import NoSuchElementException

#处理登录逻辑,设置用户名 密码和点击登录
def login(driver):
    driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
    driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('owentest')
    driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('12345678')
    # driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
    print('login success')

#查找元素"我"是否存在
def find_myself(driver):
    try:
        driver.find_element_by_id('com.tal.kaoyan:id/mainactivity_button_mysefl')
    except NoSuchElementException:
        login(driver)
    else:
        driver.find_element_by_id('com.tal.kaoyan:id/mainactivity_button_mysefl').click()
        driver.find_element_by_id('com.tal.kaoyan:id/activity_usercenter_username').click()
        login(driver)

从代码可以看出整个登录流程基本走通,但还存在其他场景,这个就需要我们结合具体场景具体分析,上述均属于抛砖引玉,写出了一个简单的Appium入门级别的“Hello World”。后续将会逐渐深入。

你可能感兴趣的:(Appium元素定位之应用登录)