UI自動化(七)selenium元素定位

一满俗、基本元素定位方式

find_element_by_id()????????id屬性定位

find_element_by_name()????????name屬性定位

find_element_by_class_name()????????class_name屬性定位

find_element_by_xpath()????????元素路徑定位

find_element_by_css_selector()???????css定位?

find_element_by_tag_name()????????tag_name定位

find_element_by_link_text()????????完整的超鏈接文字定位

find_element_by_partial_link_text()????????部分超鏈接文字定位

1、find_element_by_id()跪削、find_element_by_name()币他、find_element_by_class_name()

在前端代碼中,id、name和class一般都至少會有其中的一種

2赂韵、find_element_by_xpath()??

xpath是XML路徑語言,它可以用來確定xml文檔中的元素位置挠蛉,通過元素的路徑來完成對元素的查找右锨。HTML就是XML的一種實現(xiàn)方式。

xpath也分幾種不同類型的定位方法碌秸。

(1)絕對路徑定位

這種定位方式是利用html標簽名的層級關系來定位元素的絕對路徑绍移,一般從<html>標簽開始依次往下進行查找。

百度搜索框的絕對路徑xpath定位可以是這樣的:find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")

(2)利用元素屬性定位

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

其中的標簽名input也可以用*來代替讥电,而且只要是在該標簽內(nèi)蹂窖,任意屬性都可以,比如搜索框的maxlength屬性:find_element_by_xpath("http://input[@maxlength='255']")

(3)絕對路徑+元素屬性定位

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

比如查找搜索框的時候發(fā)現(xiàn)其上級元素form有唯一的id屬性進行定位月趟,就可以先查找到form元素然后依次往下寫路徑:find_element_by_xpath("http://form[@id='form']/span/input")

這種定位方式的使用過程中,如果元素的單個屬性無法確定其唯一性恢口,可以用and連接多個屬性去確定孝宗。例如:find_element_by_xpath("http://form[@id='form'and@classname='form']/span/input")

***xpath常用函數(shù)

sibling?提取指定元素的所有同級元素

child 選取當前節(jié)點的所有子節(jié)點

parent 選取當前節(jié)點的父節(jié)點

descendant 選取當前節(jié)點的所有后代節(jié)點

ancestor 選取當前節(jié)點的所有先輩節(jié)點

descendant-or-self 選取當前節(jié)點的所有后代節(jié)點及當前節(jié)點本身

ancestor-or-self 選取當前節(jié)點所有先輩節(jié)點及當前節(jié)點本身

preceding-sibling 選取當前節(jié)點之前的所有同級節(jié)點

following-sibling 選取當前節(jié)點之后的所有同級節(jié)點

preceding 選取當前節(jié)點的開始標簽之前的所有節(jié)點

following 選去當前節(jié)點的開始標簽之后的所有節(jié)點

self 選取當前節(jié)點

attribute 選取當前節(jié)點的所有屬性

namespace 選取當前節(jié)點的所有命名空間節(jié)點

例如:driver.find_element_by_xpath(u"http://div/a[contains(text(), '%s')]/following-sibling::*"%u"新聞")

3、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()

一般class是用.標記,id是用#標記猿诸,標簽名直接寫具體標簽名即可婚被。使用該定位建議了解一下CSS的基礎選擇器知識。

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里面有空格,空格用.進行連接淑廊。

4逗余、find_element_by_tag_name()

通過標簽名去定位的方式一般是這樣的:?find_element_by_tag_name("input")

一般一種標簽在一個頁面里面會出現(xiàn)不止一次甚至大量出現(xiàn),這種定位方式需要分場景使用季惩,一般很少使用录粱。

5、find_element_by_link_text()画拾、find_element_by_partial_link_text()

這兩種定位方式是專門用于定位超鏈接的啥繁,也就是對應html頁面中的<a>標簽,括號里傳的值就是a標簽中的超鏈接文字青抛,兩者的區(qū)別在于一個是完整的超鏈接文字旗闽,一個是可以只寫部分超鏈接文字。例如:

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

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

二蜜另、By定位方式

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")

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

By定位其實就是基本元素定位的一個封裝适室,使用By定位的好處在于PO模式的再封裝不需要羅列大量的基本元素定位方法。

其中By.ID = "id"举瑰,這種轉換可以在代碼中進行打印驗證捣辆。

也就是說find_element(By.ID,"kw")其實可以直接寫成find_element("id","kw")

三、elements復數(shù)定位

以上所有的定位方式element未加s此迅,得到的其實是單個元素對象汽畴,所有的定位方式加上s均可得到元素對象列表,通過下標進行提取耸序。例如:driver.find_elements("css selector",".mnav")[6].click()

