python+appium【第五章-Appium初识】

 

今天教大家如何针对app进行元素识别

 

  • 先了解一下appium的工作原理

 

 

  • 由上图可知:

appium支持多语言,因为它针对流的几种语言分别开发的相应的appium库。好处就是我们可以选择自己熟悉的语言编写appium脚本
appium支持多平台,包括MAC和Windows。它针对这两大平台开发了appium-Server
appium又同时支持Android 和 iOS两个操作系统,这就可以应用分别不同的移动设备上,覆盖市场上的大部分移动设备机型。

  • appium配置连接参数

 

那我们不多说废话了,直接开整,我这边连接的是真机,先查看一下设备的id

可以发现当前的设备id : c6c8c4ce


 

这个时候获取到了我们的设备id,接下来获取被测试的包名信息,通过反编译本地包的方法

aapt dumpsys badging 本地apk包名的位置

aapt dumpsys badging D:\apk\jisuanqi.apk

获取到了包名:rock.Simple.Calculator

活动入口名称:rock.Simple.Calculator.MainActivity


 


 

 

拿到这两个参数之后,我们离成功就不远了,终点就在前方 ,我们来解析一下连接appium远程的一些参数

 

# 首先要先下载 Appiunm-Python-Client 包

from appium import webdriver # 引入webdriver方法

des = {
"automationName": "Appium", # 默认是配置appium
"platformName": "Android", # 平台名称 ios/android/firefox Os
"platformVersion": "8.1.0", # 安卓的版本
"deviceName": "vivo x20", # 随便填 没关系
"app": "D:\apk\jisuanqi.apk",
"appPackage": "rock.Simple.Calculator", # 包名
"appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口
"udid": "c6c8c4ce", # adb连接的设备名称
"noSign": True,
"newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

 

配置完这些我们就打开我们的appium,启动一下服务

 

 

服务启动完成



然后运行代码,观察日志,观察手机,发现运行完成,成功打开

 

 

 

 

 


 

  • appium识别元素

 

那我们现在会打开app了,那是不是就可以开始识别元素了呢? 对的,接下来教大家如何使用appium自带的元素识别工具

 

1.点击这个小放大镜

 

 

2.填入我们刚刚在代码里面的配置,不过不需要太多,只需要一下这些

 

 

 

2.添加参数信息

 

 

 

 

 3. 然后点击start session,就会出现计算器的样子

 

 

  • appium元素定位

 

 

 

  • 先说说绝对定位,比如我们要定位到【8】这个元素,会发现他有6层 不着急我们一层一层的写

 

 

 

from appium import webdriver

des = {
    "automationName": "Appium",  # 默认是配置appium
    "platformName": "Android",  # 平台名称 ios/android/firefox Os
    "platformVersion": "8.1.0",  # 安卓的版本
    "deviceName": "vivo x20",  # 随便填 没关系
    "app": r"D:\apk\jisuanqi.apk",
    "appPackage": "rock.Simple.Calculator",  # 包名
    "appActivity": "rock.Simple.Calculator.MainActivity",  # 活动入口
    "udid": "c6c8c4ce",  # adb连接的设备名称
    "noSign": True,
    "newCommandTimeout": 30  # 30s没对手机发送新命令,就断开连接
}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/'
                             'android.widget.LinearLayout/android.widget.LinearLayout[2]/'
                             'android.widget.LinearLayout[2]/android.widget.Button[2]').click()

可以发现我们这边定位到了六层之后,他就会点击8,这里需要注意的是,开头为什么要用双斜杠?
其实是因为它并不是顶级目录,上面还有一个目录,不信你可以自己试试去除双斜杠

 

 

 

 

  • 使用属性定位

 

from appium import webdriver

des = {
    "automationName": "Appium",  # 默认是配置appium
    "platformName": "Android",  # 平台名称 ios/android/firefox Os
    "platformVersion": "8.1.0",  # 安卓的版本
    "deviceName": "vivo x20",  # 随便填 没关系
    "app": r"D:\apk\jisuanqi.apk",
    "appPackage": "rock.Simple.Calculator",  # 包名
    "appActivity": "rock.Simple.Calculator.MainActivity",  # 活动入口
    "udid": "c6c8c4ce",  # adb连接的设备名称
    "noSign": True,
    "newCommandTimeout": 30  # 30s没对手机发送新命令,就断开连接
}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/'
                             'android.widget.LinearLayout/android.widget.LinearLayout[2]/'
                             'android.widget.LinearLayout[2]/android.widget.Button[2]').click()

