說明:在HTML頁面中,<p> 是一個標籤,<p>hello</p> 是一個元素,元素由一個開始的標籤和結束的標籤組成。<font color="red">標籤包含屬性名color,屬性值為red。
說明:CSS的id選擇器,id常用於JS操作DOM節點物件。當同個id被多次參照時,通過getElementById方法獲取到的是在檔案中第一個出現該id的標籤(DOM節點物件),因此id一般只被參照於一個標籤。
範例:
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">
定位:
input = find_element_by_id("su")
說明:CSS的.class選擇器,用於包裝一組樣式和佈局供標籤參照,常被複用於多個標籤,且多個class可同時作用於同一個標籤(多個class通過空格隔開,如:class="btn self-btn bg s_btn")。
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
定位:
input = find_element_by_class("s_ipt")
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">
定位:當標籤被多個class作用時,此時不推薦使用class定位,因為通常會定位到多個元素,可通過XPath定位和CSS定位代替。
注意:class定位只能使用一個class,而XPath定位和CSS定位則需要輸入所有class
# class定位
input_1 = find_element_by_class("btn")
input_2 = find_element_by_class("self-btn")
input_3 = find_element_by_class("bg s_btn")
# XPath定位
input_4 = find_element_by_Xpath('//input[@class="btn self-btn bg s_btn"]')
# CSS定位
input_5 = find_element_by_css('input[class="btn self-btn bg s_btn"]')
說明:HTML標籤中name屬性相當於一個變數名,value屬性相當於一個變數值,在JS中以及向網站後端傳送引數時,與value一起用,比如name是「color」,value是「red」,那麼就會有引數color=「red」
範例:
<input id="kw" name="wd" class="s_ipt" value="輸入框的內容" maxlength="255" autocomplete="off">
定位:
input = find_element_by_name("wd")
說明:根據標籤名稱定位,常被用來定位一類功能,HTML頁面中有很多相同的標籤,因此很少用tag定位單個元素。
範例:
<iframe src="https://www.google.com/recaptcha/api2/aframe" width="0" height="0" style="display: none;">
定位:
iframe = find_element_by_tag_name("iframe")
說明:專門定位文字連結元素,通過<a>標籤對之間的文字資訊來定位元素。
範例:
<a href="http://news.baidu.com">新聞</a>
定位:
driver.find_element_by_link_text("新聞")
說明:partial_link_text定位是對link_text定位的一種補充,有些文字連結比較長,這個時候我們可以取文字連結的部分文字進行定位,只要這部分文字可以唯一地標識這個連結即可。
範例:
<a class="mnav" name="tj_lang" href="#">一個很長的文字連結</a>
定位:
driver.find_element_by_partial_link_text("文字連結")
說明:XPath 是用於在 XML 檔案中定位節點的語言。由於 HTML 可以是 XML (XHTML) 的實現,因此 Selenium 使用者可以利用這種強大的語言來定位其 Web 頁面中的元素。
XPath定位方法:
絕對路徑
# 定位該路徑的input元素
driver.find_element_by_xpath("html/body/div/form/input")
相對路徑
# 定位form元素下的input元素
driver.find_element_by_xpath("//form/input")
元素索引
# 定位form元素下第一個input元素
driver.find_element_by_xpath("//form/input[1]") # 索引從[1]開始
屬性
# 定位包含value屬性的input元素
driver.find_element_by_xpath("//input[@value]") # 屬性前必須帶@
屬性+屬性值
# 定位包含value屬性值為‘xxx’的input元素
driver.find_element_by_xpath("//input[@value='xxx']")
# 注意:使用class屬性定位時,需寫入該元素所有class值才能定位到
driver.find_element_by_xpath("//input[@class='a b c']") # 多個class值通過空格隔開分別為a,b,c
*號(任意值)
# 定位包含value屬性的任意元素
driver.find_element_by_xpath("//*[@value]")
# 定位包含任意屬性的值等於'xxx'的input元素
driver.find_element_by_xpath("//input[@*='xxx']")
層級與屬性結合
# 定位包含id屬性值為'xxx'的from元素下的input元素
driver.find_element_by_xpath("//from[@id='xxx']/input")
# 跨級定位
driver.find_element_by_xpath("//from[@id='xxx']/*/input") # 跨一級
driver.find_element_by_xpath("//from[@id='xxx']/*/*/input") # 跨兩級
driver.find_element_by_xpath("//from[@id='xxx']//input") # 跨多級
軸方式定位
軸表示式說明:
parent::* :表示當前節點的父節點元素,同: //div/..
ancestor::* :表示當前節點的祖先節點元素
descendant::* : 表示當前節點的子孫節點元素
child::* :表示當前節點的子元素//A/descendant::* 表示A的所有後代元素,同://A/*
self::* :表示當前節點的自身元素
ancestor-or-self::* :表示當前節點的及它的祖先節點元素
descendant-or-self::* :表示當前節點的及它們的後代元素
following-sibling::* :表示當前節點的後序所有兄弟節點元素
preceding-sibling::* :表示當前節點的前面所有兄弟節點元素
following::* :表示html結構中當前節點的之前所有層級元素
preceding::* :表示html結構中當前節點的之後所有層級元素
定位:
# 定位父級元素
driver.find_element_by_xpath('//*[@class="值"]/parent::*')
driver.find_element_by_xpath('//*[@class="值"]/..')
# 定位指定的祖先元素
driver.find_element_by_xpath('//input[@id="su"]//ancestor::div')
driver.find_element_by_xpath('//input[@id="su"]//ancestor::div[@id="s_fm"]')
# 定位當前元素之前的所有同級元素
driver.find_elements_by_xpath('//*[@class="值"]/preceding-sibling::*')
# 定位當前元素之後的所有同級的input元素
driver.find_elements_by_xpath('//*[@class="值"]/following-sibling::input')
# 定位同級元素的上n個元素(n從1開始)
driver.find_element_by_xpath('//*[@class="值"]/preceding-sibling::*[n]')
# 定位同級元素的下n個元素(n從1開始)
driver.find_element_by_xpath('//*[@class="值"]/following-sibling::*[n]')
text()標籤對文字方法
範例:
<button>登入</button>
注意:「 text() 」可通過「 . 」表示!
定位:
# 定位標籤對文字等於‘登入’的button元素,注意非屬性不需要@
driver.find_element_by_xpath('//button[text()="登入"]')
# 用「 . 」代替text()
driver.find_element_by_xpath('//button[.="登入"]')
模糊屬性值匹配方法
範例:
<button id="a_b_c">請點選登入</button>
定位:
starts-with(@屬性/text(),開頭值):
driver.find_element_by_xpath('//button[starts-with(@id,"a")]')
driver.find_element_by_xpath('//button[starts-with(text(),"請")]')
ends-with(@屬性/text(),結尾值):
driver.find_element_by_xpath('//button[ends-with(@id,"c")]')
driver.find_element_by_xpath('//button[ends-with(text(),"登入")]')
contains(@屬性/text(),包含值):
driver.find_element_by_xpath('//button[contains(@id,"b")]')
driver.find_element_by_xpath('//button[contains(text(),"點選")]')
and、or、not
範例:
<input id="su" value="abc">百度一下</input>
定位:
# 定位包含id屬性值為「su"和value屬性值為「abc」的input元素
driver.find_element_by_xpath('//input[@id="su" and @value="abc"]')
# 定位包含id屬性值為「su"或「kw」的input元素
driver.find_element_by_xpath('//input[@id="su" or @id="kw"]')
# 定位不包含id屬性值為「kw」的input元素
driver.find_element_by_xpath('//input[not(@id="kw")]')
last()方法
定位:
# 定位搜尋到的最後一個元素
driver.find_element_by_xpath('//ul/li[last()]')
# 定位搜尋到的倒數第二個元素
driver.find_element_by_xpath('//ul/li[last()-1]')
計算符方式定位
範例:
<body>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
</body>
定位:
# 定位標籤文字等於1的p元素
driver.find_element_by_xpath('//body/p[.=1]')
# 定位標籤文字不等於2的p元素
driver.find_element_by_xpath('//body/p[.!=2]')
# 定位標籤文字大於3的p元素
driver.find_element_by_xpath('//body/p[.>3]')
# 定位標籤文字小於等於3的p元素
driver.find_element_by_xpath('//body/p[.<=4]')
position()方法定位
範例:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
定位:
# 定位第一個li元素
driver.find_element_by_xpath('//ul/li[position()=1')
# 定位第三個li元素
driver.find_element_by_xpath('//ul/li[position()=3')
根據子元素定位父元素
範例:
<ul>
<li id="test">1</li>
</ul>
定位:
# 定位子元素含有li元素的ul元素
driver.find_element_by_xpath('//ul[li]')
# 定位子元素含有li元素且li元素id屬性值為test的所有元素
driver.find_element_by_xpath('//*[li[@id="test"]]')
# 定位子孫元素含有li元素且li元素id屬性值為test的所有元素
driver.find_element_by_xpath('//*[.//*[@id="test"]]')
說明:CSS指層疊樣式表(Cascading Style Sheet),用來定義如何顯示HTML和XML的元素。CSS使用選擇器為頁面元素繫結屬性。
CSS定位方法:
.class選擇器
範例:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
定位:
# 點號(.)加class屬性值
driver.find_element_by_css_selector(".s_ipt")
擴充套件範例:
<span class="btn_wr s_btn_wr bg" id="s_btn_wr">
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn"></span>
定位:
# .btn_wr.s_btn_wr:定位class屬性中同時有btn_wr和s_btn_wr的元素
driver.find_element_by_css_selector(".btn_wr.s_btn_wr")
# .btn_wr .btn:定位class屬性為tn_wr元素的後代包含class屬性為btn的所有元素
driver.find_element_by_css_selector(".btn_wr .btn")
#id選擇器
範例:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
定位:
# 井號(#)表示通過id屬性值來定位
driver.find_element_by_css_selector("#kw")
# 定位class屬性值包含form的元素的子孫元素且子孫元素id屬性值為kw
driver.find_element_by_css_selector(".form #kw")
標籤名.class值、標籤名#id值
範例:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
定位:
# 定位class屬性值含有s_ipt的input標籤元素
driver.find_element_by_css_selector("input.s_ipt")
# 定位id屬性值為kw的input標籤元素
driver.find_element_by_css_selector("input#kw")
# 定位class屬性值含有s_ipt且id屬性值為kw的input標籤元素
driver.find_element_by_css_selector("input.s_ipt#kw")
標籤名[屬性名=屬性值]
範例:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
定位:
# 定位name屬性值為wd的input標籤元素
driver.find_element_by_css_selector('input[name="wd"]')
# 定位type屬性值為text的所有元素
driver.find_element_by_css_selector('[type="text"]')
# 定位name屬性值為wd的input且type屬性值為text的input標籤元素
driver.find_element_by_css_selector("input[name="wd"][type="text"]")
屬性模糊值定位
範例:
<input type="text" class="abc ede fgh" name="s_ipt" id="kw" maxlength="100">
定位:
# 定位name屬性值以s_開頭的元素
driver.find_element_by_css_selector('[name^="s_"]')
# 定位name屬性值包含_ip的元素
driver.find_element_by_css_selector('[name*="_ip"]')
# 定位name屬性值以ipt結尾的元素
driver.find_element_by_css_selector("[name$="ipt"]")
# 定位class屬性包含ede純字母單詞的元素,非字母分割
driver.find_element_by_css_selector("[class~="ede"]")
# 定位class以abc純字母單詞開頭的元素,非字母分割
driver.find_element_by_css_selector("[class|="ede"]")
層級定位
範例:
<div>
<ul>
<li>1</li>
<li>2</li>
</ul>
</div>
定位:
# 根據路徑定位li元素
driver.find_element_by_css_selector('div>ul>li')
# 定位div元素下所有li子孫元素
driver.find_element_by_css_selector('div li')
# 定位div元素下下層的li元素
driver.find_element_by_css_selector('div>*>li')
定位同級兄弟元素
範例:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
<li>1</li>
<li>2</li>
定位:
# 定位input元素下一個li兄弟元素
driver.find_element_by_css_selector('input#kw+li')
# 定位input元素以後所有li兄弟元素
driver.find_element_by_css_selector('input#kw~li')
偽類定位元素
div>:first-child # 定位div元素下第一個子元素
div>:nth-child(2) # 定位div元素下第二個子元素
div>:last-child # 定位div元素下最後個子元素
input:focus # 定位獲取焦點的input元素
input:enabled # 定位可操作的input元素
input:checked # 定位處於勾選狀態的checkbox元素
input:not([id]) # 定位所有無id屬性的input元素
多標籤定位
範例:
<input type="text" class="s_ipt" name="wd" id="kw">
<li id="ts">1</li>
定位:
# 同時定位input元素和li元素
driver.find_element_by_css_selector('input, li')
driver.find_element_by_css_selector('input[name="wd"], li#ts')
注意:","後面需接空格。