四忍些、JS定位方式

id定位:document.getElementById()

name定位:document.getElementsByName()

tag定位:document.getElementsByTagName()

class定位:document.getElementsByClassName()

css定位:document.querySelectorAll()

為了應對有的時候出現(xiàn)的一些詭異的定位失效或者定位到了點擊失效的問題,這個時候如果用js進行直接執(zhí)行該事件坎怪,往往就可以解決那些詭異的事情罢坝,雖然這樣有些不符合自動化的理念,但是不失為一種非常有效的方式芋忿。

需要注意的是:其中只有id對象用的是Element返回是單個對象炸客,其他都是Elements返回的是一個list,具體用法和上面的webdriver基礎定位一樣戈钢。先寫好對應的js語句,可以先賦值給一個變量是尔,然后后調(diào)用execute_script進行執(zhí)行一下js即可殉了。例如:

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)

五、jQuery定位

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

基礎語法是??$(selector).action()? ??$符號定義jQuery众弓,selector選擇器用來查詢具體的HTML元素,通過action()來執(zhí)行對元素的具體操作隔箍。

※ action()操作舉例說明:

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

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

$(selector).click() ????點擊操作

Python中執(zhí)行該語句與js定位方法相同,如下:

inputTest="$(':text').val('測試中')"

driver.execute_script(inputTest)

jQuery的選擇器基本可以分為四大類:基本選擇器(basic)蜒滩、層次選擇器(level)滨达、過濾選擇器(filter)、表單選擇器(form)

1俯艰、基本選擇器

舉例說明:

$("*")?????選取所有元素

