Appium自动化测试基于Python


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.14.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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值