自动化测试最基础的就是元素定位,找到牢靠的定位方式,可以增强自动化测试框架的兼容性。
driver.find_element_by_id('com.example.zhuowendi.demotest:id/btn_rv')
driver.find_element_by_name('recyclerview')
driver.find_element_by_class_name('android.widget.Button')
driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.Button')
在 Android 上,主要使用元素的content-desc属性,如该属性为空,不能使用此定位方式。
在 iOS 上,主要使用元素的label或name(两个属性的值都一样)属性进行定位,如该属性为空,也是不能使用该属性。
由于相同app在不同的手机上元素的属性会发生变化,所以推荐使用此定位方式实现精准定位,只是需要在代码中为元素添加content-desc属性。
driver.find_element_by_accessibility_id('***')
由于一开始对python语法的入门是爬数据,所以在没有特殊情况时,个人更偏向使用xpath定位元素。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
###xpath与text相结合:
driver.find_element_by_xpath("//*[@text='recyclerview']")
###xpath与id结合:
driver.find_element_by_xpath("//*[@resource-id='com.example.zhuowendi.demotest:id/btn_rv']")
###xpath与class结合:
driver.find_element_by_xpath("//*[@class='android.widget.Button']")
###通过父元素定位子元素:
driver.find_element_by_xpath("//*[@resoure-id="android:id/content"]/android.widget.LinearLayout")
###通过子元素定位父元素:
driver.find_element_by_xpath("//*[@resource-id="com.example.zhuowendi.demotest:id/btn_rv"]/..")
driver.find_element_by_xpath("//*[@resource-id="com.example.zhuowendi.demotest:id/btn_rv"]/parent::*")
driver.find_element_by_xpath("//*[@resource-id="com.example.zhuowendi.demotest:id/btn_rv"]/parent::android.widget.LinearLayout")
以此扩展,可以通过多层级关系定位到元素。
若path路径相同的元素有多个,可以通过添加下标来筛选第几个元素。
###定位第一个button按钮:
driver.find_element_by_xpath("//android.widget.Button[1]")
###定位列表下的全部列表项:
items = driver.find_elements_by_xpath("//android.support.v7.widget.RecyclerView/*[@class='android.widget.TextView']")