$("#lastname”)????選取id="lastname"的元素

:$(".intro”)????選取所有class=“intro"的元素

$(“p")????選取所有<p>元素

$(".intro.demo”)????選取所有 class="intro"且class="demo”的元素.(交集).

selector1, selector2, …, selectorN,?將每一個選擇器匹配到的元素合并后一起返回.(并集).

除了#id選擇器返回單個元素外,其他選擇器返回的都是元素集合捡遍。因為HTML規(guī)范里面id應該是唯一的,所以重復id的元素沒有被考慮,如果多個元素的id相同,取這個id也只能獲取第一個元素.即獲取的jQuery對象的length屬性是1竹握。如果要匹配的元素不存在,則返回一個空的jQuery對象.

基本選擇器之間可以組合,用逗號分隔,結果取所有條件的結果的并集画株。當沒有用逗號分隔時,應該是所有條件都滿足的交集。

2啦辐、層次選擇器

舉例說明:

$(“div span”)????選取<div>里的所有的<span>元素谓传,多個<div>下面的<span>都會被選擇

$(“div>span”)????選取<div>元素下元素名是<span>的子元素,只有直接子元素被選取.其他后代元素不包括

$(“.one+div”)????選取class為one的元素層級的下一個div元素(同一層級)

$(“#two~div”)????選取id為two的元素后面的所有<div>兄弟元素(同一層級)

等價方法:

$(“.one+div”)??等價于方法 $(“.one”).next(“div”)?

$(“#two~div”)??等價于方法?$(“#two”).nextAll(“div”)

$(“prev”).sublings(“next”)方法選取與prev同輩的所有next元素,與前后位置無關

3芹关、過濾選擇器

過濾選擇器這個大類又分為六個子類:基本過濾续挟、內(nèi)容過濾、可見性過濾充边、屬性過濾庸推、子元素過濾、表單對象屬性過濾浇冰。

(1)基本過濾

舉例說明:

:first????$(“div:first”)? ? ?選取所有<div>元素中的第一個元素

:last? ? $(“div:last”)? ? ?選取所有<div>元素中的最后一個元素

:not(selector)????$(“input:not(.myClass)”)? ? ?選取class屬性不是.myClass的<input>元素

:even?????$(“input:even”)? ? 選取索引是偶數(shù)的<input>元素

:odd?????$(“input:odd”)? ? 選取索引是奇數(shù)的<input>元素

:eq(index)?????$(“input:eq(1)”)? ? 選取索引等于1的<input>元素

:gt(index)?????$(“input:gt(1)”)? ? 選取索引大于1的<input>元素

:lt(index)?????$(“input:lt(1)”)? ? 選取索引小于1的<input>元素

:header?????$(“:header”)? ? 選取網(wǎng)頁中所有的<h1><h2><h3>...標題元素

:animated?????$(“div:animated”)? ? 選取網(wǎng)頁中所有正在執(zhí)行動畫的<div>元素

(2)內(nèi)容過濾

舉例說明:

:contains(text)?????$(“div:contains("定位")”)? ? 選取所有含有文本“定位” 的元素

:empty????$(“div:empty”)? ? ?選取所有不包含子元素(包括文本元素)的<div>空元素對象

:parent????$(“div:parent”)?選取所有包含子元素(包括文本元素)的<div>元素對象

:has(selector)? ? $(“div:has(p)”)? ? 選取含有<p>元素的<div>元素

(3)可見性過濾

舉例說明:

:hidden????$(“input?:hidden”)? ? 選取所有不可見的元素贬媒,包括<input type="hidden"/>、?<input?style="display:none;">肘习、<input?style="visibility:hidden;">等元素

:visible? ? $(“div:visible”)? ? 選取所有可見的div元素

(4)屬性過濾

舉例說明:

[attribute]? ??$(“div[id]”)? ? 選取擁有屬性id的元素

[attribute=value]? ??$(“div[title=test]”)? ? 選取屬性title為“test”的元素

[attribute!=value]? ??$(“div[title!=test]”)? ? 選取屬性title不為“test”的元素际乘,沒有title屬性也會被選取

[attribute^=value]? ??$(“div[title^=test]”)? ? 選取屬性title以“test”開頭的元素

[attribute$=value]? ??$(“div[title$=test]”)? ? 選取屬性title以“test”結尾的元素

[attribute*=value]? ??$(“div[title*=test]”)? ? 選取屬性title包含“test”的元素

[slector1][slector2]...[slectorN]? ??$(“div[id][title*=test]”)? ? 選取擁有屬性id,且屬性title包含“test”的元素

(5)子元素過濾

:nth-child(index/even/odd/equation)? ? 選取每個父元素下的第index個元素或者奇偶元素(index從1算起)

:first-child? ? 選取每個父元素的第一個子元素

:last-child? ? 選取每個父元素的最后一個子元素

:only-child? ? 選取某個父元素的唯一子元素漂佩,如果父元素含有其他子元素則不會被選取

(6)表單對象屬性過濾

舉例說明

:enabled? ??$(“#from1 :enabled”)? ? ?選取id為from1的表單內(nèi)的所有可用元素

:disabled? ??$(“#from1 :disabled”)? ? ?選取id為from1的表單內(nèi)的所有不可用元素

:checked? ??$(“input :checked”)? ? ?選取所有被選中的<input>元素(單選框脖含、復選框)

:selected????$(“select :selected”)? ? ?選取所有被選中的選項元素(下拉列表)

4、表單選擇器

:input? ? 選取所有的<input>投蝉、<textarea>养葵、<select>和<button>元素

:text? ? 選取所有的單行文本框

:password? ? 選取所有的密碼框

:radio? ? 選取所有的單選框

:checkbox? ? 選取所有的多選框

:submit? ? 選取所有的提交按鈕

:image? ? 選取所有的圖像按鈕

:reset? ? 選取所有的重置按鈕

:button? ? 選取所有的按鈕

:file? ? 選取所有的上傳域

:hidden? ? 選取所有不可見元素

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘩缆,隨后出現(xiàn)的幾起案子关拒,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件着绊,死亡現(xiàn)場離奇詭異谐算,居然都是意外死亡,警方通過查閱死者的電腦和手機归露,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門洲脂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剧包,你說我怎么就攤上這事恐锦。” “怎么了玄捕?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵踩蔚,是天一觀的道長。 經(jīng)常有香客問我枚粘,道長馅闽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任馍迄,我火速辦了婚禮福也,結果婚禮上,老公的妹妹穿的比我還像新娘攀圈。我一直安慰自己暴凑,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布赘来。 她就那樣靜靜地躺著现喳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犬辰。 梳的紋絲不亂的頭發(fā)上嗦篱,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音幌缝,去河邊找鬼灸促。 笑死,一個胖子當著我的面吹牛涵卵,可吹牛的內(nèi)容都是我干的浴栽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼轿偎,長吁一口氣:“原來是場噩夢啊……” “哼典鸡!你這毒婦竟也來了?” 一聲冷哼從身側響起坏晦,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤椿每,失蹤者是張志新(化名)和其女友劉穎伊者,沒想到半個月后英遭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體间护,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年挖诸,在試婚紗的時候發(fā)現(xiàn)自己被綠了汁尺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡多律,死狀恐怖痴突,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狼荞,我是刑警寧澤辽装,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站相味,受9級特大地震影響拾积,放射性物質發(fā)生泄漏。R本人自食惡果不足惜丰涉,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一拓巧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧一死,春花似錦肛度、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伪煤,卻和暖如春加袋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带族。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工锁荔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝙砌。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓阳堕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親择克。 傳聞我的和親對象是個殘疾皇子恬总,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

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