一、元素定位操作API
1.定位一个元素
(1)driver.find_element_by_id(值)
传入的参数:resource-id的值
(2)driver.find_element_by_class_name(值)
传入的参数:class的值
(3)driver.find_element_by_xpath(值)
传入的参数:xpath表达式
例:driver.find_element_by_xpath("//*[@content-desc='收起']")
里面的content-desc是定位的类型,收起是值
注:定位到这个值的第一个元素
2.定位一组元素
在1中element变成elements,就可以定位到这个值的所有元素
3.定位元素的注意点
示例
使用find_element_by_xx或者find_elements_by_xx的方法,分别传入一个没有的"特征"会有什么结果?
小结
1.如果使用find_element_by_xx方法,如果传入一个没有的特征,会报NoSuchElementException的错误
2.如果使用find_elements_by_xx方法,如果传入一个没有的特征,不会报错,会返回一个空列表
二、元素等待
1.应用场景
可能由于一些原因,我们想找的元素并没有立刻出来,此是结果直接定位可能会报错,比如以下原因:
1.由于网络速度原因
2.服务器处理请求原因
3.电脑配置原因
2.隐式等待
关键方法:
1.通过driver对象调用implicitly_wait方法
例:driver.implicitly_wait(10) ##意思是在10s内等待定位的元素出现
2.设置超时时间
作用:
1.在设置了超时时间之后,后续所有的定位元素的方法都会在这个时间内等待元素的出现
2.如果出现了,直接进行后续操作
3.如果没有出现,报错:NoSuchElementExcepition
3.显式等待
关键方法:
1.关键类:WebDriverWait
例:
from selenium.webdriver.support.ui import WebDriverWait
#显式等待(对单个定位的元素)
click_agree = WebDriverWait(driver,5,1).until(lambda x:x.find_element_by_id("com.taobao.taobao:id/provision_positive_button"))#寻找同意按钮
#5代表等待5秒,1代表每1秒寻找一次元素,不填1则默认为0.5秒寻找一次元素
click_agree.click()#点击同意按钮
2.关键方法:WebDriverWait对象中的until的方法
作用:
1.在设置了显示等待之后,可以等待一个超时时间,在这个超时时间之内进行查找,默认每0.5秒找一次
2.0.5秒的频率是可以设置的
3.一但找到这个元素,直接进行后续操作
4.如果没有找到,报错:TimeOutException
三、元素操作API
1.点击元素操作
关键方法:
click()
例;
driver.find_element_by_id("com.taobao.taobao:id/provision_positive_button").click()
2.对输入框进行文字输入操作
关键方法:
send_keys("要输入的文字")
例:
driver.find_element_by_id("com.taobao.taobao:id/provision_positive_button").send_keys("要输入的文字")
注意点:
默认输入中文是有问题的,需要在连接手机的参数中加多两行代码
desired_caps['unicodeKeyboard'] = True # 使用unicodeKeyboard的编码方式来发送字符串
desired_caps['resetKeyboard'] = True # 将键盘给隐藏起来
3.对输入框进行文字的清空操作
关键方法:
clear()
4.获取元素的位置和大小
search_button = driver.find_element_by_id("xxxxx")
print(search_button.location) #获取这个元素的X和y轴坐标
print(search_button.location["x"])#获取这个元素的x轴坐标
print(search_button.location["y"])#获取这个元素的y轴坐标
print(search_button.size)#获取这个元素图标的宽高
print(search_button.size["width"])#获取这个元素图标的宽
print(search_button.size["high"])#获取这个元素图标的高
注意点
1.location和size最后获得的都是一个字典,前者key为x和y,后者key为width和high
2.获取的数据类型都是int
5.获取元素的属性值
关键方法:
get_attribute("value")
eles = driver.find_element_by_id("xxxxx")
for i in eles:
print(i.get_attribute("enabled"))#获取这个元素属性名为enabled的属性值
print(i.get_attribute("clickable"))#获取这个元素属性名为clickable的属性值
注意点
填入get_attribute("value")
value = 'text'返回text的属性值
value = 'name'返回content-desc/text属性值
value = 'className'返回class属性值,只有API ==> 18才支持
value = 'resourceId'返回resource-id属性值,只有API ==> 18才支持
四、滑动和拖拽事件
1.swipe滑动事件
概念:
从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
方法名
参数:
start_x: 起点x轴坐标
start_y: 起点y轴坐标
end_x: 终点x轴坐标
end_y: 终点y轴坐标
duration: 滑动这个操作一共持续的时间长度,单位:ms
driver.swipe(start_x,start_y,end_x,end_y,duration=None)
注意点
时间越长,惯性越小
时间越短,惯性越大
2.scroll滑动事件
概念
从一个元素滑动到另一个元素,直到页面自动停止
方法名
参数
origin_el: 滑动开始的元素
destination_el: 滑动结束的元素
driver.scroll(orgin_el,destination_el)
示例
save_button = driver.find_element_by_id("xxx")
more_button = driver.find_element_by_id("xxx")
driver.scroll(save_button,more_button)
3.drag_and_drop拖拽事件
和scroll方法相似
方法名
参数
origin_el: 滑动开始的元素
destination_el: 滑动结束的元素
driver.drag_and_drop(orgin_el,destination_el)
五、高级手机TouchAction
注意:先导入包
from appium.webdriver.common.touch_action import TouchAction
使用步骤
1.创建TouchAction对象
2.通过对象调用想执行的手势
3.通过perform()执行操作
1.手指轻敲操作
应用场景
模拟手指对某个元素或坐标按下并快速抬起。比如,固定点击(100,100)的位置
方法名
参数
element: 元素
x: x坐标
y: y坐标
TouchAction(driver).tap(element=None,x=None,y=None).perform()
示例
方法一:
TouchAction(driver).tap(x=453,y=1104).perform() #用坐标轻敲点击
方法二:
ele = driver.find_element_by_id("com.taobao.taobao:id/provision_positive_button")
TouchAction(driver).tap(element=ele).perform()#用元素定位轻敲点击
2.按下和抬起操作
应用场景
模拟手指一直按下,模拟手指抬起。可以用来组合撑轻敲或者长按的操作
方法名
模拟手指对元素或者坐标按下操作
参数
element: 元素
x: x坐标
y: y坐标
TouchAction(driver).press(element=None,x=None,y=None).perform()
模拟手指对元素或者坐标抬起操作
TouchAction(driver).release().perform()
示例:
TouchAction(driver).press(x=453,y=1104).perform() #按下
time.sleep(3) #停3秒
TouchAction(driver).release().perform() #抬起
3.等待操作
应用场景
模拟手指等待,比如按下后等待5秒之后再抬起
方法名
模拟手指暂停的操作
参数
ms: 暂停的毫秒数
TouchAction(driver).wait(ms=0).perform()
示例
TouchAction(driver).press(x=453,y=1104).wait(3000).release().perform()
4.长按操作
应用场景
模拟手指对元素或坐标的长按操作。比如,长按某个按钮弹出菜单
方法名
参数
element: 元素
x: x坐标
y: y坐标
duration 长按时间,毫秒
TouchAction(driver).long_press(element=None,x=None,y=None,duration=1000).perform()
示例
TouchAction(driver).long_press(x=453,y=1104,duration=1000).release().perform()
5.移动操作
应用场景
模拟手指移动操作,比如,手势解锁需要先按下,再移动
方法名
element: 元素
x: x坐标
y: y坐标
TouchAction(driver).move_to(element=None,x=None,y=None).perform()
示例
图案解锁
TouchAction(driver).press(x=453,y=1104).move_to(x=897,y=987).move_to(x=665,y=897).release().perform()
六、手机操作API
1.获取手机分辨率
应用场景
自动化测试可能会需要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标
方法名
driver.get_window_size()
示例
print(driver.get_window_size())
2.手机截图
应用场景
有些自动化操作可能没有反应,但并不报错,此时我们就可以将操作过后的关键情况,截图留存,后期也可以根据图片发现问题。
方法名
参数
filename: 指定路径下,指定格式的图片
get_screenshot_as_file(filename)
示例
driver.get_screenshot_as_file(D:\android-sdk\screen.jpg)
3.获取手机网络
属性名
driver.network_connection
示例
print(driver.network_connection)
4.设置当前网络
示例
driver.network_connection(1)
#看函数方法,1则为飞行模式
延伸
from appium.webdriver.connectiontype import ConnectionType
#判断有没有用流量
if driver.network_connection == ConnectionType.DATA_ONLY:
print(1)
else:
print(0)
5.发送键到设备
方法名
参数
keycode: 发送给设备的关键代码
metastate: 关于背发送的关键代码的元信息,一般为默认值
driver.press_keycode(keycode,metastate=None)
注意点
按键对应的编码,可以在百度搜索关键字“android keycode”
示例
#点击三次音量加,再点击返回
driver.press_keycode(24)
driver.press_keycode(24)
driver.press_keycode(24)
driver.press_keycode(4)
6.操作手机的控制栏
方法名
driver.open_notifications()