selenium八種定位方式

Selenium對網(wǎng)頁的控制是基于各種前端元素的翔脱,在使用過程中讯壶,對于元素的定位是基礎(chǔ),只有準去抓取到對應(yīng)元素才能進行后續(xù)的自動化控制椭住,我在這里將對各種元素定位方式進行總結(jié)歸納一下趁窃。

這里將統(tǒng)一使用百度首頁(www.baidu.com)進行示例牧挣,f12可以查看具體前端代碼。
WebDriver8種基本元素定位方式
find_element_by_id()

采用id屬性進行定位醒陆。例如在百度頁面中輸入關(guān)鍵字 Selenium 進行搜索瀑构。百度部分關(guān)鍵源碼如下:
<span class="bg s_ipt_wr quickdelete-wrap">
<span class="soutu-btn"></span>
<input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
<a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;"></a>
</span>
<span class="bg s_btn_wr">
<input id="su" class="bg s_btn" type="submit" value="百度一下">
</span>
可以看到輸入框和百度一下的按鈕都有id,那么定位代碼如下:

coding=utf-8

from selenium import webdriver
import time
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

driver.find_element_by_id("kw").send_keys("Selenium")
driver.find_element_by_id("su").click()

time.sleep(2)
driver.quit()
find_element_by_name()
find_element_by_class_name()
根據(jù)name元素和class的名字進行定位刨摩,這兩種定位方式和id定位相似寺晌,在前端代碼中爷恳,id综膀、name和class一般都至少會有其中的一種,比如百度的搜索框具有name屬性叼丑,我們可以用name定位搜索款罢浇,class定位百度一下的按鈕:
driver.find_element_by_name("wd").send_keys("Python")
driver.find_element_by_class_name("s_btn").click()
find_element_by_xpath()
xpath是XML路徑語言陆赋,它可以用來確定xml文檔中的元素位置,通過元素的路徑來完成對元素的查找嚷闭。HTML就是XML的一種實現(xiàn)方式奏甫,所以xpath是一種非常強大的定位方式。
xpath也分幾種不同類型的定位方法凌受。

一種是絕對路徑定位。這種定位方式是利用html標簽名的層級關(guān)系來定位元素的絕對路徑思杯,一般從<html>標簽開始依次往下進行查找胜蛉。
如百度搜索框的絕對路徑xpath定位可以是這樣的:
find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")

還有一種是利用元素屬性來進行xpath定位,搜索框還可以利用id和name屬性去定位:

find_element_by_xpath("http://input[@id='kw']")

find_element_by_xpath("http://*[@name='wd']")

其中的標簽名input也可以用*來代替色乾,而且只要是在該標簽內(nèi)誊册,任意屬性都可以,比如搜索框的maxlength屬性:

find_element_by_xpath("http://input[@maxlength='255']")

有的時候我們會發(fā)現(xiàn)絕對路徑定位路徑太長暖璧,而且光憑路徑完全不可以猜測到其指向的具體頁面元素案怯,如果只有單純的元素屬性不一定可以每次查找的元素都可以又唯一的屬性去方便定位,這個時候我們可以將這兩種定位方式結(jié)合起來使用澎办。

比如查找搜索框的時候發(fā)現(xiàn)其上級元素form又唯一的id方便定位嘲碱,就可以先查找到form元素然后依次往下寫路徑:

find_element_by_xpath("http://form[@id='form']/span/input")

這種定位方式的使用過程中金砍,如果元素的單個屬性無法確定其唯一性,可以用and連接多個屬性去確定麦锯。

find_element_by_css_selector()
CSS屬性定位可以比較靈活地選擇控件的任意屬性恕稠,定位方式也會比xpath快。
同樣是那個百度搜索的例子扶欣,可以試一下:

driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")
driver.find_element_by_css_selector("#su").click()
如果有css基礎(chǔ)的話就應(yīng)該可以看懂鹅巍,一般class是用.標記,id是用#標記料祠,標簽名直接寫具體標簽名就好了骆捧。

css定位里面也可以通過屬性或者組合方式定位:

driver.find_element_by_css_selector("input[autocomplete='off']").send_keys("Python")
driver.find_element_by_css_selector("span.bg.s_btn_wr>input#su").click()
具體說一下百度一下那個按鈕的組合定位方式,這樣寫的定位順序是這樣的髓绽,先定位到一個class名為bg s_btn_wr的span標簽敛苇,在這個標簽下面有一個id為su的input標簽,這樣就定位到了梧宫。

