基礎介紹
通過Chrome浏覽器自帶的開發者工具可以看到,頁面元素都是由HTML語言組成的,它們之間有層級地組織起來,每個元素有不同的标簽名和屬性值,Selenium中WebDriver就是根據這些資訊來定位的。
WebDriver提供了8種元素定位方法,在Python中,對應的方法如下:
name
Python
id定位
find_element_by_id()
name定位
find_element_by_name()
tag定位
find_element_by_tag_name()
class定位
find_element_by_class_name()
link_text定位
find_element_by_link_text()
partial link定位
find_element_by_partial_link_text()
Xpath定位
find_element_by_xpath()
CSS_selector定位
find_element_by_css_selector()
下面詳細介紹如何使用這些定位方法,首先複制百度首頁的部分前端代碼,用于舉例說明:
...
id定位
HTML規定,HTML标簽的id屬性值必須是唯一的(如果不唯一,請麻煩前端背鍋)。WebDriver提供的id定位方法是通過元素的id來查找元素的,通過id定位百度輸入框與百度搜尋按鈕的示例如下:
driver.find_element_by_id("kw")
driver.find_element_by_id("su")
name定位
name用來指定元素的姓名(name可以重複),即HTML元素的name屬性,通過标簽的name屬性定位百度輸入框的用法如下:
driver.find_element_by_name("wd")
class定位
class用來指定元素的類名,即HTML元素的class屬性,通過标簽的class屬性定位百度輸入框的用法如下:
driver.find_element_by_class_name("s_ipt")
tag定位
tag用來定義不同頁面的元素,即HTML元素的标簽名,如input标簽、a标簽等,通過tag name定位百度輸入框的用法如下:
driver.find_element_by_tag_name("input")
很少用到。
link_text定位
link_text專門用來定位文本連結,例如百度輸入框上面幾個文字連結的HTML如下:
新聞
hao123
地圖
視訊
貼吧
學術
以下為link_text定位連結的用法(當然是用id或者name都是個不錯的選擇):
driver.find_element_by_link_text("新聞")
driver.find_element_by_link_text("hao123")
driver.find_element_by_link_text("地圖")
driver.find_element_by_link_text("視訊")
driver.find_element_by_link_text("貼吧")
driver.find_element_by_link_text("學術")
partial link定位
partial link用于對link定位的補充,可以取文字連結的部分文字進行定位,注意,需要這部分文字可以唯一地辨別這個連結。
一個很長的文本連結
通過partial link定位如下:
driver.find_element_by_partial_link_text("一個很長的")
driver.find_element_by_partial_link_text("文本連結")
Xpath定位
Xpath通過元素的路徑、屬性或者結合層級與屬性來進行元素定位。對于要使用Xpath進行定位,而又不了解Xpath的人來說,最省事的辦法無非是使用浏覽器自帶的開發者工具進行Xpath提取:

