appium介绍
使用appium实现APP UI自动化
自动化实现app登录的代码解释:
代码1:
root_path = os.path.dirname(__file__)
打印当前项目路径
app_path = os.path.join(root_path,"app/").replace("\\","/")
打印app安装包的路径
代码的意思:
os.path.dirname(file)返回脚本的路径,但是需要注意一下几点:
1、必须是实际存在的.py文件,如果在命令行执行,则会引发异常NameError: name ‘file’ is not defined
2、在运行的时候如果输入完整的执行的路径,则返回.py文件的全路径如:
python c:/test/test.py 则返回路径 c:/test ,如果是python test.py 则返回空
3、结合os.path.abspath用,效果会好,如果大家看过一些python架构的代码的话,会发现经常有这样的组合
os.path.dirname(os.path.abspath(file)),os.path.abspath(file)返回的是.py文件的绝对路径
这就是os.path.dirname(file)的用法,其主要总结起来有:
1、不要以命令行的形式来进行os.path.dirname(file)这种形式来使用这个函数
2、结合os.path.abspath()使用
root_path = os.path.dirname(__file__)
app_path = os.path.join(root_path,"app/").replace("\\","/")
app_name ="osc.apk"
desired_caps['app'] = '%s%s'%(app_path,app_name)
上述代码的意思是找到“osc.apk”文件的路径;如果把“osc.apk”文件放在代码的同级下面,就不用如此复杂,可以直接:
**desired_caps[‘app’] = “osc.apk” ** #如果app与代码在同一路径下,则可以直接这么写。。。。
注:一般写框架需要有代码结构,将apk文件放在app目录中,这样可以使代码结构更加清晰,不至于太乱。
代码2:包名 和 主activity获取
desired_caps['appPackage'] = 'net.oschina.app' #包名
desired_caps['appActivity']='net.oschina.app.LaunchActivity' #主activity
提取包名和主activity的方法:
方法1:
**cmd:java –jar re-sign.jar **
#打开re-sign.jar 或者直接双击re-sign.jar
将osc.apk移动到re-sign.jar中,点击“保存”后可获得包名和主activity名
这个工具容易报错,错误原因:JAVA_HOME 路径写错了。
方法2:
使用命令:
aapt dump badging E:\osc.apk
方法3:
Appium中在“Android Settings”里, “application path”点击“choose”选择osc.apk的路径——取package和Launch Activity的名
(一般第一个就是主activity;不一定就是第一个,看情况)——用完之后必须去掉勾选,不然appium会报错(因为在代码中已经传过这些参数,appium中再设置会重复,尽量不要用appium设置)
代码3:运行的脚本
1、连接到对应的server
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
问题:http://localhost:4723/wd/hub怎么来的???
--------Appium中查看port值为4723;
2、定位元素
driver.find_element_by_name(“我的”).click()
代码4:点击登录页面
driver.find_element_by_id("net.oschina.app:id/iv_portrait").click()
问题:net.oschina.app:id/iv_portrait的来源?—— 使用工具UI Automator Viewer
工具:UI Automator Viewer—— 一个用来来扫描和分析Android应用程序的UI组件的GUI工具
用途:使用uiautomatorviewer,你可以检查一个应用的UI来查看应用的布局和组件以及相关的属性
第一步:Cmd中输入:uiautomatorviewer——打开UI Automator Viewer
第二步:通过uiautomatorviewer窗体点击 “Device screenshot” ——一个计算机应用的打开窗口将显示出来
第三步:下面将来查看按钮“登录”的ID:点击 “登录” (如下截图) ,查看右边的panel来找到 “resource-id” 的值
注意:appium中:General Settings —勾选—Override Existing Session
#防止出现报错信息:
selenium.common.exceptions.NoSuchElementException:Message:An element could not be located on the page using the given search parameters.
完整代码
#!encoding=utf-8
import os
import time
from appium import webdriver
root_path = os.path.dirname(__file__)
app_path = os.path.join(root_path,"app/").replace("\\","/")
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = '127.0.0.1:62001'
desired_caps['app'] = app_path+os.listdir(app_path)[0]
desired_caps['appPackage'] = 'net.oschina.app'
desired_caps['appActivity'] = 'net.oschina.app.LaunchActivity'
desired_caps["unicodeKeyboard"] = True # 使用unicodeKeyboard的编码方式来发送字符串
desired_caps["resetKeyboard"] = True # 将键盘给隐藏起来
#desired_caps['appActivity'] = 'net.oschina.app.improve.account.activity.LoginActivity'
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
time.sleep(3)
# driver.find_elements_by_id("net.oschina.app:id/btn_update").click()
# time.sleep(10)
print driver.page_source
print driver.find_elements_by_id("net.oschina.app:id/nav_tv_title")
for i in driver.find_elements_by_id("net.oschina.app:id/nav_tv_title"):
# print i.get_attribute("name")
print i.text
driver.find_elements_by_id("net.oschina.app:id/nav_tv_title")[3].click()
driver.find_element_by_xpath("//android.widget.ImageView[@resource-id=\"net.oschina.app:id/iv_portrait\"]")
driver.find_element_by_id().send_keys(u"你好")
# driver.find_element_by_name("我的").click()
# time.sleep(1)
# driver.find_element_by_id("net.oschina.app:id/iv_portrait").click()
# time.sleep(1)
# print driver.current_activity
time.sleep(1)
driver.quit()