# 使用text属性定位  '//属性值[@text=""]'
driver.find_element_by_xpath('//android.widget.Button[@text="+"]').click()  # 点击+号
# 使用resource-id  '//属性值[@resource-id=""]'
driver.find_element_by_xpath('//android.widget.Button[@resource-id="rock.Simple.Calculator:id/six_btn"]').click()  # 点击6
# 使用bounds
driver.find_element_by_xpath('//android.widget.Button[@bounds="[807,1458][1029,1958]"]').click()  # 点击=
# 当然还有很多的方式,可以自己查阅一下其他资料

 


 

 

 

  • 使用Xpath定位方法

 

from appium import webdriver

des = {
    "automationName": "Appium",  # 默认是配置appium
    "platformName": "Android",  # 平台名称 ios/android/firefox Os
    "platformVersion": "8.1.0",  # 安卓的版本
    "deviceName": "vivo x20",  # 随便填 没关系
    "app": r"D:\apk\jisuanqi.apk",
    "appPackage": "rock.Simple.Calculator",  # 包名
    "appActivity": "rock.Simple.Calculator.MainActivity",  # 活动入口
    "udid": "c6c8c4ce",  # adb连接的设备名称
    "noSign": True,
    "newCommandTimeout": 30  # 30s没对手机发送新命令,就断开连接
}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

# # 以什么元素开头    '//类名[contains(@元素名,"内容")]'  这里没有元素好定位的
# driver.find_element_by_xpath('//android.widget.Button[contains(@元素,"xxxxx")]').click()
# 元素包含某某内容   '//类名[contains(@元素名,"内容")]'
driver.find_element_by_xpath('//android.widget.Button[contains(@resource-id,"six_btn")]').click()
# 末尾开始匹配   '//类名[ends-with(@元素名,"内容")]'
driver.find_element_by_xpath('//android.widget.Button[ends-with(@resource-id,"one_btn")]').click()


 

 

 

 

  • uiautomator定位方法

 

appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。在代码实现上提供的API是find_element_by_android_uiautomator。


from
appium import webdriver des = { "automationName": "Appium", # 默认是配置appium "platformName": "Android", # 平台名称 ios/android/firefox Os "platformVersion": "8.1.0", # 安卓的版本 "deviceName": "vivo x20", # 随便填 没关系 "app": r"D:\apk\jisuanqi.apk", "appPackage": "rock.Simple.Calculator", # 包名 "appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口 "udid": "c6c8c4ce", # adb连接的设备名称 "noSign": True, "newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des) # driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/' # 'android.widget.LinearLayout/android.widget.LinearLayout[2]/' # 'android.widget.LinearLayout[2]/android.widget.Button[2]').click() # # 使用text属性定位 '//属性值[@text=""]' # driver.find_element_by_xpath('//android.widget.Button[@text="+"]').click() # 点击+号 # # 使用resource-id '//属性值[@resource-id=""]' # driver.find_element_by_xpath('//android.widget.Button[@resource-id="rock.Simple.Calculator:id/six_btn"]').click() # 点击6 # # 使用bounds # driver.find_element_by_xpath('//android.widget.Button[@bounds="[807,1458][1029,1958]"]').click() # 点击= # # 以什么元素开头 '//类名[contains(@元素名,"内容")]' 这里没有元素好定位的 # driver.find_element_by_xpath('//android.widget.Button[contains(@元素,"xxxxx")]').click() # # 元素包含某某内容 '//类名[contains(@元素名,"内容")]' # driver.find_element_by_xpath('//android.widget.Button[contains(@resource-id,"six_btn")]').click() # # 末尾开始匹配 '//类名[ends-with(@元素名,"内容")]' # driver.find_element_by_xpath('//android.widget.Button[ends-with(@resource-id,"one_btn")]').click() # 点击 9 driver.find_element_by_android_uiautomator('text("9")').click() # 点击9 新建一个UiSelect对象 driver.find_element_by_android_uiautomator('resourceId("rock.Simple.Calculator:id/nine_btn") ').click()
# 点击8 driver.find_element_by_android_uiautomator(
'new UiSelector().resourceId("rock.Simple.Calculator:id/eight_btn")').click()


 

 




 

 

后续更新...

 

 

 

posted @ 2021-09-09 10:47  罐装七喜  阅读(193)  评论(0编辑  收藏  举报