文章目錄
- selenium 簡介
- selenium安裝
- 安裝瀏覽器驅動
- 確定瀏覽器版本
- 下載驅動
- 定位頁面元素
- 打開指定頁面
- id 定位
- name 定位
- class 定位
- tag 定位
- xpath 定位
- css 定位
- link 定位
- partial_link 定位
- 瀏覽器控制
- 修改瀏覽器視窗大小
- 瀏覽器前進&后退
- 瀏覽器重繪
- 瀏覽器視窗切換
- 常見操作
- 滑鼠控制
- 單擊左鍵
- 單擊右鍵
- 雙擊
- 拖動
- 滑鼠懸停
- 鍵盤控制
selenium 簡介
Selenium 是最廣泛使用的開源 Web UI(用戶界面)自動化測驗套件之一,Selenium 支持的語言包括C#,Java,Perl,PHP,Python 和 Ruby,目前,Selenium Web 驅動程式最受 Python 和 C#歡迎, Selenium 測驗腳本可以使用任何支持的編程語言進行編碼,并且可以直接在大多數現代 Web 瀏覽器中運行,在爬蟲領域 selenium 同樣是一把利器,能夠解決大部分的網頁的反爬問題,但也不是萬能的,它最明顯的缺點就是速度慢,下面就進入正式的 study 階段,

selenium安裝
打開 cmd,輸入下面命令進行安裝,
pip install -i https://pypi.douban.com/simple selenium
執行后,使用 pip show selenium 查看是否安裝成功,
安裝瀏覽器驅動
針對不同的瀏覽器,需要安裝不同的驅動,下面列舉了常見的瀏覽器與對應的驅動程式下載鏈接,部分網址需要 “科學上網” 才能打開哦(dddd),
- Firefox 瀏覽器驅動:Firefox
- Chrome 瀏覽器驅動:Chrome
- IE 瀏覽器驅動:IE
- Edge 瀏覽器驅動:Edge
- PhantomJS 瀏覽器驅動:PhantomJS
- Opera 瀏覽器驅動:Opera
這里以安裝 Chrome 驅動作為演示,同時也推薦大家使用 Chrome,別的瀏覽器有些方面有些不足,
確定瀏覽器版本
在新標簽頁輸入 chrome://settings/ 進入設定界面,然后選擇 【關于 Chrome】
查看自己的版本資訊,這里我的版本是94,這樣在下載對應版本的 Chrome 驅動即可,

下載驅動
打開 Chrome驅動 ,單擊對應的版本,

根據自己的作業系統,選擇下載,

下載完成后,壓縮包內只有一個exe檔案,

將 chromedriver.exe 保存到任意位置,并把當前路徑保存到環境變數中(我的電腦>>右鍵屬性>>高級系統設定>>高級>>環境變數>>系統變數>>Path),添加的時候要注意不要把path變數給覆寫了,如果覆寫了千萬別關機,然后百度,添加成功后使用下面代碼進行測驗,
from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()
定位頁面元素
打開指定頁面
使用 selenium 定位頁面元素的前提是你已經了解基本的頁面布局及各種標簽含義,當然如果之前沒有接觸過,現在我也可以帶你簡單的了解一下,
以我們熟知的 CSDN 為例,我們進入首頁,按 F12 進入開發者工具,紅框中顯示的就是頁面的代碼,我們要做的就是從代碼中定位獲取我們需要的元素,

