1. 概述
按照编码届的传统,学习一样技术,不打出“Hello World”不算入门,今天我们就来看看对于Appium 我们如何写出出“Hello World”级别的代码。继上一篇文章Windows下Appium环境搭建之后,这次先从页面元素查找,再到应用登录。
2.元素查找
正如我们所了解Python在页面元素查找支持Xpath,BeautifulSoup等等相关框架,同样Appium也是基于selenium的,那么它也是同样支持其相关特性的。下面简单从一个App考研帮的安装到点击讲起。
2.1 界面解析
我们启动Appium 客户端之后,可以看到如下界面:
点击红色的区域即可进入到以下界面:
填写左侧红色方框关于capability 的参数,即可以生成右侧JSON 格式配置参数,点击'Start Session'即可以连接真机,可以看到“跳过”的id
根据上述分析和需求,我们可以写出以下代码:
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根据该应用的使用情况,当应用登录成功后,界面会出现“我”这个元素,如下图:
因此这个元素是否存在可以作为应用是否登录的简单判断。有了上述逻辑分析,我们可以简单写出以下代码,代码结合上述代码一起理解很简单,看注释就可以懂,不做过多代码解释:
点击跳过:
# 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”。后续将会逐渐深入。