知乎首發(fā)地址:https://zhuanlan.zhihu.com/p/121812913
WebDriver針對(duì)各個(gè)瀏覽器而開(kāi)發(fā)闭树,取代了嵌入到被測(cè)Web應(yīng)用中的JavaScript,與瀏覽器緊密集成舔糖,因此支持創(chuàng)建更高級(jí)的測(cè)試享扔,避免了JavaScript安全模型導(dǎo)致的限制有送。除了來(lái)自瀏覽器廠商的支持之外焕檬,WebDriver還利用操作系統(tǒng)級(jí)的調(diào)用跃赚,模擬用戶(hù)輸入,因此, 它的穩(wěn)定性非常高屯掖。
做自動(dòng)化測(cè)試腳本的時(shí)候玄柏,我們通常會(huì)有如下的步驟:
通過(guò)某些方式定位到我們要執(zhí)行的對(duì)象、目標(biāo)(Target)
對(duì)這個(gè)對(duì)象進(jìn)行什么操作(command)
通過(guò)操作對(duì)定位到的元素賦值(value)
添加斷言操作
首先要解決的是元素定位問(wèn)題贴铜,這個(gè)內(nèi)容分開(kāi)來(lái)講就是何為頁(yè)面元素粪摘?如何定位瀑晒?
一、什么是頁(yè)面元素徘意?
在瀏覽上能顯示所有的要素苔悦,如圖片、文本框映砖、按鈕间坐、下拉列表灾挨、視頻等..
二邑退、如何定位頁(yè)面元素?
selenium webdriver中提供了8中頁(yè)面元素定位方式劳澄,如下:
1地技、id屬性定位->find_element_by_id("id屬性值")
最常用的一種元素定位方式,一般情況下ID屬性不會(huì)重復(fù)秒拔,但不排除特殊情況莫矗。
#導(dǎo)包、創(chuàng)建瀏覽器對(duì)象砂缩、獲取一下url地址fromseleniumimportwebdriverimporttime#driver:就是一個(gè)普通的變量作谚,dr也行driver=webdriver.Chrome()driver.get("https://www.baidu.com")#通過(guò)ID來(lái)定位文本框和百度一下driver.find_element_by_id("kw").send_keys("selenium")time.sleep(2)driver.find_element_by_id("su").click()time.sleep(2)#退出瀏覽器對(duì)象driver.quit()
2、name屬性定位->find_element_by_name("name屬性值")
name屬性可能會(huì)出現(xiàn)重復(fù)庵芭,建議開(kāi)發(fā)要保證ID或者那么有一個(gè)不能重復(fù)妹懒。
#導(dǎo)包、創(chuàng)建瀏覽器對(duì)象双吆、獲取一下url地址
from selenium import webdriver
import time
#driver:就是一個(gè)普通的變量眨唬,dr也行
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#通過(guò)name屬性定位元素
driver.find_element_by_name("wd").send_keys("selenium")
time.sleep(2)
driver.find_element_by_id("su").click()
time.sleep(2)
#退出瀏覽器對(duì)象
driver.quit()
3、class 屬性定位->find_element_by_class_name("class屬性值")
對(duì)某些具有相同類(lèi)的元素一網(wǎng)打盡的好方法
4好乐、tag name:->find_element_by_tag_name("標(biāo)簽名")
重復(fù)率高匾竿,定位效率低,基本不用
5蔚万、link text:->find_element_by_link_text("鏈接的顯示文本")
超鏈接的顯示文本信息岭妖,較為常用,參數(shù)是全部文本信息反璃。
#導(dǎo)包区转、創(chuàng)建瀏覽器對(duì)象、獲取一下url地址
from selenium import webdriver
import time
#driver:就是一個(gè)普通的變量版扩,dr也行
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#使用link text屬性定位(元素顯示的文本信息废离,要求是全部信息)
driver.find_element_by_link_text("新聞").click()
#等待3s
time.sleep(3)
#退出瀏覽器對(duì)象
driver.quit()
6、partial link text:->find_element_by_partial_link_text("部分鏈接的顯示文本")
超鏈接的顯示文本信息礁芦,較為常用蜻韭,參數(shù)是部分文本信息即可
#導(dǎo)包悼尾、創(chuàng)建瀏覽器對(duì)象、獲取一下url地址
from selenium import webdriver
import time
#driver:就是一個(gè)普通的變量肖方,dr也行
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#使用link text屬性定位(元素顯示的文本信息闺魏,要求是全部信息)
driver.find_element_by_link_text("新聞").click()
time.sleep(5)
#使用partial link text屬性定位(元素顯示的文本信息,可以是部分信息)
driver.find_element_by_partial_link_text("全國(guó)首家在線“報(bào)銷(xiāo)”互聯(lián)網(wǎng)慢病診室開(kāi)通").click()
#等待3s
time.sleep(3)
#退出瀏覽器對(duì)象
driver.quit()
7、xpath:->find_element_by_xpath("xpath")
Xpath不是selenium專(zhuān)用俯画,只是作為一種定位手段析桥,為selenium所用。Xpath是一門(mén)在xml文檔中查找信息的語(yǔ)言艰垂。Xpath可用來(lái)在xml文檔中對(duì)元素和屬性進(jìn)行遍歷泡仗。由于html的層次結(jié)構(gòu)與xml的層次結(jié)構(gòu)天然一致,所以使用Xpath也能夠進(jìn)行html元素的定位猜憎。
7.1娩怎、 絕對(duì)路徑
以/開(kāi)頭,從HTML標(biāo)簽開(kāi)始胰柑,依次遍歷HTML結(jié)構(gòu)數(shù)的節(jié)點(diǎn)截亦,直到找到要定位的頁(yè)面元素,如百度首頁(yè)的百度文本框的絕對(duì)路徑柬讨,一般萬(wàn)不得已不使用崩瓤。為:/html/body/div/div/div[3]/div/div/form/span/input
父子節(jié)點(diǎn)是使用/連接,從上往下依次遍歷
兄弟節(jié)點(diǎn)是[]表示兄弟的排行踩官,比如同一級(jí)別上有2個(gè)以上的input標(biāo)簽却桶,input[2]就是排在第二位的,排行老大可以寫(xiě)為:input或者是input[1]
#導(dǎo)包卖鲤、創(chuàng)建瀏覽器對(duì)象肾扰、獲取一下url地址
from selenium import webdriver
import time
#driver:就是一個(gè)普通的變量,dr也行
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#使用絕對(duì)路徑定位
# driver.find_element_by_xpath("/html/body/div/div/div[3]/div/div/form/span/input").send_keys("selenium")
# time.sleep(2)
# driver.find_element_by_xpath("/html/body/div/div/div[3]/div/div/form/span[2]/input").click()
# time.sleep(2)
driver.quit()
7.2蛋逾、通過(guò)屬性定位(相對(duì)路徑)
一般以//開(kāi)頭集晚,使用屬性id、name区匣、class結(jié)合x(chóng)path進(jìn)行定位偷拔,如百度文本框的定位:
//input[@id='kw']
//input[@name='wd']
//input[@class='bg s_btn']
在一個(gè)屬性不能定位到元素的時(shí)候,可以邏輯運(yùn)算符的使用:
元素a : id = 1亏钩,name = a
元素b : id = 1 , name = b
元素c : id = 2 莲绰,name = a
and:表示多個(gè)條件要同時(shí)成立才行
or:多個(gè)條件,有一個(gè)成立就可以
#導(dǎo)包姑丑、創(chuàng)建瀏覽器對(duì)象蛤签、獲取一下url地址
from selenium import webdriver
import time
#driver:就是一個(gè)普通的變量,dr也行
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#利用元素屬性定位
# driver.find_element_by_xpath("http://input[@id='kw']").send_keys("selenium")
# time.sleep(2)
# driver.find_element_by_xpath("http://input[@id='su']").click()
# time.sleep(2)
#使用邏輯運(yùn)算符
driver.find_element_by_xpath("http://input[@id='kw' or @name = 'wd']").send_keys("selenium")
time.sleep(2)
driver.find_element_by_xpath("http://input[@id='su']").click()
time.sleep(2)
driver.quit()
7.3栅哀、通過(guò)父子關(guān)系和屬性定位:
假設(shè)某個(gè)標(biāo)簽就一個(gè)標(biāo)簽名震肮,其他屬性一概沒(méi)有(或者有一個(gè)class name称龙,而且是重復(fù)的)
使用絕對(duì)路徑?jīng)]問(wèn)題,就是復(fù)雜點(diǎn)
使用屬性定位戳晌,就不靠譜了鲫尊,定位不到
//form[@id='form']/span/input
//form[@id='form']/span[2]/input
#導(dǎo)包、創(chuàng)建瀏覽器對(duì)象沦偎、獲取一下url地址
from selenium import webdriver
import time
#driver:就是一個(gè)普通的變量疫向,dr也行
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 利用父子關(guān)系以及屬性定位:
# driver.find_element_by_xpath("http://form[@id='form']/span/input").send_keys("selenium")
# time.sleep(2)
# driver.find_element_by_xpath("http://form[@id='form']/span[2]/input").click()
# time.sleep(2)
driver.quit()
7.4、直接Chrome瀏覽器復(fù)制
//input[@id="kw"]
//*[@id="u1"]/a[2]
8豪嚎、css:->find_element_by_css_selector("css")-(掌握)
.表示類(lèi)選擇器搔驼,.s_ipt
#表示ID選擇器,#kw疙渣、#su
>表示父子關(guān)系匙奴,form#form > span > input
直接通過(guò)瀏覽器復(fù)制:#su
#導(dǎo)包堆巧、創(chuàng)建瀏覽器對(duì)象妄荔、獲取一下url地址
from selenium import webdriver
import time
#driver:就是一個(gè)普通的變量,dr也行
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#css的類(lèi)選擇器定位百度文本框,使用css的id選擇器定位百度一下按鈕
# driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")
# driver.find_element_by_css_selector("#su").click()
driver.find_element_by_css_selector("form#form > span > input#kw").send_keys("selenium")
driver.find_element_by_css_selector("#su").click()
time.sleep(3)
driver.quit()
9谍肤、補(bǔ)充
除了上面的8種定位單個(gè)元素的方法啦租,webdriver還能夠同時(shí)獲取多個(gè)頁(yè)面元素的方法,只是將多個(gè)元素對(duì)象存儲(chǔ)在一個(gè)列表中荒揣,此處我們以name屬性定位為例演示篷角。
ID:-->find_elements_by_name(name屬性值)
我們以checkbox復(fù)選框?yàn)槔M(jìn)行演示,先復(fù)制下面的HTML文件保存到本E:\checkbox.html文件中系任。
<formaction=""method="get">您喜歡的水果恳蹲?<br/><br/><label><inputname="Fruit"type="checkbox"value=""/>蘋(píng)果</label><label><inputname="Fruit"type="checkbox"value=""/>桃子</label><label><inputname="Fruit"type="checkbox"value=""/>香蕉</label><label><inputname="Fruit"type="checkbox"value=""/>梨</label></form><formaction=""method="get">您最喜歡水果?<br/><br/><label><inputname="Fruit"type="radio"value=""/>蘋(píng)果</label><label><inputname="Fruit"type="radio"value=""/>桃子</label><label><inputname="Fruit"type="radio"value=""/>香蕉</label><label><inputname="Fruit"type="radio"value=""/>梨</label><label><inputname="Fruit"type="radio"value=""/>其它</label></form>
以chrome瀏覽器打開(kāi)該文件俩滥,我們遍歷選中其中的4種水果
實(shí)現(xiàn)的自動(dòng)化測(cè)試代碼為:
#導(dǎo)包嘉蕾、創(chuàng)建瀏覽器對(duì)象、獲取一下url地址fromseleniumimportwebdriverimporttimedriver=webdriver.Chrome()driver.get("file:///E:/checkbox.html")#循環(huán)遍歷定位的所有checkbox元素霜旧,保存在列表中foriindriver.find_elements_by_name("Fruit"):i.click()time.sleep(3)#退出driver對(duì)象driver.quit()
三错忱、注意事項(xiàng)
1、建議與開(kāi)發(fā)協(xié)商挂据,保證id屬性的唯一性以清,優(yōu)先使用id進(jìn)行定位
2、動(dòng)態(tài)id屬性時(shí)崎逃,建議使用xpath的相對(duì)路徑定位
3掷倔、靈活使用元素等待,避免因頁(yè)面加載而導(dǎo)致的定位失敗
4个绍、css是配合html來(lái)工作勒葱,它實(shí)現(xiàn)的原理是匹配對(duì)象的原理勺像,而xpath是配合x(chóng)ml工作的,它實(shí)現(xiàn)的原理是遍歷的原理错森,所以?xún)烧咴谠O(shè)計(jì)上吟宦,css性能更優(yōu)秀、語(yǔ)言更簡(jiǎn)潔涩维,明了
5殃姓、總之一句話(huà),不管哪種方式瓦阐,以能唯一定位到元素為準(zhǔn)
歡迎關(guān)注作者蜗侈,如果覺(jué)得寫(xiě)的還不錯(cuò),就給個(gè)贊同睡蟋、喜歡踏幻、收藏(后續(xù)持續(xù)更新)。
【全文手打 如需轉(zhuǎn)載 請(qǐng)標(biāo)注此出處】