想要定位并獲取頁面中的資訊,首先要使用 webdriver 打開指定頁面,再去定位,
from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
執行上面陳述句后會發現,瀏覽器打開 CSDN 主頁后會馬上關閉,想要防止瀏覽器自動關閉,可以添加下面代碼,
# 不自動關閉瀏覽器
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
這樣將上面的代碼組合再打開瀏覽器就不會自動關閉了,
下面我們再來看看幾種常見的頁面元素定位方式,
id 定位
標簽的 id 具有唯一性,就像人的身份證,假設有個 input 標簽如下,
<input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++難在哪里?">
我們可以通過 id 定位到它,由于 id 的唯一性,我們可以不用管其他的標簽的內容,
driver.find_element_by_id("toolbar-search-input")
name 定位
name 指定標簽的名稱,在頁面中可以不唯一,假設有個 meta 標簽如下
<meta name="keywords" content="CSDN博客,CSDN學院,CSDN論壇,CSDN直播">
我們可以使用 find_element_by_name 定位到 meta 標簽,
driver.find_element_by_name("keywords")
class 定位
class 指定標簽的類名,在頁面中可以不唯一,假設有個 div 標簽如下
<div class="toolbar-search-container">
我們可以使用 find_element_by_class_name 定位到 div 標簽,
driver.find_element_by_class_name("toolbar-search-container")
tag 定位
每個 tag 往往用來定義一類功能,所以通過 tag 來識別某個元素的成功率很低,每個頁面一般都用很多相同的 tag ,比如:\<div\>、\<input\> 等,這里還是用上面的 div 作為例子,
<div class="toolbar-search-container">
我們可以使用 find_element_by_class_name 定位到 div 標簽,
driver.find_element_by_tag_name("div")
xpath 定位
xpath 是一種在 XML 檔案中定位元素的語言,它擁有多種定位方式,下面通過實體我們看一下它的幾種使用方式,
<html>
<head>...<head/>
<body>
<div id="csdn-toolbar">
<div class="toolbar-inside">
<div class="toolbar-container">
<div class="toolbar-container-left">...</div>
<div class="toolbar-container-middle">
<div class="toolbar-search onlySearch">
<div class="toolbar-search-container">
<input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++難在哪里?">
根據上面的標簽需要定位 最后一行 input 標簽,以下列出了四種方式,xpath 定位的方式多樣并不唯一,使用時根據情況進行決議即可,
# 絕對路徑(層級關系)定位
driver.find_element_by_xpath(
"/html/body/div/div/div/div[2]/div/div/input[1]")
# 利用元素屬性定位
driver.find_element_by_xpath(
"//*[@id='toolbar-search-input']"))
# 層級+元素屬性定位
driver.find_element_by_xpath(
"//div[@id='csdn-toolbar']/div/div/div[2]/div/div/input[1]")
# 邏輯運算子定位
driver.find_element_by_xpath(
"//*[@id='toolbar-search-input' and @autocomplete='off']")
css 定位
CSS 使用選擇器來為頁面元素系結屬性,它可以較為靈活的選擇控制元件的任意屬性,一般定位速度比 xpath 要快,但使用起來略有難度,
CSS 選擇器常見語法:
| 方法 | 例子 | 描述 |
|---|---|---|
| .class | .toolbar-search-container | 選擇 class = 'toolbar-search-container' 的所有元素 |
| #id | #toolbar-search-input | 選擇 id = 'toolbar-search-input' 的元素 |
| * | * | 選擇所有元素 |
| element | input | 選擇所有 <input\> 元素 |
| element>element | div>input | 選擇父元素為 <div\> 的所有 <input\> 元素 |
| element+element | div+input | 選擇同一級中在 <div\> 之后的所有 <input\> 元素 |
| [attribute=value] | type='text' | 選擇 type = 'text' 的所有元素 |
舉個簡單的例子,同樣定位上面實體中的 input 標簽,
driver.find_element_by_css_selector('#toolbar-search-input')
driver.find_element_by_css_selector('html>body>div>div>div>div>div>div>input')
link 定位
link 專門用來定位文本鏈接,假如要定位下面這一標簽,
<div class="practice-box" data-v-04f46969="">加入!每日一練</div>
我們使用 find_element_by_link_text 并指明標簽內全部文本即可定位,
driver.find_element_by_link_text("加入!每日一練")
partial_link 定位
partial_link 翻譯過來就是“部分鏈接”,對于有些文本很長,這時候就可以只指定部分文本即可定位,同樣使用剛才的例子,
<div class="practice-box" data-v-04f46969="">加入!每日一練</div>
我們使用 find_element_by_partial_link_text 并指明標簽內部分文本進行定位,
driver.find_element_by_partial_link_text("加入")
瀏覽器控制
修改瀏覽器視窗大小
from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
# 設定瀏覽器瀏覽器的寬高為:600x800
driver.set_window_size(600, 800)
使用 maximize_window() 方法可以實作瀏覽器全屏顯示,
from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
# 設定瀏覽器瀏覽器的寬高為:600x800
driver.maximize_window()
瀏覽器前進&后退
webdriver 提供 back 和 forward 方法來實作頁面的后退與前進,下面我們 ①進入CSDN首頁,②打開CSDN個人主頁,③back 回傳到CSDN首頁,④ forward 前進到個人主頁,
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
# 訪問CSDN首頁
driver.get('https://www.csdn.net/')
sleep(2)
#訪問CSDN個人主頁
driver.get('https://blog.csdn.net/qq_43965708')
sleep(2)
#回傳(后退)到CSDN首頁
driver.back()
sleep(2)
#前進到個人主頁
driver.forward()

