目录
appium获取包名和activity
最准确的是下面这种方法:
命令行中输入:
adb shell dumpsys activity activities
输出后在前面的信息中查找:
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.chenhon.xmkt.inst/com.chenhon.app.views.home.WelcomeActivity}
在cmp中:cmp=com.jiejing.xmkt.inst/com.jiejing.app.views.home.WelcomeActivity
com.chenhon.xmkt.inst为package,com.chenhon.app.views.home.WelcomeActivity为启动app的activity
只需要搜索cmp,再查看cpm后面的包名和activity
若还没有再查看com,看看有没有合适的
打开应用例子
# coding=utf-8
from appium import webdriver
import time
desired_caps = {}
desired_caps['platformName'] = 'Android' #使用哪个移动操作系统平台 iOS,Android或FirefoxOS
desired_caps['platformVersion'] = '10' #移动操作系统版本 例如7.1,4.4
desired_caps['deviceName'] = 'Android Emulator' #使用的移动设备或模拟器的种类 iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4,等....在iOS上,这应该是与仪器返回的有效设备之一instruments -s devices。在Android上,这个功能目前被忽略,尽管它仍然是必需的。
desired_caps['appPackage'] = 'com.xiaomi.shop' #你想运行的Android应用程序的Java包 com.example.android.myApp, com.android.settings
# com.miui.calculator
desired_caps['noReset'] = 'true' #在此会话之前不要重置应用程序状态。 true, false
desired_caps['autoGrantPermissions'] = 'true' #让Appium自动确定您的应用程序需要哪些权限,并在安装时将其授予应用程序。默认为false
desired_caps['appActivity'] = 'com.xiaomi.shop2.activity.MainActivity' #要从包中启动的Android活动的活动名称。这往往需要在一个.(例如,.MainActivity而不是MainActivity)
print('连接到手机')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
try:
print('进入')
time.sleep(5)
print('点击智造新生活')
newlife = driver.find_element_by_id('com.xiaomi.shop.plugin.homepage:id/home_hot_zone_view').click()
time.sleep(5)
print('循环点击抢卷')
for i in range(100):
discopt = driver.find_element_by_id('com.xiaomi.shop2.plugin.hdchannel:id/iv_coupon').click()
except:
pass
time.sleep(10)
driver.quit()
坐标位置点击
# 前言:
有时候定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问)
那就拿出绝招:点元素所在位置的坐标
tap用法
1.tap是模拟手指点击,一般页面上元素
的语法有两个参数,第一个是positions,是list类型最多五个点,duration是持续时间,单位毫秒
tap(self, positions, duration=None):
Taps on an particular place with up to five fingers, holding for a certain time
模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)
:Args:
- positions - list类型,里面对象是元组,最多五个。如:[(100, 20), (100, 60)]
- duration - 持续时间,单位毫秒,如:500
:Usage:
driver.tap([(100, 20), (100, 60), (100, 100)], 500)
坐标定位
1.如下图定位"去看看"这个按钮的坐标,可以看到右侧bonds属性:[374,831][654,906]
2.点右上角"搜索"按钮,查看bonds属性:[615,52][690,146]
参考案例
# coding:utf-8
from appium import webdriver
from time import sleep
desired_caps = {
'platformName': 'Android',
'deviceName': '127.0.0.1:62001',
'platformVersion': '4.4.2',
'appPackage': 'com.baidu.yuedu',
'appActivity': 'com.baidu.yuedu.splash.SplashActivity'
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
sleep(5)
点弹出框去看看
driver.tap([(374, 831), (654, 906)], 500)
返回上一页
driver.back()
sleep(2)
点右上角搜素按钮
driver.tap([(615, 52), (690, 146)], 500)
弊端
通过坐标定位是元素定位的下下下策,实在没办法才用这个,另外如果换了手机分辨率,这个坐标就不能写死了,得算出所在屏幕的比例。
滑动屏幕
在 Appium 中提供 swipe() 方法来模拟用户滑动屏幕。
swipe() 实现过程 是先通过在屏幕上标记两个坐标,然后再从开始坐标移动到结束坐标。
先看下 swipe 方法定义:
def swipe(self, start_x, start_y, end_x, end_y, duration=None):
"""Swipe from one point to another point, for an optional duration.
Args:
start_x (int): x-coordinate at which to start
start_y (int): y-coordinate at which to start
end_x (int): x-coordinate at which to stop
end_y (int): y-coordinate at which to stop
duration (:obj:`int`, optional): time to take the swipe, in ms.
Usage:
driver.swipe(100, 100, 100, 400)
Returns:
`appium.webdriver.webelement.WebElement`
"""
start_x:开始坐标 x 轴
start_y:开始坐标 y 轴
end_x:结束坐标 x 轴
end_y:结束坐标 y 轴
duration:开始坐标移动到结束坐标的时间,默认 None
一段简单的代码:
from appium import webdriver
desired_caps = {
'platformName': 'Android',
'deviceName': '192.168.41.101:5555',
'platformVersion': '9.0',
# apk包名
'appPackage': 'com.gem.tastyfood',
# apk的launcherActivity
'appActivity': 'com.gem.tastyfood.LaunchActivity'
}
if __name__=='__main__':
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
x = driver.get_window_size()["width"]
y = driver.get_window_size()["height"]
#向左滑动
driver.swipe(x*0.9,y*0.5,x*0.1,y*0.5,duration=2000)
可以将 左滑、右滑、上滑、下滑 写成方法,方便调用:
from appium import webdriver
desired_caps = {
'platformName': 'Android',
'deviceName': '192.168.41.101:5555',
'platformVersion': '9.0',
# apk包名
'appPackage': 'com.gem.tastyfood',
# apk的launcherActivity
'appActivity': 'com.gem.tastyfood.LaunchActivity'
}
# 向左滑动。y轴保持不变,X轴:由大变小
def swipe_left(driver,star_x=0.9,stop_x=0.1,duration=2000):
x1 = int(x*star_x)
y1 = int(y*0.5)
x2 = int(x*stop_x)
y2 = int(y*0.5)
driver.swipe(x1,y1,x2,y2,duration)
# 向右滑动。y轴保持不变,X轴:由小变大
def swipe_right(driver,star_x=0.1,stop_x=0.9,duration=2000):
x1 = int(x*star_x)
y1 = int(y*0.5)
x2 = int(x*stop_x)
y2 = int(y*0.5)
driver.swipe(x1,y1,x2,y2,duration)
# 向上滑动。x轴保持不变,y轴:由大变小
def swipe_up(driver,star_y=0.9,stop_y=0.1,duration=2000):
x1 = int(x*0.5)
y1 = int(y*star_y)
x2 = int(x*0.5)
y2 = int(y*stop_y)
driver.swipe(x1,y1,x2,y2,duration)
# 向下滑动。x轴保持不变,y轴:由小变大
def swipe_down(driver,star_y=0.1,stop_y=0.9,duration=2000):
x1 = int(x*0.5)
y1 = int(y*star_y)
x2 = int(x*0.5)
y2 = int(y*stop_y)
driver.swipe(x1,y1,x2,y2,duration)
if __name__=='__main__':
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
x = driver.get_window_size()["width"]
y = driver.get_window_size()["height"]
swipe_left(driver)
swipe_right(driver)
swipe_up(driver)
swipe_down(driver)
获取text
# 获取text
t1 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").text
print(t1)
获取tag_name(实质上就是class)
# 获取tag_name
t2 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").tag_name
print(t2)
获取属性的内容(get_attribute)
1.获取content-desc属性,这里注意了,如果content-desc属性为空,那么获取的就是text属性,不为空获取的才是content-desc属性
# content-desc为空,获取的是text
t3 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("name")
print(t3)
id,calss,text属性获取
# id
t5 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("resourceId")
print(t5)
# class
t6 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("className")
print(t6)
# text
t7 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("text")
print(t7)
5.其它属性获取,注意这里并不是所有的都可以获取,一些标准的属性是可以获取到的
# checkable
t8 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("checkable")
print t8
# clickable
t9 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("clickable")
print t9
size和location
1.获取size,返回的是字典,如:{‘width’: 84, ‘height’: 84}
2.获取location,返回的是字典,如:{‘y’: 38, ‘x’: 192}
# size
t10 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").size
print t10
# location
t11 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").location
print t11
等主页面activity出现
driver.wait_activity(".base.ui.MainActivity", 10)