新聞中心
前段時(shí)間因項(xiàng)目需要,學(xué)習(xí)Selenium進(jìn)行自動(dòng)測試。現(xiàn)在總結(jié)整理下Selenium中元素定位的方法,希望可以幫助一些有疑問的朋友。
東烏珠穆沁網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,東烏珠穆沁網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為東烏珠穆沁千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個(gè)售后服務(wù)好的東烏珠穆沁做網(wǎng)站的公司定做!
自動(dòng)化測試步驟 :
定位元素→操作元素→驗(yàn)證操作結(jié)果→記錄測試結(jié)果
在自動(dòng)化測試過程中,測試程序通常的操作頁面元素步驟找到Web的頁面元素,并賦予到一個(gè)存儲對象中 (WebElement)對存儲頁面元素的對象進(jìn)行操作,例如:點(diǎn)擊鏈接,在輸入框中輸入字符等,驗(yàn)證頁面上的元素是否符合預(yù)期。
通過這三個(gè)步驟, 我們可以完成一個(gè)頁面元素的操作, 找到頁面元素是很重要的一個(gè)步驟。 找不到頁面元素,后面就沒法做了,Web頁面技術(shù)的現(xiàn)實(shí)復(fù)雜性, 造成大量的頁面元素很難定位。經(jīng)常有人不知道怎么定位。
定位方法大全
使用WebDriver對象的findElement函數(shù)定義一個(gè)Web頁面元素
使用findElements函數(shù)可以定位頁面的多個(gè)元素
定位的頁面元素需要使用WebElement對象來存儲,以便后續(xù)使用
常用的定位頁面元素方法如下,
定位方法 Java語言實(shí)現(xiàn)實(shí)例
id 定位 driver.findElement(By.id(“id的值”));
name定位 driver.findElement(By.name(“name的值”));
鏈接的全部文字定位 driver.findElement(By.linkText(“鏈接的全部文字”));
鏈接的部分文字定位 driver.findElement(By.partialLinkText(“鏈接的部分文字”));
css 方式定位 driver.findElement(By.cssSelector(“css表達(dá)式”));
xpath 方式定位 driver.findElement(By.xpath(“xpath表達(dá)式”));
Class 名稱定位 driver.findElement(By.className(“class屬性”));
TagName 標(biāo)簽名稱定位 driver.findElement(By.tagName(“標(biāo)簽名稱”));
Jquery方式 Js.executeScript(“return jQuery.find(“jquery表達(dá)式”)”)
如何定位?
在使用selenium webdriver進(jìn)行元素定位時(shí),通常使用findElement或findElements方法結(jié)合By類返回元素句柄來定位元素
findElement() 方法返回一個(gè)元素, 如果沒有找到,會(huì)拋出一個(gè)異 NoElementFindException()
findElements()方法返回多個(gè)元素, 如果沒有找到,會(huì)返回空數(shù)組, 不會(huì)拋出異常
如何選擇定位方法?
策略是,選擇簡單,穩(wěn)定的定位方法。
當(dāng)頁面元素有 id屬性的時(shí)候,盡量使用 id來定位。沒有的話,再選擇其他定位方法
cssSelector 執(zhí)行速度快,推薦使用。
定位超鏈接的時(shí)候,可以考慮 linkText或 partialLinkText:但是要注意的是,文本經(jīng)常發(fā)生改變,所以不推薦用。
xpath 功能最強(qiáng)悍。當(dāng)時(shí)執(zhí)行速度慢,因?yàn)樾枰檎艺麄€(gè)DOM, 所以盡量少用。實(shí)在沒有辦法的時(shí)候,才使用 xpath。
這里,初學(xué)者可以根據(jù)下面的實(shí)例來一一了解如何進(jìn)行元素的定位。
環(huán)境準(zhǔn)備
首先創(chuàng)建一個(gè)hello.html頁面,用于下面的演示
你好,世界!
用戶名:
密碼:
地區(qū):
在同個(gè)目錄下創(chuàng)建一個(gè)find_location.py文件,初始化工作
from selenium import webdriver
import os
# 創(chuàng)建Chrome驅(qū)動(dòng)實(shí)例
driver = webdriver.Chrome()
# 啟動(dòng)瀏覽器并且導(dǎo)航到指定URL
# 這里為了覆蓋更多的元素定位,我自己編寫了一個(gè)本地的hello.html文件。
file_path = 'file:///' + os.path.abspath('hello.html')
driver.get(file_path)
元素定位
通過class定位
find_element_by_class_name(self, name):
find_elements_by_class_name(self, name):
# 定位class名稱為“head_title"的元素
head_title = driver.find_element_by_class_name("head_title")
print(head_title.text)
通過id定位
find_element_by_id(self, id_):
find_elements_by_id(self, id_):
# 定位id為“world”的元素
world = driver.find_element_by_id("world")
print(world.text)
通過name屬性定位
find_element_by_name(self, name):
find_elements_by_name(self, name):
# 定位name為“username”的元素
username = driver.find_element_by_name("username")
print(username.get_attribute("value"))
通過標(biāo)簽名定位
find_element_by_tag_name(self, name):
find_elements_by_tag_name(self, name):
# 定位標(biāo)簽為
submit_btn = driver.find_element_by_tag_name("button")
print(submit_btn.text)
通過鏈接文本定位
find_element_by_link_text(self, link_text):
find_element_by_partial_link_text(self, link_text):
# 定位鏈接文本完全匹配“我的看云首頁”的元素
kancloud = driver.find_element_by_link_text("我的看云首頁")
print(kancloud.get_attribute("href"))
# 定位鏈接文本部分匹配“看云首頁”的元素
kancloud = driver.find_element_by_partial_link_text("看云首頁")
print(kancloud.get_attribute("href"))
通過xpath定位
find_element_by_xpath(self, xpath):
find_elements_by_xpath(self, xpath):
# xpath定位,相對路徑定位用戶名輸入框
username = driver.find_element_by_xpath("http://body/div/input")
print(username.get_attribute("value"))
# xpath定位,相對路徑與屬性結(jié)合 定位密碼輸入框
password = driver.find_element_by_xpath("http://input[@name='password']")
print(password.get_attribute("value"))
# xpath定位,多個(gè)屬性結(jié)合 定位密碼輸入框
password = driver.find_element_by_xpath("http://input[@name='password'][@type='text']")
print(password.get_attribute("value"))
通過css選擇器定位
find_element_by_css_selector(self, css_selector):
find_elements_by_css_selector(self, css_selector):
# css選擇器,標(biāo)簽+屬性 定位用戶名輸入框
username = driver.find_element_by_css_selector("input[name='username']")
print(username.get_attribute("value"))
# css選擇器,標(biāo)簽+class類名 定位用戶名輸入框
username = driver.find_element_by_css_selector("input.user_name")
print(username.get_attribute("value"))
# css選擇器,標(biāo)簽+多個(gè)class類名,定位密碼輸入框,注意不要空格,空格代表下一級子元素
password = driver.find_element_by_css_selector("input.ptqa.pwd")
print(password.get_attribute("value"))
# css選擇器,id+多個(gè)class類名,定位密碼輸入框
password = driver.find_element_by_css_selector("#login_form .ptqa.pwd")
print(password.get_attribute("value"))
# css選擇器,多級class類名,定位密碼輸入框
password = driver.find_element_by_css_selector(".login .ptqa.pwd")
print(password.get_attribute("value"))
# css選擇器,class類名+屬性,定位密碼輸入框
password = driver.find_element_by_css_selector(".login .ptqa[name='password']")
print(password.get_attribute("value"))
#css 選擇器,根據(jù)父子關(guān)系,定位密碼輸入框
password = driver.find_element_by_css_selector("div[id='login_form']>input[name='password']")
print(password.get_attribute("value"))
# css 選擇器,根據(jù)兄弟關(guān)系,定位密碼輸入框
password = driver.find_element_by_css_selector("input[name='username']+input")
print(password.get_attribute("value"))
上面的定位元素方法,都列出了兩個(gè),其中一個(gè)是 find_elements_by_xxx,這個(gè)方法用在獲取結(jié)果有多個(gè)元素的情況,例如下面獲取下拉列表選項(xiàng)
# 用find_element_by_css_selector 獲取的是單個(gè)元素
mm = driver.find_element_by_class_name("city").find_element_by_css_selector("option[value='mm']")
print(mm.text)
print("-"*20)
# 用find_elements_by_css_selector獲取的是元素組列表
cities = driver.find_elements_by_css_selector(".city option")
print(type(cities))
for city in cities:
print(city.text)
運(yùn)行結(jié)果為:
茂名
--------------------
廣州
佛山
茂名
襄樊
通用的終極定位語法
上面的所有元素定位 find_element_by_xxx和find_elements_by_xxx調(diào)用的結(jié)果,實(shí)際上都是在調(diào)用以下兩種方法,我們也可以直接調(diào)用一下兩種方法即可。
find_element(self, by=By.ID, value=None):
find_elements(self, by=By.ID, value=None):
class By(object):
"""
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"
例如:
from selenium.webdriver.common.by import By
# 根據(jù)id,定位id為“world”的元素
world = driver.find_element(By.ID,"world")
print(world.text)
# xpath定位,相對路徑與屬性結(jié)合 定位密碼輸入框
password = driver.find_element(By.XPATH,"http://input[@name='password']")
print(password.get_attribute("value"))
# css選擇器,標(biāo)簽+屬性 定位用戶名輸入框
username = driver.find_element(By.CSS_SELECTOR,"input[name='username']")
print(username.get_attribute("value"))
定位總結(jié)
我最喜歡的定位方式,優(yōu)先是id,如果沒有id找class,如果class不好定位,找css選擇器。我覺得css選擇器是最靈活也是最強(qiáng)大的定位方式。使用xpath定位切記不要用絕對路徑,最好結(jié)合相對路徑與屬性。
關(guān)注51Testing軟件測試網(wǎng),提升it技能,從不會(huì)到熟練只差一步。
新聞標(biāo)題:自動(dòng)化測試:盤點(diǎn)Selenium頁面元素定位的8種方法
網(wǎng)址分享:http://www.ef60e0e.cn/article/jcjsds.html