Python+Selenium - Web自動(dòng)化測試:元素定位

前言

現(xiàn)在開始使用 Selenium 中的 Webdriver 框架編寫自動(dòng)化代碼腳本聪全,我們常見的在瀏覽器中的操作都會(huì)有相對應(yīng)的類方法,這些方法需要定位才能操作元素载佳,不同網(wǎng)頁的元素也不同炒事,可以根據(jù)自己情況選擇使用類方法。下面開始學(xué)習(xí)元素定位 蔫慧;

New一個(gè)后綴為.py的Python文件寫一段代碼挠乳,先感受一下代碼吧!寫完以后Ctrl+Shift+F10運(yùn)行代碼姑躲。
# -*- coding:utf-8 -*-
from selenium import webdriver   # 從selenium模塊中導(dǎo)入webdrive類

driver = webdriver.Chrome()   # 定義新的變量名,打開瀏覽器

driver.maximize_window()   # 瀏覽器窗口最大化

driver.get("https://baidu.com")  # 打開百度網(wǎng)址

# 定位百度首頁的搜索框,然后在搜索框中輸入Selenium
driver.find_element_by_id('kw').send_keys('Selenium')

# 定位百度首頁的百度一下,然后點(diǎn)擊一下
driver.find_element_by_id('su').click()

瀏覽不同的網(wǎng)頁元素也不同睡扬,可以選擇使用最合適你的情況的方法使用,下面介紹Selenium其中的16種定位方法:

WebDriver8種基本元素定位方式:
id定位:find_element_by_id(self, id_)
name定位:find_element_by_name(self, name)
class定位:find_element_by_class_name(self, name)
tag定位:find_element_by_tag_name(self, name)
link定位:find_element_by_link_text(self, link_text)
partial_link定位:find_element_by_partial_link_text(self, link_text)
xpath定位:find_element_by_xpath(self, xpath)
css定位:find_element_by_css_selector(self, css_selector)

這8種其實(shí)和上面的8種一樣的只不過后者是以復(fù)數(shù)形式出現(xiàn)(這些復(fù)數(shù)定位方法會(huì)返回一個(gè)列表的值):

id復(fù)數(shù)定位:find_elements_by_id(self, id_)
name復(fù)數(shù)定位:find_elements_by_name(self, name)
class復(fù)數(shù)定位:find_elements_by_class_name(self, name)
tag復(fù)數(shù)定位:find_elements_by_tag_name(self, name)
link復(fù)數(shù)定位:find_elements_by_link_text(self, text)
partial_link復(fù)數(shù)定位:find_elements_by_partial_link_text(self, link_text)
xpath復(fù)數(shù)定位:find_elements_by_xpath(self, xpath)
css復(fù)數(shù)定位:find_elements_by_css_selector(self, css_selector)
想要深入了解xpath黍析、css卖怜、復(fù)數(shù)定位的請加入我們,642830685阐枣,領(lǐng)取最新軟件測試大廠面試資料和Python自動(dòng)化马靠、接口奄抽、框架搭建學(xué)習(xí)資料!技術(shù)大牛解惑答疑甩鳄,同行一起交流

8種基本定位介紹逞度,掌握這8種基本可以橫著走了:
以百度為例這張圖是百度輸入框的,一眼看過去就看到了三種定位方式:


1. 通過id定位:
driver.find_element_by_id('kw').send_keys('Selenium')
2. 通過name定位:
driver.find_element_by_name('wd').send_keys('Selenium')
3. 通過class定位:
driver.find_element_by_class_name('s_ipt').send_keys('Selenium')
4. 通過tag定位:

tag其實(shí)是通過標(biāo)簽名去定位的妙啃,一般情況下一個(gè)頁面會(huì)存在大量相同的標(biāo)簽名這種定位方式不是很實(shí)用第晰,所以用的也就比 較少;


driver.find_element_by_tag_name('input').send_keys('Selenium')
5. 通過link_text定位:

HTML代碼中以a標(biāo)簽開頭的一般是超鏈接元素的標(biāo)記可以使用link_text可以精準(zhǔn)匹配彬祖;

<a  name="tj_trnews" class="mnav">新聞</a>

driver.find_element_by_link_text('新聞').click()
6. 通過partial_link_text定位:

這種定位方式和上面的一樣也是通過HTML的a標(biāo)簽定位茁瘦,唯一不同的這種方式是模糊匹配,當(dāng)超鏈接名稱過長時(shí)储笑,這時(shí)候可以使用模糊匹配方式甜熔,截取其中一部分字符串就可以了;


driver.find_element_by_partial_link_text('聞').click()
7. 通過xpath定位:

xpath是XML路徑語言突倍,它可以用來確定xml文檔中的節(jié)點(diǎn)元素位置腔稀,通過元素的路徑來完成對元素的查找。HTML就是XML的一種實(shí)現(xiàn)方式羽历,可以自行選擇絕對路徑和相對路徑作為匹配的路徑



