6.Appium Xpath定位方式大全

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()
原创文章 98 获赞 339 访问量 56万+

猜你喜欢

转载自blog.csdn.net/MATLAB_matlab/article/details/105808081