元素定位、元素操作、手势滑屏、其他延伸
一、元素定位
1、代码启动说明(用pycharm启动)
移动自动化启动 app 基础脚本
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1"
#安卓不检测内容,随便写,但不能为空 desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
初始化参数介绍
2、基础 API (启动应用、获取包名、启动名)
1、应用跳转(如:先打开 设置 应用程序,再跳转到 短信 应用程序)
方法:driver.start_activity(appPackage,appActivity) (分别为:程序包名,程序界面名)
2、获取包名 和 界面名(如:打开设置界面,获取包名和界面名)
方法:
#获取包名:driver.current_package
#获取界面名:driver.current_activity
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #启动短信 driver.start_activity("com.android.messaging","ui.conversationlist") #打印包名启动名 print(driver.current_package) print(driver.current_activity)
3、安装、卸载、是否安装、置于后台、关闭
1、安装、卸载、是否安装
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #判断应用是否安装 if driver.is_app_installed("com.yunmall.lc"): #卸载 driver.remove_app("com.yunmall.lc") else: #安装 driver.install_app("bain_115.apk") #放置路径,电脑上的路径 #启动设置界面 driver.start_activity("com.android.settings",".Settings") #置于后台 driver.background_app(3) #置于后台3秒 #关闭设置 driver.close_app() #关闭驱动 driver.quit()
2、定位单个元素(使用 uianto 工具截图查看)
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #使用id 定位,定位设置里面的放大镜 driver.find_element_by_id("com.android.settings:id/content_parent").click() #使用class 定位输入 hello driver.find_element_by_id("com.android.EditText").send_keys("hello") #点击返回使用xpath driver.find_element_by_xpath("//*[@class='android.widget.ImageButton]").click() #使用name定位 driver.find_element_by_accessibility_id("搜索设置").click() driver.quit()
3、定位一组元素
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #获取所有 id 为 com.android.settings:id/title 的元素 els = driver.find_elements_by_id("com.android.settings:id/title") for el in els: print(el.text) els = driver.find_element_by_class_name("android.widget.TextView") for el in els: print(el.text) els = driver.find_elements_by_xpath("*[contains(@text,'设')]") for el in els: print(el.text) driver.quit()
二、元素操作
1、元素操作 API
2、获取元素信息 -- 文本、位置、大小
对于 location 的结果为(x,y): x 表示屏幕左边到框左边的距离。y 表示,屏幕上边框到框上方的距离。
所以当获取了文本框的位置和大小后,计算文本框触摸中心点:location.get("x") + size.get("width") 二者的和 除以 2。同理高为 location.get("y") + size.get("height") 除以 2
3、获取元素属性值
记住图片右下方,属性值对应的属性名和实际的 ui 显示不一致,结合代码示例看。
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #获取所有 id 为 com.android.settings:id/title 的元素 els = driver.find_elements_by_id("com.android.settings:id/title") for el in els: print(el.get_attribute("enable")) print(el.get_attribute("text")) print(el.get_attribute("name")) print(el.get_attribute("resourceId")) print(el.get_attribute("className")) driver.quit()
三、手势滑动屏幕
1、滑动(两个坐标点精准滑动)
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) # 滑动 5 屏幕 i = 0 while i <= 5: driver.swipe(920,220,200,200) i += i driver.find_element_by_xpath("//*[text='健康']").click() driver.quit()
2、滚动
origin_el:为滑动开始的元素。 destination_el:滑动结束的元素
scroll 滑动:从一个元素滑动到另一个元素。直到页面自动停止。适合滑动一次的操作(有惯性且很大)
方法:driver.scroll(origin_el,destination_el)
drag_and_drop拖拽:从一个元素滑动到另一个元素,第二个元素替代第一个元素位置。(无惯性)
方法:driver.drag_and_drop(origin_el,destination_el)
from appium import webdriver #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) # 滑动 el1 = driver.find_element_by_xpath("//*[text='健康']") el2 = driver.find_element_by_xpath("//*[text='更多']") #操作滑动 driver.scroll(el1,el2) driver.drag_and_drop(el1,el2) driver.quit()
四、高级手势(TouchAction)
1、轻敲
from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) # 元素 el2 = driver.find_element_by_xpath("//*[text='更多']") #获取实例对象 TouchAction(driver).tap(el2).perform() driver.quit()
2、按下和抬起、长按
from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) # 元素 el2 = driver.find_element_by_xpath("//*[text='更多']") loc = el2.location #按下 TouchAction(driver).press(loc.get("x"),loc.get('y')).perform() driver.quit()
3、移动和九宫格解锁
from time import sleep from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) # 定位WLAN WLAN = driver.find_element_by_xpath("//*[text='WLAN']") #定位应用 app = driver.find_element_by_xpath("//*[text='应用']") #拖拽 driver.drag_and_drop(app,WLAN) #定位安全 security = driver.find_element_by_xpath("//*[text='安全']").click() #点击屏幕解锁方式 way = driver.find_element_by_xpath("//*[text='屏幕解锁方式']").click() #点击图案 picture = driver.find_element_by_xpath("//*[text='图案']").click() #等待页面加载 sleep(2) #绘制解锁图案(记住每个点的坐标) TouchAction(driver).press(x=1048,y=340).wait(100).move_to(x=1374,y=234).wait(100).move_to(x=1374,y=234).wait(100)\ .move_to(x=1374,y=211).wait(100).move_to(x=1374,y=234).wait(100).move_to(x=104,y=234).wait(100) driver.quit()
五、手机操作
1、获取分辨率和截图
获取手机分辨率:driver.get_window_size()
截图:driver.get_screenshot_as_file(fileName)
2、获取和设置手机网络
获取手机网络:driver.network_connection()
设置手机网络:driver.set_network_connection(connection Type) #####connection Type:表示网络类型(用数字代表,去代码底层查看)
from time import sleep from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) # 获取手机网络 print(driver.network_connection) #设置当前网络为飞行模式,(进入底层查看,不同数字代表不同网络类型) driver.set_network_connection(1) #获取屏幕分辨率 print(driver.get_window_size()) #截图 driver.get_screenshot_as_file('./screen.png') driver.quit()
3、手机按键操作
from time import sleep from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #点击3音量键+:24 i = 0 while i<3: driver.press_keycode(24) i += 1 #点击返回 driver.press_keycode(4) #点击2音量键-:25 i = 0 while i<2: driver.press_keycode(25) i += 1 driver.quit()
4、手机通知栏
from time import sleep from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #打开通知栏 driver.open_notifications() #查找信息并点击 driver.find_elements_by_xpath("//*[@text='应用宝.apk']").click() driver.quit()
六、其他延伸
1、获取toast消息(黑底白字的信息)
环境:
需要在默认字典加参数设置
desired_caps["automationName"] = "Uiautomator2"
from time import sleep from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #设置toast消息 desired_caps["automationName"] = "Uiautomator2" #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) #点击未登录 driver.find_elements_by_xpath("//*[@text='未登录']").click() #点击登录 driver.find_elements_by_xpath("//*[@text='登录']").click() #点击微信登录 driver.find_elements_by_xpath("//*[@text='微信登录']").click() #获取toast消息 msg = driver.find_elements_by_xpath("//*[contains(@text,'请先勾选同意')]").text print(msg) driver.quit()
2、切换环境(webView App)测试(进入手机网页像html一样操作,手机页面嵌套了 html)
from time import sleep from appium import webdriver from appium.webdriver.common.touch_action import TouchAction #定义字典变量 desired_caps ={} #字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.1" desired_caps["deviceName"] = "192.168.56.101:5555" desired_caps["appPackage"] = "com.android.settings" desired_caps["appActivity"] = ".Settings" #设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True #设置toast消息 desired_caps["automationName"] = "Uiautomator2" #获取driver driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) driver.implicitly_wait(10) #点击进入HTML页面 msg = driver.find_elements_by_xpath("//*[contains(@text,'记住快乐瞬间')]").click() #获取当前环境 env = driver.context #切换环境 driver.switch_to.context(env[1]) #此时可以用html操作(此时操作需要放浏览器驱动,放到手机或者模拟器) driver.find_elements_by_xpath("//*[@id='index-kw']").send_keys("你好") driver.quit()
3、monkey
monkey 指令
后面的数字是执行 多少次(随机执行步骤次数)
-v -v 是很具体的日志了
monkey指令了解
例如命令执行(缩放指令)100:adb shell monkey -p 执行的应用包名 -v -v --pct-pinchzoom 100 1000 > 电脑上日志保存的文件路径。