WebDriver定位元素方法

上一次爬取網易云的個人專輯圖片,這次來介紹WebDriver定位元素的方法。
在社會上,我們要找一個人,首先要確定他身上的屬性,比如:身份證,電話號碼,性別,居住城市,家鄉之類的。而網頁也類似如何,由很多種元素來構成,然后交給瀏覽器進行解析,最后展示的是一個簡潔的頁面。

WebDriver提供多種元素定位方法,下面用Python語言來介紹這些元素定位:
1、id定位
id屬性在HTML文檔中必須是唯一的。WebDriver提供id的定位方法就是通過id屬性來尋找


搜狗截圖17年11月25日2018_1.png

通過find_element_by_id(id的名稱) 如:
find_element_by_id("kw") 百度輸入框
find_element_by_id("su") 百度搜索

2、name定位
HTML規定name來指定元素的名稱,通過name來定位百度輸入框
find_element_by_name(填寫name屬性的值)
如百度輸入框:find_element_by_name("wd")

3、class定位
HTML規定clss來指定元素的類名。其用法與id、name類似,如通過class屬性定位百度輸入框和搜索按鈕:
find_element_by_class_name("s_ipt")
find_element_by_class_name("s_btn")
即find_element_by_class_name()方法通過class屬性來定位元素。

4、tag定位
HTML的本質就是通過tag來定義實現不同的功能,HTML是由tag來構成的,所以往往運用tag來定位的話,都是定位一類功能,比如下拉框,單選框或者常用的輸入框。如通過tag name定位百度的輸入框
find_element_by_tag_name("input")
即find_element_by_tag_name()方法通過元素的tag name來定位元素。

5、link定位(一般用于a標簽里面的文本元素)
find_element_by_link_text("新聞")

find_element_by_link_text("hao123")

find_element_by_link_text("地圖")

find_element_by_link_text("視頻")

find_element_by_link_text("貼吧")

find_element_by_link_text()方法通過元素標簽對之間的文本信息來定位元素。
7、Xpath定位
Xpath是一種在XML文檔中定位元素的語言。因為HTML可以看作XML的一種實現,所以可以使用這種強大的語言在web應用中定位元素。相當于絕對路徑,一般都是唯一的。
find_element_by_xpath("html/body/div/div/div/div/div/form/span/input") 百度輸入框
find_element_by_xpath("html/body/div/div/div/div/div/form/span[2]/input")百度搜索


搜狗截圖17年11月25日2030_2.png

Xpath主要用標簽名的層級關系來定位元素的絕對路徑,最外層為html語言。在body文本內,一級一級往下查找,如果一個層級下有多個相同的標簽名,那個就按上下順序確定是第幾個
圖上的方法,比較容易尋找到元素的Xpath
利用元素屬性定位

除了使用絕對路徑外,Xpath也可以使用元素的屬性來定位。同樣以百度輸入框和搜索按鈕為例:

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

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

//表示當前頁面某個目錄下,input表示定位元素的標簽名,[@id='kw']表示這個元素的id屬性值等于kw。下面通過name和class屬性值來定位:

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

find_element_by_xpath("http://input[@class='s_ipt']")

find_element_by_xpath("http://*[@class='s_btn']")

如果不想指定標簽名,可以用星號(*)代替。當然,使用Xpath不局限于id、name、class三個屬性值,元素的任意屬性值都可以使用,只要它能唯一的標識一個元素。

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

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

find_element_by_xpath("http://input[@type='snbmit']")

層級與屬性結合

如果一個元素本身沒有可以唯一標識這個元素的屬性值,那么可以找其上一級元素,如果它的上一級元素有可以唯一標識屬性的值,也可使用。

假如百度輸入框本身沒有可以利用的屬性值,那么可以查找它的上一級屬性,如下:

find_element_by_xpath("http://span[@class='s_ipt_wr']/input")

span[@class='bg s_ipt_wr']通過class屬性定位父元素,后面/input就表示父元素下面的子元素。如果父元素沒有可利用的屬性值,那么可以繼續向上查找“爺爺”元素。

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

find_element_by_xpath("http://form[@id='form']/span[2]/input") #百度搜索按鈕

可以通過這種方法一級一級地向上查找,直到最外層的<html>標簽,也是一個絕對路徑的寫法了。

使用邏輯運算符

如果一個屬性不能唯一地區分一個元素,我們還可以使用邏輯運算符連接多個屬性來查找元素。如同時使用id和class來唯一標識百度輸入框,通過邏輯運算符“and”來連接兩個條件。如下:

find_element_by_xpath("http://input[@id='kw' and @class='s_ipt']/span/input")

當然可以用“and”連接更多的屬性來唯一地標識一個元素。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容