启动app:
在一个app界面跳转其他app:
通过driver对象调用start_activity
driver.start_activity("包名","界面名")
当前包名和界面名:
driver.current_package
driver.current_activity
判断是否安装app:
driver.is_app_installed("com.google.android.youtube")
卸载app:
driver.remove("com.google.android.youtube")
安装app:
driver.install_app("/Users/com.google.android.youtube.apk")
将页面置于后台一段时间后再回到前台(模拟按home键进行热启动):
driver.background_app(seconds=10) #单位s,会自动回到前台
UIAutomatorViewer(或使用appium inspector)
可用于定位元素,在sdk下
mac:tools/bin 其实我没在sdk下找到tools文件夹,所以还是用appium inspector
元素定位API
driver.find_element_by_id('id')
# 现在一般用下面这种形式
driver.find_element(by=By.ID, value='id')
定位并点击
search_button = driver.find_element_by_id("id")
search_button.click()
输入文本
search_button.send_keys("hello")
重新输入用户名
username_input.click()
username_input.clear()
username_input.send_keys(username)
定位一组元素时使用find_elements,可批量获取某些相同特征的元素
元素等待:由于加载速度慢等原因,不能立刻通过find_element方法获取到元素,需要等待元素出现才能获取。
隐式等待:
所有定位元素等待的时间设置为同一个值时。若要设置在5s内找到就立刻点击,找不到就报错:
driver.implicitly_wait(5)
driver.find_element(by=By.ID, value='id')
但隐式等待设置一次对所有元素定位生效,若想针对不同元素设置不同的等待时间,则需要进行显示等待:
from selenium.webdriver.support.wait import WebDriverWait
# 调用WebDriverWait类,设置超时时间为5s
wait = WebDriverWait(driver, 5)
# until函数内传的是方法,默认每隔0.5s调用一次该方法,直到找到元素为止
back_button = wait.until(lambda x: x.find_element(by=By.ID, value='com.youtobe.id.int:id/btn'))
back_button.click()
# 一般写时将上几行代码精简(使用显示等待,在5s的时间内每1s找一次):
WebDriverWait(driver, 5, 1).until(lambda x: x.find_element(by=By.ID, value='com.youtobe.id.int:id/btn')).click()
获取文本内容:
title = driver.find.element(**).text()
获取元素位置和大小:
location = driver.find.element(**).location
size = driver.find.element(**).size
获取元素属性值:
title = driver.find_element(**)
title.get_attribute('enabled')
title.get_attribute('text')
滑动屏幕(有三种方法):
1)swipe:从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
driver.swipe(start_x, start_y, end_x, end_y, duration=None)
为什么每次滑动都会有一定的误差(即两次滑动的距离不完全相同):
cpu计时器会受其它运行程序的影响
2)scroll:从一个元素滑动到另一个元素,直到页面自动停止(不设置持续时间,惯性很大)
3)drag_and_drop:从一个元素滑动到另一个元素,直到第二个元素替换掉第一个元素所在的位置(不设置持续时间,没有惯性)
高级手势TouchAction
步骤:
1)创建TouchAction对象
2)通过对象调用想要执行的手势
3)使用perform()执行
手指轻敲:
from appium.webdriver.common.touch_action import TouchAction
ele = driver.find_element(by=By.ID, value='com.youtobe.id.int:id/btn')
TouchAction(driver).tap(ele).perform()
# 使用TouchAction可以点击任意坐标上的一点(click无法做到)
TouchAction(driver).tap(x=100, y=100).perform()
# tap还可传入次数,默认为单击,count = 1;当想要双击时,count = 2
TouchAction(driver).tap(x=100, y=100, count=2).perform()
按下:
TouchAction(driver).press(x=100, y=100).perform()
按下后抬起:
TouchAction(driver).press(x=100, y=100).release().perform()
按下后等待并抬起:
TouchAction(driver).press(x=100, y=100).wait(2000).release().perform()
# 相当于长按
长按:
TouchAction(driver).long_press(x=100, y=100, duration=2000).perform()
移动(可用于图案解锁):
TouchAction(driver).press(x=100, y=100).move_to(x=200, y=200).release().perform()
手机操作API
获取手机分辨率:
driver.get_window_size()
截图并保存:
driver.get_screenshot_as_file(os.getcwd() + os.sep + './screen.png')
获取手机网络:
driver.network_connection()
设置手机网络:
driver.set_network_connection(1) # 设置为飞行模式
发送键到设备:
操作手机通知栏: