Python Selenium如何定位元素

王平發表於2019-01-06

上一篇文章我們寫了一個簡單的演示程式,完整演示瞭如何開啟瀏覽器,訪問網頁,點選連結,向輸入框輸入文字。點選連結和輸入框我們是靠定位html元素來實現,定位元素是實現Selenium跟頁面互動(點選,輸入行為)的最主要手段,這篇文章就是主講Selenium定位元素的幾種方法。

selenium定位元素

官方給了八種定位方法,一個一個的來介紹用法。

1.find_element_by_class_name通過class name定位元素

我們拿猿人學網站來舉例,目的是把頁面右上角的搜尋框點出來。

猿人學 search class name
猿人學search show

滑鼠右擊搜尋圖示,然後選擇檢查,可以看到搜尋圖示的a標籤的class name是search-show.

開發者工具a標籤

所以find_element_by_class_name方法裡的引數就填search-show:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.com')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

2.find_element_by_id通過id定位元素

接著上面的例子,我們要在輸入框中輸入Python教程幾個字,繼續滑鼠右擊輸入框,選擇檢查,看到input標籤的id是isearch

input框的id值

所以find_element_by_id方法裡填入isearch:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.com')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

search = driver.find_element_by_id("isearch")
search.send_keys(u'python教程')

看程式碼流程是先點搜尋圖示,彈出搜尋框後,才在輸入框裡輸入的,你用肉眼在瀏覽器上看不見的東西,直接去定位元素會報錯的,會報element not visible錯誤,必須先點選它的上層元素,把它暴露出來後,才能定位得到。

3.find_element_by_tag_name通過html tag定位

上面在搜尋框裡輸入字元我們也可以通過定位html tag來實現,輸入框的tag是input,所以程式碼如下:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.com')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

search = driver.find_element_by_tag_name("input")
search.send_keys(u'python教程')

一般不直接通過tag name定位,因為一個頁面相同的html tag有很多,有可能會定位錯誤,我舉得這個例子,剛好頁面只有一個input輸入框。

4.find_element_by_name通過name定位

還是拿上面輸入框舉例,使用上面的方法,右鍵元素-選檢查步驟,可以看到input框的name是’s’。
所以程式碼是 find_element_by_name(‘s’),就不再像上面寫完整的程式碼程式了。

5.find_element_by_css_selector通過css來定位

有時用上述方法定位元素很繁瑣時,往往通過css來定位會很方便,我也常常使用css來定位。來看看操作方法,老規矩還是拿猿人學的搜尋框來舉例。我們右擊搜尋框選擇檢查,開啟chrome的開發者工具,如圖:

input框的css

右邊標紅處就是input框的css,’.search-input’,完整程式碼如下:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.com')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

search = driver.find_element_by_css_selector(".search-input")
search.send_keys(u'python教程')

另外,常常會有兩個以上元素被定義的情況,比如這樣的。

兩個以上的css

需要把中間的空格去掉,寫成這樣:
.find_element_by_css_selector(“.m-page.next”)
三個四個以上的也是這種寫法。

6.find_element_by_xpath通過xpath來定位

這種方法也是很適用,用上述方法難定位的就可以試試,前提是你明白xpath的用法,這裡就不再敘述了。

7.find_elements_by_link_text通過文字連結來定位

這種方法是用來定位文字連結的,就是’‘標籤括起來的文字。
比如我們要定位猿人學選單欄上的Python教程,就這樣寫。

猿人學選單
猿人學選單html程式碼

find_element_by_link_text(u’Python教程’)

第八種方法就是在第七種方法基礎上可以模糊匹配字元。find_elements_by_partial_link_text

在使用上面的方法定位元素時,都要能唯一定位才行,比如一個頁面有幾個相同的id,相同的class name等時,這時就可能定位到錯誤的元素上去,這時就要使用上述方法的複數來定位。
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
element後面多了一個s,會以列表的形式把定位到的相同元素全部返回,你要知道你需要的元素是第幾個,通過陣列下標來取對應的元素。

比如你要點選某個網站第三個連結,寫法如下:
find_elements_by_tag_name(‘a’)[2].click()

Selenium定位元素的方法就寫完了,還有一點說的就是,Selenium涉及到要操作字串的地方,比如向輸入框輸入時,最好用unicode碼。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章