一、元素的常用方法
点击:element.click()
输入操作:element.send_keys(‘python’)
设置元素的值:element.set_value(‘java’)
清除操作:element.clear()
是否可见:element.is_displayed(),返回True或者False
是否可用:element.is_enabled(),返回True或者False
是否被选中:element.is_selected(),返回True或者False
获取属性值:get_attribute(name)
get_attribute() 可以获取的属性
resource-id/resourceld 返回 resource-id(API=>18 支持)
text 返回 text
class 返回 class(API=>18 支持)
content-desc/contentDescription 返回 content-desc 属性
checkable,checked,clickable,enabled,focusable,focused,{long-clickable,longClickable), package, password,scrollable,selection-start,selection-end,selected,bounds,displayed,contentSize 返回 true or false
二、元素的常用属性
获取元素文本:element.text
获取元素坐标:element.location,结果{‘y’:19,‘x’:66}
获取元素尺寸:element.size,结果:{’width‘:500,’height‘:33}
三、示例
打开 demo.apk
点击 Animation 进入下个页面
点击 Seeking 进入下个页面
查看【RUN】按钮是否显示/是否可点击
查看【滑动条】是否显示/是否可用/是否可点击
获取【滑动条】长度
点击【滑动条】中心位置
import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
class TestSleep:
def setup(self):
# 创建一个字典,desirecapility
caps = {}
# 系统
caps["platformName"] = "Android"
# 设备名称
caps["deviceName"] = "ApiDemos"
# 包安卓包名和页面名;获取
# windows:adb logcat ActivityManager:I | findstr "cmp"
caps["appPackage"] = "io.appium.android.apis"
caps["appActivity"] = ".ApiDemos"
# todo 保留登录信息
caps["noReset"] = "true"
caps["ensureWebviewsHavePages"] = True
# 创建driver,与appium server建立连接,返回一个session
# todo driver变成self.driver由局部变量变成实例变量,然后就可以在其他的方法中引用这个变量了
self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
self.driver.implicitly_wait(5)
def teardown(self):
pass
def test_seeking(self):
'''
打开demo.apk
1、点击Animation进入下一个页面
2.点击Seeking 进入下个页面
3、查看[RUN]按钮是否显示/是否可点击
4、查看[滑动条]是否显示/是否可用/是否可点击
5、获取[滑动条]长度
6、点击[滑动条]中心位置
:return:
'''
self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,"Animation").click()
self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,"Seeking").click()
run_element=self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,"Run")
run_is_displayed=run_element.is_displayed()
run_is_clickable=run_element.get_attribute("clickable")
print(f"[run]按钮是否可见:{run_is_displayed}")
print(f"[run]按钮是否可点击:{run_is_clickable}")
#4、查看[滑动条]是否显示/是否可用/是否可点击
seekbar_element=self.driver.find_element(AppiumBy.ID,"io.appium.android.apis:id/seekBar")
seekbar_displayed=seekbar_element.is_displayed()
seekbar_enabled=seekbar_element.is_enabled()
seekbar_clickable=seekbar_element.get_attribute("clickable")
print(f"[滑动条]按钮是否可见:{seekbar_displayed}")
print(f"[滑动条]按钮是否可用:{seekbar_enabled}")
print(f"[滑动条]按钮是否可点击:{seekbar_clickable}")
#5、获取[滑动条]长度
seekbar_size=seekbar_element.size
width=seekbar_size.get("width")
height=seekbar_size.get("height")
print(f"seekbar的长为{width}")
seekbar_location=seekbar_element.location
x=seekbar_location.get("x")
y=seekbar_location.get("y")
#6、点击[滑动条] 中心位置
seekbar_centerx=x+width/2
seekbar_centery=y
self.driver.tap([(seekbar_centerx,seekbar_centery)])
time.sleep(5)
三、面试题:元素定位不到是什么原因?
定位不正确:在定位工具中先测试定位表达式是否正确
存在动态 ID:定位方式使用 css 或者 xpath 的相对定位
页面还没有加载完成:添加等待验证,使用显示等待或隐式等待进行优化
web页面有 iframe:切换到 iframe 后定位
web页面切换 window :切换到对应窗口后定位
要定位元素为隐藏元素:使用 js 操作该元素
定位的元素被遮挡:将遮挡的元素添加到黑名单中
四、使用等待机制的场景
场景:
控件动态出现
控件出现特定特征
解决:
元素定位结合隐式等待与显式等待
五、App toast 提示框定位
场景:
app toast 提示框
解决:
使用 driver.page_source 拿到页面布局结构文件,分析 toast/弹框组件的标签内容,
然后通过 id/text/class 等属性,使用 xpath 完成元素定位
结合 隐式等待
六、下拉框/日期控件定位
场景:
<input>
标签组合的下拉框无法定位
<input>
标签组合的日期控件无法定位
解决:
面对这些元素,我们可以引入 JS 注入技术来解决问题。
七、文件上传定位
场景:
input 标签文件上传
解决:
input 标签直接使用 send_keys()方法