值得注意的是接谨,在css里面下級標簽元素用>連接,如果class里面有空格塘匣,空格用.進行連接脓豪。

find_element_by_tag_name ()
通過標簽名去定位的方式一般是這樣的:find_element_by_tag_name("input")
可見僅僅通過標簽名去定位時,一般一種標簽在一個頁面里面會出現(xiàn)不止一次甚至大量出現(xiàn)忌卤,這種定位方式的作用不是很大扫夜,所以用的也就比較少。

find_element_by_link_text()
find_element_by_partial_link_text()
這兩種定位方式是專門用于定位超鏈接的驰徊,也就是對應(yīng)html頁面中的<a>標簽笤闯,括號里傳的值就是a標簽中的超鏈接文字,兩者的區(qū)別在于一個是完整的超鏈接文字棍厂,一個是可以只寫部分超鏈接文字颗味。
比如點擊百度首頁中右上角的新聞超鏈接,可以這樣去定位:

driver.find_element_by_link_text("新聞").click()
driver.find_element_by_partial_link_text("聞").click()

By定位
通過對上面8種基本元素定位方式的學(xué)習牺弹,在使用過程種可以根據(jù)實際的情況去選擇對應(yīng)的的定位方式浦马,我們可以用By來設(shè)置定位策略,具體語法如下:
find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新聞")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"http://*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")

上面這些使用的前提是需要導(dǎo)入By類:from selenium.webdriver.common.by import By

最簡單粗暴卻失傳已久的8種定位
據(jù)說這種定位方式在江湖上都快要失傳了张漂,實在想不通為什么晶默,明明寫起來最簡單粗暴啊~

driver.find_element("name","wd").send_keys("Selenium2")
driver.find_element("id","su").click()
相信通過上面的兩只栗子,大家一定會和我一樣覺得這種方式的定位實在是太省事了~只要寫find_element就好啦航攒,下面我們來總結(jié)一下這8種寫法與基本定位方法類比過來該怎么寫:

by_id -> find_element("id","")

by_xpath -> find_element("xpath","")

by_link_text -> find_element("link text","")

by_partial_text -> find_element("partial link text","")

by_name -> find_element("name","")

by_tag_name -> find_element("tag name","")

by_class_name -> find_element("class name","")

by_css_selector -> find_element("css selector","")

elements復(fù)數(shù)定位
在上面的例舉的八中基本定位方式種磺陡,都有對應(yīng)的復(fù)數(shù)形式,分別是下面這些:

id復(fù)數(shù)定位find_elements_by_id()
name復(fù)數(shù)定位find_elements_by_name()
class復(fù)數(shù)定位find_elements_by_class_name()
tag復(fù)數(shù)定位find_elements_by_tag_name()
link復(fù)數(shù)定位find_elements_by_link_text()
partial_link復(fù)數(shù)定位find_elements_by_partial_link_text()
xpath復(fù)數(shù)定位find_elements_by_xpath()
css復(fù)數(shù)定位find_elements_by_css_selector()
這些復(fù)數(shù)定位方式每次取到的都是具有相同類型屬性的一組元素,所以返回的是一個list隊列币他,我們也可以利用這個去定位單個的元素坞靶。比如百度首頁種,右上角有新聞圆丹、視頻滩愁、地圖、貼吧等一些鏈接辫封,我們通過f12查看源碼可以發(fā)現(xiàn)硝枉,這些鏈接都有共同的class, class="mnav"倦微。

舉個例子妻味,比如定位排在第六個的學(xué)術(shù),可以這樣定位:driver.find_elements_by_class_name("mnav")[5].click()

還可以通過css的復(fù)數(shù)定位寫法:driver.find_elements("css selector",".mnav")[6].click()

當然欣福,也可以借助pop()函數(shù)责球,一般pop()或pop(-1)表示獲取元素種的最后一個,pop(2)表示第三個:

driver.find_elements("css selector",".mnav").pop().click()

JS的5種定位方式總結(jié)
其實看到這里拓劝,上面的定位方式應(yīng)該就基本夠用了雏逾,但是有的時候就是會出現(xiàn)一些詭異的定位失效或者定位到了點擊失效的問題,這個時候如果用js進行直接執(zhí)行該事件郑临,往往就可以解決那些詭異的事情~

