webdriver 提供了八种元素定位方法:
id
name
class name
tag name
link text
partial link text
xpath
css selector
在 Python 语言中对应的定位方法如下:
find_element(s)_by_id()
find_element(s)_by_name()
find_element(s)_by_class_name()
find_element(s)_by_tag_name()
find_element(s)_by_link_text()
find_element(s)_by_partial_link_text()
find_element(s)_by_xpath()
find_element(s)_by_css_selector()
Appium 完全继承了 WebDriver 中所定义的这些方法,除此之外对其进行了扩展,以便适合移动端对象的定位与操作
定位的工具:
uiautomatorviewer.bat:Android SDK自带的一个工具,在tools目录下
monitor:Android SDK自带的一个工具,在tools目录下
Appium Inspector:Appium自带的一个功能,只有mac下可以使用该功能
定位详解:
通过id定位——(取resource-id的值):
driver.find_element_by_id(“com.taobao.taobao:id/button_cart_charge”)
也可以直接用id后面的内容driver.find_element_by_id(“button_cart_charge”)
通过class_name定位——(取class的内容)
driver.find_element_by_class_name(“android.widget.Button”)
通过accessibility_id定位——(取content-desc的内容)
driver.find_element_by_accessibility_id(“结算”)
通过text定位——(需要使用android_uioutomater的定位方式,使用text的内容)
driver.find_elements_by_android_uiautomator(‘new UiSelector().text(“关注”)’) --纯文本定位
driver.find_element_by_android_uiautomator(‘new Uiselector().resourceId(“com.taobao.taobao:id/button_cart_charge”).text(“关注”)’) --id和text组合定位
使用这里需要注意一下,通过text定位的结果是个list,不能直接click。所以如果要点击需要取数组的值,比如下面是点击找到的第一个元素
driver.find_elements_by_android_uiautomator(“new UiSelector().text(‘关注’)”)[0].click()
通过xpath定位–(class为元素的类别)
driver.find_element_by_xpath("//android.widget.Button//[@text=‘关注’]")----与web定位有区别,web为//标签名//[text(),“关注”]
2.定位元素的另一种写法:
需要导入这个包:from selenium.webdriver.common.by import By
ele=(By.ID,“XXXX”)
driver.find_element(*ele).click
例如:定位id为age的元素
方式一:driver.find_element_by_id("age”)
方式二:driver.find_element(By.ID,“age”)
这个操作的好处是可以直接把操作的by和value放到一个元组里,然后调用通用方法来传参获得元素结果
agg=(By.ID,“age”)
driver.find_element(*agg).click()
by的操作可以是:
By.ID 相当于by_id
By.CLASS_NAME 相当于by_class_name
By.XPATH 相当于by_xpath
By.NAME 相当于by_name
By.TAG_NAME 相当于by_tag_name
By.CSS_SELECTOR 相当于by_css_selector
By.LINK_TEXT 相当于by_link_text
3.find_elements_by_定位方式(value)返回元素数组
用法与find_element_by_方式(value)一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果
例如:通过class_name定位到多个元素,我想点击第一个元素
driver.find_elements_by_class_name("android.widget.RelativeLayout”)[0].click()
4.返回元素数组的另一种写法:find_elements(by,value)
用法与find_element(by,value)一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果
例如:通过class_name定位到多个元素,我想点击第一个元素
driver.find_elements(By.CLASS_NAME,"android.widget.RelativeLayout”)[0].click()