这几天将python的运行库都更新了一下,结果发现用appium进行安卓测试时driver.find_elements_by_*类型的方法均无法使用,提示driver没有这个方法。查了一下原因,大概是Selenium 4.0不再支持find_elements_by_*方法,基于这个库之上的Appium-Python-Client自然也不再支持此类方法。
现在,appium只支持find_element(by,value)和find_elements(by,value)这两种定位方法,关键就在于by的值有哪些,通过阅读源代码,发现大概有两类,在这里整理一下。
第一类是继承Selenium库中的by值,在selenium.webdriver.common.by文件中,可以看到by值有以下几种:
class By:
"""
Set of supported locator strategies.
"""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
所以此时我们可以将原来的find_elements_by_*替换如下:
# 1.driver.find_element_by_id
driver.find_element("id","android:id/button2").click()
# 2. driver.find_element_by_xpath
driver.find_element("xpath",r'//android.widget.FrameLayout[@content-desc="文本"]').click()
# 以此类推......
第二类是appium封装其他库的接口(比如uiautomator2),在appium.webdriver.common.appiumby文件中,可以看到by值有以下几种:
from selenium.webdriver.common.by import By
class AppiumBy(By):
IOS_PREDICATE = '-ios predicate string'
IOS_UIAUTOMATION = '-ios uiautomation'
IOS_CLASS_CHAIN = '-ios class chain'
ANDROID_UIAUTOMATOR = '-android uiautomator'
ANDROID_VIEWTAG = '-android viewtag'
ANDROID_DATA_MATCHER = '-android datamatcher'
ANDROID_VIEW_MATCHER = '-android viewmatcher'
# Deprecated
WINDOWS_UI_AUTOMATION = '-windows uiautomation'
ACCESSIBILITY_ID = 'accessibility id'
IMAGE = '-image'
CUSTOM = '-custom'
使用方法也是一样的,比如:
# find_element_by_android_uiautomator
driver.find_element('-android uiautomator','new UiSelector().text("全部")').click()