持续更新,appium控制真机与模拟器自动化操作
封装公共模块、元素定位骚操作,喜欢的可以点个关注与收藏。
前夕
# adb命令
安装测试包
adb install D:\appium_app\ss.apk
屏幕截图
$ adb shell screencap /sdcard/screen.png
adb pull /sdcard/screen.png C:\Users\Shuqing\Desktop
查看链接设备
adb devices
指定连接
adb connect xxx
获取Activity
aapt dump badging D:\appium_app\ss.apk | find "launchable-activity"
aapt dump badging xxxx.apk
adb shell
dumpsys activity | grep mFocusedActivity
desired_caps['appPackage'] = 'com.tal.kaoyan'
desired_caps['appActivity'] = 'com.tal.kaoyan.ui.activity.SplashActivity'
第一种、常规做法 **adb unauthorized**
1.1 杀掉adb服务 :adb kill-server
1.2 到开发者设置中,撤销usb调试权限。
1.3 关闭usb调试开关,拔掉数据线。
1.4 打开usb调试权限,插入数据线。
1.5 重启adb服务:adb start-server,或者adb devices ,注意:手机上的授予权限弹窗,授予权限后,重新执行adb devices。
若第一种方式按照步骤执行完成后,还是无法授予权限,显示unauthorized。可以尝试第二种方式。
第二种:
查看Android设备的vid和pid方式
adb shell
查看VID:(oppo1:22d9)
cat /sys/class/android_usb/android0/idVendor
查看PID:(oppo2:276c)
cat /sys/class/android_usb/android0/idProduct
在PC端~/.android/目录下新建adb_usb.ini文件,有则不用新建。
打开输入VID
参考:https://blog.csdn.net/WOAIWOJIAWEIHAO150/article/details/117222072?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166304660716782395395610%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166304660716782395395610&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-117222072-null-null.142^v47^pc_rank_34_2,201^v3^control_1&utm_term=adb%20unauthorized&spm=1018.2226.3001.4187
1.连接Android真机
def appium_desired():
desired_caps={}
desired_caps['platformName'] = 'Android'
desired_caps['deviceName'] = '手机型号'
desired_caps['platformVersion'] = '7.1.1' # Android版本
desired_caps['appPackage'] = 'com.tal.kaoyan'
desired_caps['appActivity'] = 'com.tal.kaoyan.ui.activity.SplashActivity'
# 输入中文配置
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
desired_caps['noReset']=True # 每次打开纯机版app
driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps)
driver.implicitly_wait(8)
return driver
2.连接模拟器
desired_caps={}
desired_caps['platformName'] = 'Android'
desired_caps['deviceName'] = '127.0.0.1:62001'
desired_caps['platformVersion'] = '7.1.2'
desired_caps['app'] = r'D:\appium_app\kaoyan3.1.0.apk'
desired_caps['appPackage'] = 'com.tal.kaoyan'
desired_caps['appActivity'] = 'com.tal.kaoyan.ui.activity.SplashActivity'
desired_caps['noReset']='True'
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(5)
3.连接IOS真机
在这里插入代码片
4.连接IOS真机
在这里插入代码片
5.元素定位
ID、Class、Name,基础的都会操作,css与xpath定位不容易定位的坐标
参考
from appium import webdriver
from selenium.webdriver.common.by import By
driver.find_element_by_accessibility_id()
driver.find_element(By.XPATH, '//*[@class="android.widget.EditText" and @index="3"]').send_keys('zxw123456')
driver.find_element(By.XPATH, "//*[@text='']")
driver.find_element(By.XPATH, "//*[@resource-id='']")
driver.find_element(By.XPATH, "//*[@class='']")
driver.find_element(By.XPATH, "//*[contains(@text='取消')]")
driver.find_element(By.XPATH, "//*[@text='搜索' and @resource-id='search']")
driver.find_element(By.XPATH, "//*[@text='搜索'/..]")
6.获取元素属性
driver.find_element(MobileBy.XPATH, "//*[@resource-id='']").click()
driver.find_element(MobileBy.XPATH, "//*[@='']").send_keys('')
# 获取 text属性
driver.find_element(MobileBy.XPATH, "//*[@='']").get_attribute('text')
# 获取其他属性 如:class、resource-id、content-desc
driver.find_element(MobileBy.XPATH, "//*[@='']").get_attribute('class')
...
# 获取源码
driver.page_sourc
7.滑动
def get_size():
x=driver.get_window_size()['width']
y=driver.get_window_size()['height']
return x,y
def swipeLeft():
l=get_size()
x1=int(l[0]*0.9)
y1=int(l[1]*0.5)
x2=int(l[0]*0.1)
driver.swipe(x1,y1,x2,y1,1000)
def swipeUp():
l = get_size()
x1 = int(l[0] * 0.5)
y1 = int(l[1] * 0.95)
y2 = int(l[1] * 0.35)
driver.swipe(x1, y1, x1, y2, 1000)
def swipeDown():
l=get_size()
x1 = int(l[0] * 0.5)
y1 = int(l[1] * 0.35)
y2 = int(l[1] * 0.85)
driver.swipe(x1, y1, x1, y2, 1000)
def swipeRight():
l=get_size()
y1 = int(l[1] * 0.5)
x1 = int(l[0] * 0.25)
x2 = int(l[0] * 0.95)
driver.swipe(x1, y1, x2, y1, 1000)
8.python
方法:press() 开始按压一个元素或坐标点(x,y)。通过手指按压手机屏幕的某个位置。 press也可以接收屏幕的坐标(x,y)。
press(self, el=None, x=None, y=None)
TouchAction(driver).press(x=0,y=308)
长按
方法:longPress() 开始按压一个元素或坐标点(x,y)。 相比press()方法,longPress()多了一个入参,既然长按,得有按的时间吧。duration以毫秒为单位。1000表示按一秒钟。其用法与press()方法相同。
long_press(self, el=None, x=None, y=None, duration=1000)
点击
方法:tap() 对一个元素或控件执行点击操作。用法参考press()。
tap(self, element=None, x=None, y=None, count=1)
移动
方法:move_to() 将指针从上一个点移动到指定的元素或点。
move_to(self, el=None, x=None, y=None)
注意:
移动到目位置有时是算绝对坐标点,有时是基于前面一个坐标点的偏移量,这个要结合具体App来实践。
暂停
方法:Wait()
wait(self, ms=0)
暂停脚本的执行,单位为毫秒。
释放
方法release() 结束的行动取消屏幕上的指针。
release(self)
执行
perform() 执行的操作发送到服务器的命令操作。
perform(self)
#连续滑动两次设置图案密码
for i in range(2):
TouchAction(driver).press(x=243,y=381).wait(2000)\
.move_to(x=455,y=390).wait(1000)\
.move_to(x=643,y=584).wait(1000)\
.move_to(x=647,y=784).wait(1000)\
.release().perform()