上一次爬取網易云的個人專輯圖片,這次來介紹WebDriver定位元素的方法。
在社會上,我們要找一個人,首先要確定他身上的屬性,比如:身份證,電話號碼,性別,居住城市,家鄉之類的。而網頁也類似如何,由很多種元素來構成,然后交給瀏覽器進行解析,最后展示的是一個簡潔的頁面。
WebDriver提供多種元素定位方法,下面用Python語言來介紹這些元素定位:
1、id定位
id屬性在HTML文檔中必須是唯一的。WebDriver提供id的定位方法就是通過id屬性來尋找
通過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")百度搜索
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”連接更多的屬性來唯一地標識一個元素。