web自动化测试理论之selenium八大定位 -(2)
web自動化測試理論之selenium八大定位
一、ID定位
概念:通過元素的id屬性來定位元素。
前置:所要定位的元素必須有id屬性
方法:driver.find_element_by_id(id屬性值)
"""需求:打開注冊A.html頁面,完成以下操作1).使用id定位,輸入用戶名:admin2).使用id定位,輸入密碼:1234563).3秒后關閉瀏覽器窗口 """ # 導包 from time import sleep from selenium import webdriver# 創建瀏覽器驅動 driver = webdriver.Chrome() # 打開測試網址 driver.get('file:///C:/Users/Desktop/UITest/%E6%B3%A8%E5%86%8CA.html') # 定位元素,調用模擬操作方法 driver.find_element_by_id('userA').send_keys('admin') driver.find_element_by_id('passwordA').send_keys('123456') # 暫停3秒看效果 sleep(3) # 操作完畢關閉瀏覽器 driver.quit()二、Name定位
概念:通過元素的name屬性來定位元素。
前置:所要定位的元素必須有name屬性。
方法:driver.find_element_by_name(name屬性值)
特點:當前頁面可以重復
由于name屬性值可以重復,所以使?時需要查看是否為唯?
# 定位元素,調用模擬操作方法 driver.find_element_by_name('userA').send_keys('admin') driver.find_element_by_name('passwordA').send_keys('123456')三、class_name 定位
概念:通過元素的class_name屬性來定位元素。
前置:所要定位的元素必須有class類名屬性。
方法:driver.find_element_by_class_name(class屬性值)
特點: class屬性值可以有多個值
說明:如果標簽有多個class值,使?任何?個都可以。如:c1
<p><label for="emailA">電子郵件A:</label><input type="emailA" placeholder="電子郵箱A" class="c1 c2 c3"> </p> # 定位元素,調用模擬操作方法 driver.find_element_by_class_name('telA').send_keys('18611111111') driver.find_element_by_class_name('c1').send_keys('123@qq.com')四、Tag_name 定位?
概念:通過元素的標簽名來定位元素。
?方法:driver.find_element_by_tag_name(標簽名)
特點:重復性高,不建議使用?
提示: 如果??存在多個相同標簽,默認返回第?個。
# 定位元素,調用模擬操作方法 # 使用標簽名定位確認符合條件的元素是第幾個?如果需要獲取所有的相同標簽,使用查找一組元素的方法 driver.find_element_by_tag_name('input').send_keys('admin')五、link_text 定位
概念:專門用來定位超鏈接元素(<a></a>標簽)
方法:driver.find_element_by_link_text(超鏈接的全部文本內容)
特點: 傳?的鏈接?本,必須全部匹配,不能模糊
提示:獲取要定位超鏈接文本類容,用拷貝的形式,定位元素
# 定位元素,調用模擬操作方法 driver.find_element_by_link_text('訪問 新浪 網站').click()使用link_text定位圖片標記的元素會有什么問題?
代碼過長
定位不到
六、partial_link_text 定位
概念:使用局部文本來定位元素:
局部文本:
方法:driver.find_element_by_partial_link_text(超鏈接的局部文本內容)
從字符串任意位置開始,一截連續字符集。
提示:獲取要定位超鏈接文本部分類容(能表示該元素唯一性),用拷貝的形式,定位元素
# 定位元素,調用模擬操作方法 # # 獲取要定位超鏈接文本部分類容(能表示該元素唯一性),用拷貝的形式,定位元素 driver.find_element_by_partial_link_text('新浪').click()擴展- 查找一組元素
含義:定位所有符合條件的元素
Return:返回的數據為所有符合條件的元素對象的列表
說明:返回列表格式,要使?需要添加下標或遍歷。
?法: driver.find_elements_by_xxxx()
提示: ??元素定位?法,都可以使??組元素定位,如果沒有搜索到符合標簽,返回空列表
在定位元素時,如果出現下面的問題:
1、定位到多個符合條件的元素
2、且所需元素定位元素不是第一個
如何從返回的列表中取某一個的元素對象?
定位符合條件的一組元素后,通過下標取指定的元素對象。
# 需求:使用定位一組元素的方法 driver.find_elements_by_tag_name()將注冊A的信息進行填寫 # 查找所有的input標簽 inputs = driver.find_elements_by_tag_name('input') inputs[0].send_keys('admin') inputs[1].send_keys('123456') inputs[2].send_keys('18611111111') inputs[3].send_keys('123@qq.com')# 動態填寫值 for i in inputs:if i.get_attribute('name') == 'userA':i.send_keys('admin')elif i.get_attribute('type') == 'password':i.send_keys('123456')elif i.get_attribute('id') == 'telA':i.send_keys('18611111111')else:i.send_keys('123@qq.com')在定位元素時,可以利用:
元素自身的信息:id、name、class、tag_name、文本,所有屬性都可以來定位
元素的層級關系:xpath定位、css定位
七、Xpath定位
概念;XML Path簡稱,用于在XML文檔中查找元素信息的語言。
方法:driver.find_element_by_xpath(xpath表達式)
XML特點:
1、層級結構
2、都有標簽組成
3、標簽都有自己屬性信息
Xpath定位策略(方法):
路徑定位
屬性定位
屬性與邏輯結合
層級與屬性結合
1、Xpath定位-路徑定位
絕對路徑:
概念:從最外層元素到指定元素之間所有經過的元素層級的路徑。 (從根?錄開始,逐級查找標簽)
表達式寫法:對路徑以/html根節點開始,使用 / 來分隔元素層級。
如:/html/body/form/div/fieldset/center/p[1]/input? 定位賬號A的輸入框
絕對路徑對界面依賴強,不建議使用
相對路徑:
概念:從目標定位元素的任意層級的上級元素開始到目標元素所經過的層級的路徑。
表達式寫法:以//開始,后續每個層級都使用/來分隔。
如://fieldset//p[1]//input? ? 或者//fieldset//p[1]/input 定位賬號A的輸入框
# 絕對路徑 el = driver.find_element_by_xpath('/html/body/form/div/fieldset/center/p[1]/input') el.send_keys('admin') sleep(2) # 清除元素 el.clear() # 相對路徑 driver.find_element_by_xpath('//fieldset//p[1]//input').send_keys('123')2、Xpath定位-屬性定位
概念:利用元素的屬性來進行定位。
示例:
//input[@type='submit']
//*[@value='提交']
元素的屬性有很多,挑選哪個屬性來定位呢?
挑選元素所特有的
挑選較為常用的:id、name、class、value......
總之:盡量挑選能精準定位到唯一元素的屬性
# 利用元素的屬性信息精準定位用戶名輸入框,并輸入:admin el = driver.find_element_by_xpath('//input[@placeholder="賬號A"]').send_keys('admin')3、Xpath定位-屬性與邏輯結合
概念:利用元素的多個屬性來進行定位。
示例://input[@value='提交' and @class='banana']
利用單個屬性信息定位不到元素了。
# 利用屬性與邏輯結合在test1輸入框輸入:admin driver.find_element_by_xpath('//input[@class="login" and @name="user"]').send_keys('admin')單屬性: //*[@屬性名='屬性值']
多屬性: //*[@屬性名='屬性值' and @屬性名='屬性值']
提示:可以使?任何屬性。
4、Xpath定位-屬性與層級結合
利用多個屬性信息定位不到元素了。
利用層級與屬性結合在test1輸入框輸入:admin
# 利用層級與屬性結合在用戶名輸入框輸入:admin # 層級和屬性結合 driver.find_element_by_xpath('//p[@id="p1"]/input').send_keys('admin')說明: 如果元素現有的屬性不能唯?匹配,需要結合層級使?
語法:
//?標簽/?標簽? ? ? ?必須為直屬?級
//?標簽[@屬性='值']//后代標簽? ? ? ?和后代之間可以跨越元素
5、Xpath定位 -- 延伸擴展
text()='xxx' 、contains(@attribute,'xxx')? ?、starts-with(@attribute,'xxx')
//*[text()="xxx"]? ? ? ? ? ?文本內容是xxx的元素
//*[contains(@attribute,'xxx')]? ? 屬性中含有xxx的元素
//*[starts-with(@attribute,'xxx')]? ? 屬性以xxx開頭的元素
driver.find_element_by_xpath('//*[contains(@placeholder,"賬號")]').send_keys('admin')sleep(2) driver.find_element_by_xpath('//a[text()="訪問 新浪 網站"]').click() driver.find_element_by_xpath('//a[starts-with(@href,"http")]').click()xpath綜合練習
"""1. 打開Tpshop首頁;2. 使用 Xpath 文本定位策略定位登陸超鏈接,并點擊;3. 使用 Xpath 屬性定位策略定位用戶名輸入框,輸入:15800000001;4. 使用 Xpath 屬性包含定位策略定位密碼輸入框,輸入:123456;5. 使用 Xpath 屬性與邏輯結合策略定位驗證碼輸入框,輸入:8888;6. 使用 Xpath 層級與屬性結合策略定位登陸按鈕,并點擊;每步操作之后暫停2s """# 1、導包 from time import sleep from selenium import webdriver# 2、實例化瀏覽器對象 driver = webdriver.Chrome()# 3、打開瀏覽器 driver.get('http://tpshop-test.itheima.net/') driver.find_element_by_xpath('//*[text()="登錄"]').click() driver.find_element_by_xpath('//*[@placeholder="手機號/郵箱"]').send_keys('15800000001') driver.find_element_by_xpath('//*[contains(@placeholder,"密碼")]').send_keys('123456') driver.find_element_by_xpath('//input[@placeholder="驗證碼" and @name="verify_code"]').send_keys('8888') driver.find_element_by_xpath('//*[@class="login_bnt"]/a').click() # 4、觀察對象 sleep(2)# 5、關閉瀏覽器 driver.quit()八、CSS定位?
css概念:(Cascading Style Sheets)是一種語言,用來描述HTML 元素的顯示樣式。?
css選擇器:一種表達式,可以找到HTML中的標簽元素。
CSS定位概念:selenium利用選擇器定位元素的定位方式。
CSS定位方法:driver.find_element_by_css_selector(選擇器表達式)?
特點:
速度更快
?寫法更簡潔?
策略(方法):
ID選擇器
類選擇器
元素選擇器
屬性選擇器
層級選擇器?
"""使用css定位完成下面操作需求:打開注冊A.html頁面,完成以下操作1).使用CSS定位方式中id選擇器定位用戶名輸入框,并輸入:admin 2).使用CSS定位方式中屬性選擇器定位密碼輸入框,并輸入:123456 3).使用CSS定位方式中class選擇器定位電話號碼輸入框,并輸入:18600000000 4).使用CSS定位方式中元素選擇器定位注冊按鈕,并點擊 """# ?戶名 id選擇->#id屬性值 driver.find_element_by_css_selector('#userA').send_keys('admin') # 密碼 屬性選擇器->[屬性名='屬性值'] driver.find_element_by_css_selector('[name="passwordA"]').send_keys('123456') # 電話 類選擇器->.class屬性值 driver.find_element_by_css_selector('.telA').send_keys('18600000000') # 電子郵件 后代選擇器 driver.find_element_by_css_selector('p>#emailA').send_keys('123@qq.com') sleep(2) # 確定 標簽選擇器-標簽名 driver.find_element_by_css_selector('button').click()1、CSS定位? -?ID選擇器
說明:利用元素ID屬性來選擇?
格式:#id屬性值
前置: 標簽必須id屬性
2? ?CSS定位? -? 類選擇器
說明:利用元素class屬性值來選擇?
格式:.class屬性值
前置: 標簽必須class屬性
3、CSS定位? -?元素選擇器 / 標簽選擇器
語法: 標簽名
提示: 注意標簽是否在??中唯?,否則返回單個或所有
4、CSS定位? -??屬性選擇器
語法: [屬性名='屬性值']
說明: 標簽任意屬性都可以
5、CSS定位? -? 層級選擇器
后代關系包含了父子關系,一般只需記憶后代關系即可
父子關系:
概念:根據元素的父子關系來選擇元素
表達式寫法:element1>element2
如:p[id="p1"]>input
??關系: 選擇器>選擇器 如: #p1>input
后代關系:
后代關系: 選擇器 選擇器 如: #p1 input
選擇器使?任何?種css選擇器(id選擇器、類選擇器、屬性選擇器、標簽選 擇器)都可以
概念:根據元素的上級元素來選擇元素(只要是目標元素上層元素即可)
表達式寫法:element1 element2? ? ?注意中間有空格
如:p[id="p1"] input
案例:使用CSS定位方式中的層級選擇器定 位用戶名輸入框,并輸入:admin
# 使用CSS定位方式中的層級選擇器定位用戶名輸入框,并輸入:admin # 后代關系 中間用空格隔開 driver.find_element_by_css_selector('p[id="p1"] input').send_keys('admin')6、css定位 - 延伸擴展
利用局部屬性值定位元素
tagName[attribute*='局部屬性值']
標簽名[屬性=‘局部屬性值’]
# 利用局部屬性定位方式定位用戶名輸入框輸入:admin driver.find_element_by_css_selector('input[placeholder*="賬號"]').send_keys('admin')注意:在帶有屬性值的時候,注意單引號、多引號的合理使用,外單(單引號)內雙(雙引號)
查找元素:find_element()
方法:driver.find_element(by=By.所要選擇定位方式的類屬性,value=所選擇定位方式所要求的值)
為了查找元素?法的封裝
from selenium.webdriver.common.by import By"""需求:打開注冊A.html頁面,完成以下操作1).使用id定位用戶名輸入框,并輸入:admin 2).使用name定位密碼輸入框,并輸入:123456 3).使用class定位電話號碼輸入框,并輸入:18600000000 4).使用標簽名定位注冊按鈕,并點擊 """ driver.find_element(By.ID, 'userA').send_keys('admin') driver.find_element(By.NAME, 'passwordA').send_keys('123456') driver.find_element(By.CLASS_NAME, 'telA').send_keys('18600000000') sleep(2) driver.find_element(By.TAG_NAME, 'button').click()八大元素定位方式總結
結論:
1、?推css定位,原因執?速度快。
????????①如果有ID屬性,使?#id
????????②沒有id屬性,使?其他有的屬性(能代表唯?的屬性)
????????③如果屬性都帶不了唯?,使?層級
2、如果css解決不了,使?xpath。
元素操作
元素=driver.find_element()
點擊:
元素.click()
輸?:元素.send_keys(內容)
清空:元素.clear()
# 3、查找操作元素 driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin") driver.find_element(By.CSS_SELECTOR, "[name='passwordA']").send_keys("123456") driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18611111111") driver.find_element(By.CSS_SELECTOR, "[placeholder*='郵箱']").send_keys("123@qq.com") # 修改電話 sleep(3) driver.find_element(By.CSS_SELECTOR, ".telA").clear() driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18600000000") sleep(3) # 點擊注冊 driver.find_element(By.CSS_SELECTOR, "button").click()元素獲取方法:
獲取??: 元素.size
獲取?本: 元素.text
獲取屬性: 元素.get_attribute('屬性名')
判斷元素是否可?: 元素.is_displayed()
判斷元素是否可?: 元素.is_enabled()
判斷元素是否選中: 元素.is_selected()
# 獲取?? 元素.size user = driver.find_element(By.CSS_SELECTOR,"#userA").size print("?戶名輸?框的??:",user) # 獲取內容 元素.text a_text = driver.find_element(By.TAG_NAME,"a").text print("第?個a標簽的?本:",a_text) # 獲取屬性 超連接地址 a_href = driver.find_element(By.TAG_NAME,"a").get_attribute("href") print("第?個a標簽的鏈接:",a_href) # 判斷span標簽是否可? 元素.is_displayed span = driver.find_element(By.TAG_NAME,"span").is_displayed() print("span是否可?:",span) # 判斷取消按鈕是否可? is_enabled btn_is_enabled = driver.find_element(By.CSS_SELECTOR,"#cancelA").is_enabled() print("取消按鈕是否可?:",btn_is_enabled) # 旅游是否選中 is_selected is_selected = driver.find_element(By.CSS_SELECTOR,"#lyA").is_selected() print("旅游是否被選中:",is_selected)總結
以上是生活随笔為你收集整理的web自动化测试理论之selenium八大定位 -(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC2017使用protobuf-3.1
- 下一篇: Gremlins.js – 模拟用户随机