Xpath.png
Copy XPath與Copy full XPath的差別在于,前者會複制混合定位的Xpath,後者則是從HTML頭部開始到該元素所在位置的全XPath路徑。
1.絕對路徑定位
driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[1]/input")
如需了解詳細XPath定位,請移步至XPath教程
2.元素屬性定位
driver.find_element_by_xpath('//input[@id="kw"]')
driver.find_element_by_xpath('//*[@id="su"]')
input表示目前頁面某個input标簽,*号表示不指定标簽名,[@id="kw"]表示這個元素的id值是kw。同理可得:
driver.find_element_by_xpath('//*[@name="wd"]')
driver.find_element_by_xpath('//*[@class="s_ipt"]')
上述XPath定位并不僅限于@id、@name、@class,隻要目标定位元素的屬性能唯一辨別這個元素,即使用該屬性進行辨別。
3.混合定位
如果一個元素本身沒有可以唯一辨別這個元素的屬性值,那麼可以查找能唯一辨別的父級元素,再按層級向下查找至目标元素即可,即以能唯一辨別的父級元素為起點,至目标元素的路徑進行定位。
driver.find_element_by_xpath('//span[@class="bg s_ipt_wr"]/input')
即通過span[@class="bg s_ipt_wr"]找到百度輸入框的父級元素,/input表示父級元素下面的input子元素,若該父級元素下存在多個input标簽的子元素,則可以通過/input[0]、/input[1]等用于區分是第幾個元素。
4.使用邏輯運算符
如果一個屬性不能唯一區分一個元素,name可以使用邏輯運算符連接配接多個屬性來查找元素。
driver.find_element_by_xpath('//input[@id="kw" and @class="s_ipt"]')
表示某個input标簽中id為kw且class為s_ipt的元素,僅以id和class屬性進行舉例,可替換成其他屬性。使用頻率較低。
5.使用contains方法
contains方法用于比對一個屬性中包含的字元串。
driver.find_element_by_xpath('//span[contains(@class,"s_ipt_wr)")]')
表示定位class名包含s_ipt_wr的span标簽。使用頻率較低。
6.使用text()方法
text()方法用于比對顯示文本資訊,如link_text定位可改寫為:
driver.find_element_by_xpath('//a[text(),"新聞")]')
即比對标簽文本為新聞的a标簽。
也可以和上述contains方法結合使用:
driver.find_element_by_xpath('//a[text(),"新聞")]')
即比對标簽文本包含新聞的a标簽,同partial link定位。
CSS定位
CSS是一種語言,用來描述HTML文檔的樣式,通過CSS定位需要了解部分CSS知識,CSS選擇器的常見文法如下:
選擇器
例子
描述
.class
.intro
class選擇器,選擇class="intro"的所有元素
#id
#firstname
id選擇器,選擇id="firstname"的所有元素
*
*
選擇所有元素
element
p
選擇所有
元素
element>element
div>input
選擇父元素為
的所有元素
element+element
div+input
選擇同一級中緊接在
元素隻有的所有元素
[attribute=value]
[target=_blank]
選擇target="_blank"的所有元素
1.通過class定位
driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector(".s_btn")
定位頁面中class為s_ipt、s_btn的元素,點号(.)在CSS中用于指代class名。
2.通過id定位
driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector("#su")
定位頁面中id為kw、su的元素,井号(#)在CSS中用于指代id名。
3.通過标簽名定位
driver.find_element_by_css_selector("input")
定位頁面中标簽為input的元素,使用标簽名定位元素是不需要任何符号辨別,直接使用标簽名即可。
4.通過标簽層級關系定位
driver.find_element_by_css_selector("span > input")
定位頁面中父元素為span的所有input元素。
5.通過屬性定位
driver.find_element_by_css_selector("[autocomplete=off]")
driver.find_element_by_css_selector("[name='kw']")
driver.find_element_by_css_selector('[type="submit"]')
定位頁面中屬性autocomplete=off、name='kw'、type="submit"的元素,同前面所說的屬性定位方法,隻要該屬性能唯一辨別這個元素,均可以進行定位。
6.組合定位
driver.find_element_by_css_selector("form.fm > span > input.s_ipt")
driver.find_element_by_css_selector("form#form > span > input#kw")
定位頁面中标簽名為input,class屬性為s_ipt,父元素為span,父元素的父元素為form且class屬性為fm的元素。
7.更多定位用法
CSS選擇器的更多用法可以檢視CSS選擇器參考手冊。
用By定位元素
用By定位元素和前面所述的八種基本定位方法相同,僅僅是寫法上略有不同而已,具體如下:
name
Python
By定位元素
id定位
find_element_by_id()
find_element(By.ID, "kw")
name定位
find_element_by_name()
find_element(By.NAME, "wd")
tag定位
find_element_by_tag_name()
find_element(By.CLASS_NAME, "s_ipt")
class定位
find_element_by_class_name()
find_element(By.TAG_NAME, "input")
link_text定位
find_element_by_link_text()
find_element(By.LINK_TEXT, "新聞")
partial link定位
find_element_by_partial_link_text()
find_element(By.PARTIAL_LINK_TEXT, "新")
Xpath定位
find_element_by_xpath()
find_element(By.XPATH, "//*[@id='su']")
CSS_selector定位
find_element_by_css_selector()
find_element(By.CSS_SELECTOR, "span.bh s_btn_wr>input#su")
以上就是全部Selenium+Python定位的介紹了。