細心的讀者會發現第二次 get() 打開新頁面時,會在原來的頁面打開,而不是在新標簽中打開,如果想的話也可以在新的標簽頁中打開新的鏈接,但需要更改一下代碼,執行 js 陳述句來打開新的標簽,
# 在原頁面打開
driver.get('https://blog.csdn.net/qq_43965708')
# 新標簽中打開
js = "window.open('https://blog.csdn.net/qq_43965708')"
driver.execute_script(js)
瀏覽器重繪
在一些特殊情況下我們可能需要重繪頁面來獲取最新的頁面資料,這時我們可以使用 refresh() 來重繪當前頁面,
# 重繪頁面
driver.refresh()
瀏覽器視窗切換
在很多時候我們都需要用到視窗切換,比如:當我們點擊注冊按鈕時,它一般會打開一個新的標簽頁,但實際上代碼并沒有切換到最新頁面中,這時你如果要定位注冊頁面的標簽就會發現定位不到,這時就需要將實際視窗切換到最新打開的那個視窗,我們先獲取當前各個視窗的句柄,這些資訊的保存順序是按照時間來的,最新打開的視窗放在陣列的末尾,這時我們就可以定位到最新打開的那個視窗了,
# 獲取打開的多個視窗句柄
windows = driver.window_handles
# 切換到當前最新打開的視窗
driver.switch_to.window(windows[-1])
常見操作
webdriver中的常見操作有:
| 方法 | 描述 |
|---|---|
send_keys() | 模擬輸入指定內容 |
clear() | 清除文本內容 |
is_displayed() | 判斷該元素是否可見 |
get_attribute() | 獲取標簽屬性值 |
size | 回傳元素的尺寸 |
text | 回傳元素文本 |
接下來還是用 CSDN 首頁為例,需要用到的就是搜素框和搜索按鈕,通過下面的例子就可以氣息的了解各個操作的用法了,

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
sleep(2)
# 定位搜索輸入框
text_label = driver.find_element_by_xpath('//*[@id="toolbar-search-input"]')
# 在搜索框中輸入 Dream丶Killer
text_label.send_keys('Dream丶Killer')
sleep(2)
# 清除搜索框中的內容
text_label.clear()
# 輸出搜索框元素是否可見
print(text_label.is_displayed())
# 輸出placeholder的值
print(text_label.get_attribute('placeholder'))
# 定位搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 輸出按鈕的大小
print(button.size)
# 輸出按鈕上的文本
print(button.text)
'''輸出內容
True
python面試100問
{'height': 32, 'width': 28}
搜索
'''

滑鼠控制
在webdriver 中,滑鼠操作都封裝在ActionChains類中,常見方法如下:
| 方法 | 描述 |
|---|---|
click() | 單擊左鍵 |
context_click() | 單擊右鍵 |
double_click() | 雙擊 |
drag_and_drop() | 拖動 |
move_to_element() | 滑鼠懸停 |
perform() | 執行所有ActionChains中存盤的動作 |
單擊左鍵
模擬完成單擊滑鼠左鍵的操作,一般點擊進入子頁面等會用到,左鍵不需要用到ActionChains,
# 定位搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 執行單擊操作
button.click()
單擊右鍵
滑鼠右擊的操作與左擊有很大不同,需要使用ActionChains,
from selenium.webdriver.common.action_chains import ActionChains
# 定位搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 右鍵搜索按鈕
ActionChains(driver).context_click(button).perform()
雙擊
模擬滑鼠雙擊操作
# 定位搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 執行雙擊動作
ActionChains(driver).double_click(button).perform()
拖動
模擬滑鼠拖動操作,該操作有兩個必要引數,
- source:滑鼠拖動的元素
- target:滑鼠拖至并釋放的目標元素
# 定位要拖動的元素
source = driver.find_element_by_xpath('xxx')
# 定位目標元素
target = driver.find_element_by_xpath('xxx')
# 執行拖動動作
ActionChains(driver).drag_and_drop(source, target).perform()
滑鼠懸停
模擬懸停的作用一般是為了顯示隱藏的下拉框,比如 CSDN 主頁的收藏欄,我們看一下效果,

# 定位收藏欄
collect = driver.find_element_by_xpath('//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[3]/a')
# 懸停至收藏標簽處
ActionChains(driver).move_to_element(collect).perform()
鍵盤控制
webdriver中Keys類幾乎提供了鍵盤上的所有按鍵方法,我們可以使用send_keys + Keys實作輸出鍵盤上的組合按鍵如“Ctrl + C”、“Ctrl + V”等,
# 定位輸入框并輸入文本
driver.find_element_by_id('xxx').send_keys('Dream丶killer')
# 模擬回車鍵進行跳轉(輸入內容后)
driver.find_element_by_id('xxx').send_keys(Keys.ENTER)
# 使用 Backspace 來洗掉一個字符
driver.find_element_by_id('xxx').send_keys(Keys.BACK_SPACE)
# Ctrl + A 全選輸入框中內容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'a')
# Ctrl + C 復制輸入框中內容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'c')
# Ctrl + V 粘貼輸入框中內容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'v')
其他常見鍵盤操作:
| 操作 | 描述 |
|---|---|
Keys.F1 | F1鍵 |
Keys.SPACE | 空格 |
Keys.TAB | Tab鍵 |
Keys.ESCAPE | ESC鍵 |
Keys.ALT | Alt鍵 |
Keys.SHIFT | Shift鍵 |
Keys.ARROW_DOWN | 向下箭頭 |
Keys.ARROW_LEFT | 向左箭頭 |
Keys.ARROW_RIGHT | 向右箭頭 |
Keys.ARROW_UP | 向上箭頭 |
未完待續~
??往期精彩,不容錯過??
總結篇
??兩萬字,50個pandas高頻操作【圖文并茂,值得收藏】??
??吐血總結《Mysql從入門到入魔》,圖文并茂(建議收藏)??
工具篇
??Python實用小工具之制作酷炫二維碼(有界面、附原始碼)??
??Python實用工具之制作證件照(有界面、附原始碼)??
??女朋友桌面檔案雜亂無章?氣得我用Python給她做了一個檔案整理工具??
更多有趣的文章及干貨,盡在
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/303055.html
標籤:python
下一篇:奇技淫巧第二期