雙斜杠(//) = 相對路徑焊虏,可以選擇任何一個(gè)節(jié)點(diǎn)作為起始點(diǎn)

單斜桿(/) = 絕對路徑,就是從網(wǎng)頁代碼的html開始一層一層找

() = 匹配任何元素節(jié)點(diǎn)秕磷;(@)= 匹配任何屬性節(jié)點(diǎn)

1诵闭、xpath可以使用id,name澎嚣,class元素進(jìn)行定位:


# 使用xpath方法的id屬性定位'
driver.find_element_by_xpath("http://*[@id='kw']").send_keys('Selenium')

# 使用xpath方法的name屬性定位
driver.find_element_by_xpath("http://*[@name='wd']").send_keys('Selenium')

# 使用xpath方法的class屬性定位
driver.find_element_by_xpath("http://*[@class='s_ipt']").send_keys('Selenium')

2疏尿、除了使用class,id易桃,name定位褥琐,也可以手動(dòng)選取節(jié)點(diǎn)來進(jìn)行定位:


# 使用 // 選取當(dāng)前節(jié)點(diǎn)
driver.find_element_by_xpath("http://input[@id='kw']").send_keys('Selenium')

# 使用 // 選取父節(jié)點(diǎn)
driver.find_element_by_xpath("http://span[@class='bg s_ipt_wr quickdelete-wrap']/input").send_keys('Selenium')

# 使用 // 選取爺節(jié)點(diǎn)
driver.find_element_by_xpath("http://form[@id='form']/span[1]/input").send_keys('Selenium')

3、使用絕對路徑定位代碼會(huì)很長晤郑,有其中一個(gè)元素發(fā)生變化就會(huì)失效還有程序在運(yùn)行的時(shí)候會(huì)檢索會(huì)比較慢敌呈,剝絲抽繭一層層的找會(huì)很慢,不建議使用造寝;



driver.find_element_by_xpath('html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys('Selenium')
8. 通過css定位:

1磕洪、css也頗為強(qiáng)大xpath可以干的事css也可以干,css的語法更為簡潔匹舞,更為高效褐鸥。而相對初學(xué)者xpath看起來更直觀,更好理解赐稽;


# 使用 css 通過 id 定位
driver.find_element_by_css_selector('#kw').send_keys('Selenium')

# 使用 css 通過 class 定位
driver.find_element_by_css_selector('.s_ipt').send_keys('Selenium')

# 使用 css 通過 name 定位
driver.find_element_by_css_selector("[name='wd']").send_keys('Selenium')

# 使用 css 通過 autocomplete 定位
driver.find_element_by_css_selector("[autocomplete='off']").send_keys('Selenium')

2叫榕、css除了使用元素的屬性定位也可以和xpath一樣使用層級關(guān)系進(jìn)行定位:


# 使用 css 通過 標(biāo)簽定位
driver.find_element_by_css_selector('input').send_keys('Selenium')
# 使用 css 標(biāo)簽屬性定位
driver.find_element_by_css_selector('input.s_ipt').send_keys('Selenium')
driver.find_element_by_css_selector('input#kw').send_keys('Selenium')
# 層級關(guān)系
driver.find_element_by_css_selector("input[id='kw']").send_keys('Selenium')
driver.find_element_by_css_selector("input[name='wd']").send_keys('Selenium')
driver.find_element_by_css_selector("input[autocomplete='off']").send_keys('Selenium')
# 層級關(guān)系
driver.find_element_by_css_selector("form#form>span>input").send_keys('Selenium')
driver.find_element_by_css_selector("form.fm>span>input").send_keys('Selenium')
driver.find_element_by_css_selector("form[name='f']>span>input").send_keys('Seleniu
本文說的是8種基本定位的方法浑侥,學(xué)會(huì)了8種就足夠日常使用了,其中xpath和css的定位方法遠(yuǎn)遠(yuǎn)不止我寫的幾種晰绎,想要深入了解xpath寓落、css、復(fù)數(shù)定位的請加入我們荞下,642830685伶选,領(lǐng)取最新軟件測試大廠面試資料和Python自動(dòng)化、接口尖昏、框架搭建學(xué)習(xí)資料仰税!技術(shù)大牛解惑答疑,同行一起交流
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抽诉,一起剝皮案震驚了整個(gè)濱河市陨簇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迹淌,老刑警劉巖河绽,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唉窃,居然都是意外死亡耙饰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門纹份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苟跪,“玉大人,你說我怎么就攤上這事矮嫉∠髋兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵蠢笋,是天一觀的道長。 經(jīng)常有香客問我鳞陨,道長昨寞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任厦滤,我火速辦了婚禮援岩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掏导。我一直安慰自己享怀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布趟咆。 她就那樣靜靜地躺著添瓷,像睡著了一般梅屉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳞贷,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天坯汤,我揣著相機(jī)與錄音,去河邊找鬼搀愧。 笑死惰聂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咱筛。 我是一名探鬼主播搓幌,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迅箩!你這毒婦竟也來了鼻种?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤沙热,失蹤者是張志新(化名)和其女友劉穎叉钥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篙贸,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡投队,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爵川。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敷鸦。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寝贡,靈堂內(nèi)的尸體忽然破棺而出扒披,到底是詐尸還是另有隱情,我是刑警寧澤圃泡,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布碟案,位于F島的核電站,受9級特大地震影響颇蜡,放射性物質(zhì)發(fā)生泄漏价说。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一风秤、第九天 我趴在偏房一處隱蔽的房頂上張望鳖目。 院中可真熱鬧,春花似錦缤弦、人聲如沸领迈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狸捅。三九已至衷蜓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薪贫,已是汗流浹背恍箭。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞧省,地道東北人扯夭。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像鞍匾,于是被迫代替她去往敵國和親交洗。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360