上一篇文章我們寫了一個簡單的演示程式,完整演示瞭如何開啟瀏覽器,訪問網頁,點選連結,向輸入框輸入文字。點選連結和輸入框我們是靠定位html元素來實現,定位元素是實現Selenium跟頁面互動(點選,輸入行為)的最主要手段,這篇文章就是主講Selenium定位元素的幾種方法。
官方給了八種定位方法,一個一個的來介紹用法。
1.find_element_by_class_name透過class name定位元素
我們拿猿人學網站來舉例,目的是把頁面右上角的搜尋框點出來。
滑鼠右擊搜尋圖示,然後選擇檢查,可以看到搜尋圖示的a標籤的class name是search-show.
所以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
。
所以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,’.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教程')
另外,常常會有兩個以上元素被定義的情況,比如這樣的。
需要把中間的空格去掉,寫成這樣:
.find_element_by_css_selector(“.m-page.next”)
三個四個以上的也是這種寫法。
6.find_element_by_xpath透過xpath來定位
這種方法也是很適用,用上述方法難定位的就可以試試,前提是你明白xpath的用法,這裡就不再敘述了。
7.find_elements_by_link_text透過文字連結來定位
這種方法是用來定位文字連結的,就是’‘標籤括起來的文字。
比如我們要定位猿人學選單欄上的Python教程,就這樣寫。
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碼。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***