一、Appium中定位元素的主要方法:
from appium.webdriver.common.appiumby import AppiumBy
1、通过ID定位
driver.find_element(by=AppiumBy.ID, value="your_resource_id")
2、通过Class Name定位
driver.find_element(by=AppiumBy.ClassName, value="your_class_name")
注:不同的控件可能有相同的类名,因此仅依赖类名定位可能会产生非唯一结果。为了更准确地定位元素,通常建议结合其它属性(如ID、Accessibility ID、XPath等)进行定位。
3、通过Accessibility ID定位
driver.find_element(by=AppiumBy.AccessibilityID, value="your_accessibility_id")
注:通过元素的可访问性标识(Accessibility Identifier)来定位。
value="your_accessibility_id" 是指你想要查找的具体可访问性标识的值。在Android中,这通常对应于元素的contentDescription属性(也可以显式设置accessibilityId属性)。而在iOS中,Accessibility ID直接对应于元素的accessibilityIdentifier属性。
4、通过XPath定位
driver.find_element(by=AppiumBy.XPATH, value="your_xpath")
注:通过XPath路径来定位元素,过于复杂的XPath表达式可能导致定位性能下降,并且随着UI结构的变化,XPath表达式也可能变得不稳定。因此,在编写XPath表达式时,应尽量保持简洁和稳健。
5、通过CSS Selector定位
driver.find_element(by=AppiumBy.CSS_SELECTOR, value="your_css_selector")
例子:定位一个class为'my-class'的div元素,CSS选择器表达式可以写作 '.my-class'
注:通过CSS选择器语法来定位元素,主要在处理Web内容时发挥作用,对于原生移动应用(非Web视图内的元素),通常不适用或者效果有限
6、通过名称定位
driver.find_element(by=AppiumBy.NAME, value="your_name")
注:在原生移动应用中,元素通常不会直接提供属name属性。在处理嵌入在原生应用中的WebView内容时,name
属性定位仍然非常有用。
7、定位多个具有相同ID的元素,例如ID:
driver.find_elements(by=AppiumBy.ID,value="your_resource_id")[2]
二、定位写法区别
可能有小伙伴会疑问,
为什么还有会有这种写法:driver.find_element_by_id("your_resource_id")
那跟我上述的写法有什么区别呢?
driver.find_element(by=AppiumBy.ID, value="your_resource_id"),这种是Appium中基于新的By对象参数化的方式来定位元素,这种方式更加灵活且符合WebDriver规范。它可以方便地替换为其他定位策略,只需改变by后面的参数即可,例如AppiumBy.XPATH、AppiumBy.ACCESSIBILITY_ID等。
driver.find_element_by_id("your_resource_id"),这种是Appium早期或部分文档中展示的传统定位方式,它只定位单个元素,并假设定位策略是通过ID。这种方式已经不再推荐使用,因为在更新版本的Appium中可能会导致错误或不被支持,因为它不符合WebDriver统一的API设计。这种写法简洁明了,易于阅读和理解,但不够灵活,不能直接支持其他定位策略的参数化调用。