id定位:document.getElementById()
name定位:document.getElementsByName()
tag定位:document.getElementsByTagName()
class定位:document.getElementsByClassName()
css定位:document.querySelectorAll()
其中只有id對象用的是Element返回是單個對象栖博,其他都是Elements返回的是一個list這點千萬要注意,具體用法和上面的webdriver基礎(chǔ)定位一樣厢洞。先寫好對應(yīng)的js語句仇让,可以先賦值給一個變量,然后后調(diào)用execute_script進行執(zhí)行一下js就好了躺翻,下面還是結(jié)合那個百度搜索的栗子丧叽,我寫的腳本,可以對應(yīng)學(xué)習實驗一下:

search_js = "document.getElementsByName('wd')[0].value='selenium';"
search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"
button_js = "document.getElementById('su').click();"
button_js2 = "document.getElementsByClassName('s_btn')[0].click()"
driver.execute_script(search_js2)
driver.execute_script(button_js2)
以上分別結(jié)合常用的四種js定位方式寫了四條js語句公你,然后要執(zhí)行的就execute_script一下就好啦~

超神的jQuery定位
據(jù)說會jQuery定位的在定位的路上就是披襟斬棘踊淳,所向披靡如此超神的定位,還是可以了解一下的

jQuery語法是為HTML元素的選取編制的陕靠,可以對元素執(zhí)行一些具體的操作

基礎(chǔ)語法是$(selector).action()

$符號定義jQuery迂尝,selector選擇器用來查詢具體的HTML元素,通過action()來執(zhí)行對元素的具體操作懦傍。

其中我們經(jīng)常用到的action()在jq中有這么幾種:

$(selector).val('input_value') 其中input_value表示要輸入的文本的值

$(selector).val('') 如果為空,則執(zhí)行后是清空的意思

$(selector).click() 行為也是肯定有的

讓我們結(jié)合百度的栗子看一下芦劣,用jQuery的寫法和js有一點點的類似粗俱,但明顯簡潔多了:

search_jq = "('#kw').val('selenium')" button_jq = "('.s_btn').click()"
driver.execute_script(search_jq)
driver.execute_script(button_jq)

以上就是對webdriver的一些基本定位方式總結(jié),我們再來回顧一下:

分別是……

8種webdriver的基本地位方式虚吟,還有對應(yīng)的8種復(fù)數(shù)定位寸认,js有5中定位方式签财,還有超神的jQuery定位,當然偏塞,不要忘了快要失傳的那8種定位唱蒸,一共是30種,在實際應(yīng)用中灸叼,總有一種適合你(●ˇ?ˇ●)

————————————————
版權(quán)聲明:本文為CSDN博主「我的豬很厲害的」的原創(chuàng)文章神汹,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明古今。
原文鏈接:https://blog.csdn.net/qq_32897143/article/details/80383502

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屁魏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捉腥,更是在濱河造成了極大的恐慌氓拼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵碟,死亡現(xiàn)場離奇詭異桃漾,居然都是意外死亡,警方通過查閱死者的電腦和手機拟逮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門撬统,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唱歧,你說我怎么就攤上這事宪摧。” “怎么了颅崩?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵几于,是天一觀的道長。 經(jīng)常有香客問我沿后,道長沿彭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任尖滚,我火速辦了婚禮喉刘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漆弄。我一直安慰自己睦裳,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布撼唾。 她就那樣靜靜地躺著廉邑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛛蒙,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天糙箍,我揣著相機與錄音,去河邊找鬼牵祟。 笑死深夯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诺苹。 我是一名探鬼主播咕晋,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筝尾!你這毒婦竟也來了捡需?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筹淫,失蹤者是張志新(化名)和其女友劉穎站辉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损姜,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡饰剥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摧阅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汰蓉。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棒卷,靈堂內(nèi)的尸體忽然破棺而出顾孽,到底是詐尸還是另有隱情,我是刑警寧澤比规,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布若厚,位于F島的核電站,受9級特大地震影響蜒什,放射性物質(zhì)發(fā)生泄漏测秸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一灾常、第九天 我趴在偏房一處隱蔽的房頂上張望霎冯。 院中可真熱鬧,春花似錦钞瀑、人聲如沸沈撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缠俺。三九已至拧廊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晋修,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工凰盔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墓卦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓户敬,卻偏偏與公主長得像落剪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尿庐,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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