蒼老師自動(dòng)化測(cè)試小課堂 | WebDriver API之常見(jiàn)元素定位方法

知乎首發(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)注此出處】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戳杀,一起剝皮案震驚了整個(gè)濱河市该面,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌信卡,老刑警劉巖隔缀,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異傍菇,居然都是意外死亡猾瘸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)丢习,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牵触,“玉大人,你說(shuō)我怎么就攤上這事咐低±克迹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵渊鞋,是天一觀的道長(zhǎng)绰更。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锡宋,這世上最難降的妖魔是什么儡湾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮执俩,結(jié)果婚禮上徐钠,老公的妹妹穿的比我還像新娘。我一直安慰自己役首,他們只是感情好尝丐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布显拜。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亚铁,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音譬淳,去河邊找鬼。 笑死盹兢,一個(gè)胖子當(dāng)著我的面吹牛邻梆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绎秒,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浦妄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了见芹?” 一聲冷哼從身側(cè)響起剂娄,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辆童,沒(méi)想到半個(gè)月后宜咒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惠赫,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡把鉴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了儿咱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庭砍。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖混埠,靈堂內(nèi)的尸體忽然破棺而出怠缸,到底是詐尸還是另有隱情,我是刑警寧澤钳宪,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布揭北,位于F島的核電站,受9級(jí)特大地震影響吏颖,放射性物質(zhì)發(fā)生泄漏搔体。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一半醉、第九天 我趴在偏房一處隱蔽的房頂上張望疚俱。 院中可真熱鬧,春花似錦缩多、人聲如沸呆奕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梁钾。三九已至绳泉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姆泻,已是汗流浹背圈纺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麦射,地道東北人蛾娶。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像潜秋,于是被迫代替她去往敵國(guó)和親蛔琅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 元素定位應(yīng)該是自動(dòng)化測(cè)試的核心峻呛,要想操作一個(gè)元素罗售,首先應(yīng)該識(shí)別這個(gè)元素。 webdriver提供了一系列的元素定位...
    Johnson1417閱讀 1,226評(píng)論 0 0
  • 前言 元素定位是UI自動(dòng)化的基本功钩述,也是最基礎(chǔ)的技術(shù)寨躁。所以筆者今天來(lái)總結(jié)下Selenuim+Python最基本的幾...
    abb01857e1fc閱讀 1,704評(píng)論 0 0
  • 現(xiàn)狀 好久好久沒(méi)有更新博客了,應(yīng)該有一個(gè)月了吧牙勘,這段時(shí)間內(nèi)职恳,好忙,公司的業(yè)務(wù)在上漲期方面,但是卻把下面的一個(gè)小朋友砍掉...
    jb2閱讀 1,297評(píng)論 0 2
  • PhantomJS PhantomJS是一個(gè)基于Webkit的“無(wú)界面”(headless)瀏覽器放钦,它會(huì)把網(wǎng)站加載...
    大熊_7d48閱讀 1,461評(píng)論 0 1
  • 第一章 自動(dòng)化測(cè)試課程介紹和課程大綱 1、自動(dòng)化測(cè)試課程介紹 簡(jiǎn)介:講解什么是自動(dòng)化測(cè)試和課程大綱講解恭金,課程需要的...
    DdShare閱讀 1,502評(píng)論 0 1