Xpath定位是appium中最重要的一种定位方式,也是一种万能的定位方法,如果元素id是唯一的,xpath可以利用id属性定位;如果text属性是唯一的,xpath可以结合text属性定位 ;如果class属性唯一,xpath可以利用class属性定位。xpath也可以组合定位,如果一个元素有2个属性,通过xpath可以同时匹配两个属性,text,id,class等这些属性都能够任意组合定位。Xpath也可用实现层级定位,如果一个元素,除了class属性(class属性是一定会有的)其它属性都没有,这个时候可以找到它父元素,通过父元素定位子元素
1.Xpath利用id定位
如果元素id属性是唯一的,可以通过id属性定位 //*[@resource-id=’id属性’]
find_element_by_xpath(“//*[@resource-id=’xxx’]”)
find_elements_by_xpath(“//*[@resource-id=’xxx’]”)
示例:
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
element=driver.find_element_by_xpath("//*[@resource-id='com.ss.android.article.news:id/c0k']")
#element = driver.find_element_by_id('com.ss.android.article.news:id/bzw')
except NoSuchElementException:
print("没有找到这个摄像元素")
else:
print("已经找到这个摄像元素了,点击他")
element.click()
当有多个元素的id值相同时,可以使用find_elements_by_xpath进行查找,使用的时候要加上角标
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
#element=driver.find_element_by_xpath("//*[@resource-id='com.ss.android.article.news:id/c0k']")
#element = driver.find_element_by_id('com.ss.android.article.news:id/bzw')
elements=driver.find_elements_by_xpath("//*[@resource-id='com.ss.android.article.news:id/uh']")
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击第一个")
elements[1].click() #使用角标,点击第一个
2.Xpath利用text定位
text属性定位 如果元素text属性是唯一的,可以通过text文本定位
//*[@text=’text文本属性’]
find_element_by_xpath(“//*[@text=’xxx’]”) #通过文本属性xxx定位元素
示例:
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
#element=driver.find_element_by_xpath("//*[@resource-id='com.ss.android.article.news:id/c0k']")
#element = driver.find_element_by_id('com.ss.android.article.news:id/bzw')
#elements=driver.find_elements_by_xpath("//*[@resource-id='com.ss.android.article.news:id/uh']")
element=driver.find_element_by_xpath("//*[@text='西瓜视频']")
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
3.Xpath利用class属性定位
如果class属性唯一的话,可以通过class属性定位
dirver.find_element_by_xpath(“//*[@class='class属性值']”)
示例:
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
element=driver.find_element_by_xpath("//*[@class='android.widget.LinearLayout']")
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
4.Xpath利用content-desc定位
dirver.find_element_by_xpath(“//*[@content-desc='desc的文本']”)
示例:
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
element=driver.find_element_by_xpath("//*[@content-desc='关注']")
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
5.Xpath contains 模糊定位
对于一个元素,其 content-desc属性、text属性、id属性、class属性不是固定的,但是有一部分是固定的,这种可以使用模糊定位。
//*[contains(@text,”text属性”)]
//*[contains(@content-desc,”content-desc属性”)]
//*[contains(@resource-id,”id属性”)]
//*[contains(@class,”class属性”)]
(PS:如果属性值有中文的话,属性值用双引号)
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
element=driver.find_element_by_xpath('//*[contains(@text,"西瓜")]') #不需要把元素text属性西瓜视频的全称写全也能找到
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
element=driver.find_element_by_xpath('//*[contains(@content-desc,"抗击")]')
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
6.Xpath组合定位
如果一个元素有2个以上属性,通过xpath可以同时匹配2个属性进行组合定位,text、resource-id、class、index、contend-desc这些属性都能够任意组合定位。
<1>通过id和class属性定位
id_class='//class属性[@resource-id="id属性值"]'
driver.find_element_by_xpath(id_class).click()
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
id_class='//android.widget.ImageView[@resource-id="com.ss.android.article.news:id/c0k"]'
element=driver.find_element_by_xpath(id_class)
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
<2>text和index属性定位
text_index=’//*[@text=”text属性值” and @index=”index属性值”]’
driver.find_element_by_xpath(text_index).click()
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
text_index='//*[@text="西瓜视频" and @index="1"]'
element=driver.find_element_by_xpath(text_index)
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
<3>class和text属性定位
class_text=’//class属性值[@text=”text属性值”]’
driver.find_element_by_xpath(class_text)
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
class_text='//android.widget.TextView[@text="西瓜视频"]'
element=driver.find_element_by_xpath(class_text)
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
<4>class和index属性定位
class_index='//class属性值[@index="xx"]'
element= driver.find_element_by_xpath(class_index)
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
class_index='//android.widget.LinearLayout[@index="2"]'
element=driver.find_element_by_xpath(class_index)
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
7.Xpath层级定位
如果一个元素只有class属性(class属性肯定会有),其它属性都没有,这种情况上面的方法就不适用了,这个时候可以通过父元素定位子元素,当然也可以通过子元素定位到父元素
<1>通过父元素定位子元素
father_sun=’//*[@resource-id=”父元素id属性”]/子元素class属性’
driver.find_element_by_xpath(father_sun)
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
#通过父元素的id找到父元素,然后再通过子元素的class属性找到子元素
father_sun='//*[@resource-id="com.ss.android.article.news:id/uh"]/android.widget.TextView'
element=driver.find_element_by_xpath(father_sun)
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()
<2>通过子元素定位父元素
通过子元素定位父元素,子需要再子元素后加两个点
sun_father =’//*[@resource-id=”父元素id属性”]/..’
driver.find_element_by_xpath(sun_father)
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
def android_driver():
desired_cap={}
desired_cap['platformName']="Android"
desired_cap['platformVersion']='8.1.0'
desired_cap['deviceName']='HONOR9X'
desired_cap['udid']='5fb5c4cc' #ip或者设备好
desired_cap['appPackage']='com.ss.android.article.news' #要启动的应用包名
desired_cap['appActivity']='com.ss.android.article.news.searchIcon2' #要启动的应用activity
desired_cap['noReset']=True #不需要重新登录
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_cap)
return driver
if __name__=="__main__":
driver=android_driver()
time.sleep(10)
try:
#通过子元素的id,定位到其父元素
sun_father='//*[@resource-id="com.ss.android.article.news:id/c0k"]/..'
element=driver.find_element_by_xpath(sun_father)
except NoSuchElementException:
print("没有找到这个元素")
else:
print("已经找到这个元素了,点击他")
element.click()