天天看點

python如何定位路徑_Selenium+Python定位詳解(完整版)

基礎介紹

通過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提取:

python如何定位路徑_Selenium+Python定位詳解(完整版)

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定位的介紹了。