目錄
-
安裝
-
下載驅動
-
元素選取
-
輸入、清除、點擊
-
關閉窗口、瀏覽器
-
窗口切換
-
頁面(frame)切換
-
頁面彈窗
-
等待加載
-
動作鏈
-
鍵盤事件
-
執行js(滑動滾動條)
-
截圖
-
獲取元素屬性
-
獲取網頁源代碼、刷新頁面
-
設置窗口大小
-
設置代理、UA
-
Cookie操作
-
跳過Selenium檢測
-
示例
安裝
pip install selenium
元素選取
單個元素查找方法
-
注: 其中的element加上一個s,則是對應的多個元素的查找方法
- 通過xpath查找
- find_element_by_xpath()
- 通過id查找
- find_element_by_id()
- 通過class屬性查找
- find_element_by_class_name()
- 通過css選擇器查找 ( 語法規則 )
- find_element_by_css_selector()
- 通過鏈接文本查找
- find_element_by_link_text()
- 通過鏈接文本的部分匹配查找
- find_element_by_partial_ink_text()
- 通過name屬性進行查找
- find_element_by_name()
- 通過標簽名查找
- find_element_by_tag_name()
- find_element_by_tag_name()
兩種方法集成了上面所有的查找方法
find_element(By.ID, '...')
- 通過ID查找一個
find_elements(By.XPATH, '...')
- 通過Xpath查找多個
By.xxx 選擇使用的查找方法,使用xxx方式解析
-
By對象導入: from selenium.webdriver.common.by import By
輸入、清除、點擊 示例 回到目錄
- 輸入內容
- send_keys('內容')
- 清除內容
- clear()
- 點擊
- click()
- click()
關閉窗口、瀏覽器 示例 回到目錄
- 關閉當前句柄窗口(不關閉進程)
- close()
- 關閉整個瀏覽器進程
- quit()
- quit()
窗口切換 示例 回到目錄
用selenium操作的是第一個打開的窗口,新打開的窗口是無法直接去操作的
需要切換窗口的句柄
- 獲取所有窗口的句柄
- window_handles
- window_handles的順序並不是瀏覽器上窗口的順序
- window_handles
- 獲取當前窗口的句柄
- current_window_handle
- 切換句柄到指定的窗口
- switch_to.window( window_handles[1] )
- switch_to.window( window_handles[1] )
頁面(frame)切換 示例 回到目錄
iframe標簽 通常出現在登錄頁面
- 切到指定frame,可用id、name、元素定位
- switch_to.frame()
- 切到父級frame,如果已是主文檔,則無效果,相當於后退回去
- driver.switch_to.parent_frame()
- 切換到主頁面,DOM樹最開始的frame
- driver.switch_to_default_content()
- driver.switch_to_default_content()
頁面彈窗 示例 回到目錄
- 定位到alert彈窗,返回一個彈窗的對象
- switch_to.alert
- 對彈窗對象的取消操作(相當於點擊彈窗上的取消按鈕)
- dismiss()
- 對彈窗對象的確定操作(相當於點擊彈窗上的確定按鈕)
- accept()
- 對彈窗對象內的輸入框輸入數據(針對於prompt彈窗)
- send_keys(key)
- 獲取彈窗內的文本
- text
- text
等待加載 示例 回到目錄
導入WebDriverWait
- from selenium.webdriver.support.wait import WebDriverWait
導入expected_conditions
- from selenium.webdriver.support import expected_conditions as EC
顯式等待
- 指定某個條件,然后設置最長等待時間,每隔一定時間檢查一次(默認0.5秒)
- 如果條件成立,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出超時異常:TimeoutException
- WebDriverWait(driver, timeout, poll_frequency,igonred_exceptions).until(method, message)
- driver:WebDriver的實例
- timeout: 等待的最長時間
- poll_frequency:調用until中的方法的間隔時間,默認0.5秒
- igonred_exceptions:忽略的異常,如果在調用until的過程中拋出這個元組中的異常,則不中斷代碼,繼續等待
等待條件:expected_conditions
- 這兩個條件驗證元素是否出現,傳入的參數都是元組類型的locator,如(By.ID, 'kw'),一個只要一個符合條件的元素加載出來就通過;另一個必須所有符合條件的元素都加載出來才行
- presence_of_element_located (這個用的次數最多)
- presence_of_all_elements_located
- 這兩個條件類驗證title,驗證傳入的參數title是否等於或包含於driver
- title_is
- title_contains
- 這三個條件驗證元素是否可見,前兩個傳入參數是元組類型的locator,第三個傳入WebElement
- visibility_of_element_located
- invisibility_of_element_located
- visibility_of
- 判斷某段文本是否出現在某元素中,一個判斷元素的text,一個判斷元素的value
- text_to_be_present_in_element
- text_to_be_present_in_element_value
- 判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement
- frame_to_be_available_and_switch_to_it
- 判斷是否有alert出現
- alert_is_present
- 判斷元素是否可點擊,傳入locator
- element_to_be_clickable
隱式等待
- 設置一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然后執行下一步
- 隱性等待對整個driver的周期都起作用,所以只要設置一次即可,默認等待時間為0
- driver.implicitly_wait(10) #隱式等待,最長10s
- 弊端
- 程序會一直等待整個頁面加載完成,就算你需要的元素加載出來了還是需要等待
- 也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步
隱性等待和顯性等待可以同時用,等待的最長時間取兩者之中的最大者
動作鏈 示例 回到目錄
導入ActionChains:from selenium.webdriver.common.action_chains import ActionChains
- 執行鏈中的所有動作
- perform()
- 點擊鼠標左鍵,按住不放
- click_and_hold(on_element=None)
- 在某個元素位置松開鼠標左鍵
- release(on_element=None)
- 將鼠標移動到當前鼠標位置的偏移位置
- move_by_offset(xoffset, yoffset)
- 將鼠標移動到距某個元素多少距離的位置
- move_to_element_with_offset(to_element, xoffset, yoffset)
- 拖拽到某個元素然后松開
- drag_and_drop(source, target)
- 拖拽到某個坐標然后松開
- drag_and_drop_by_offset(source, xoffset, yoffset)
- 鼠標移動到某個元素
- move_to_element(to_element)
- 雙擊鼠標左鍵
- double_click(on_element=None)
- 單擊鼠標右鍵
- context_click(on_element=None)
- 鼠標左鍵單擊傳入的元素
- click(on_element=None)
鍵盤事件 示例 回到目錄
Keys對象導入:from selenium.webdriver.common.keys import Keys
- 刪除鍵(BackSpace)
- send_keys(Keys.BACKSPACE)
- 空格鍵(Space)
- send_keys(Keys.SPACE)
- 制表鍵(Tab)
- send_keys(Keys.TAB)
- 回退鍵(Esc)
- send_keys(Keys.ESCAPE)
- 回車鍵(Enter)
- send_keys(Keys.ENTER)
- 全選(Ctrl+A)
- send_keys(Keys.CONTROL,'a')
- 復制(Ctrl+C)
- send_keys(Keys.CONTROL,'c')
- 剪切(Ctrl+X)
- send_keys(Keys.CONTROL,'x')
- 粘貼(Ctrl+V)
- send_keys(Keys.CONTROL,'v')
- 鍵盤 F1
- send_keys(Keys.F1)
- 鍵盤 F12
- send_keys(Keys.F12)
- send_keys(Keys.F12)
執行js 示例 回到目錄
- execute_script( js語句 )
截圖 示例 回到目錄
- 截圖保存
- get_screenshot_as_file('***.png')
- 將截圖作為二進制數據返回
- get_screenshot_as_png()
- get_screenshot_as_png()
獲取元素屬性 示例 回到目錄
- 獲取元素標簽上的屬性
- get_attribute('href')
- 元素的坐標
- location
- 元素的大小
- size
- size
獲取網頁源代碼、刷新頁面 示例 回到目錄
- 網頁源代碼
- page_source
- 刷新頁面
- refresh()
- refresh()
設置窗口大小 示例 回到目錄
- 最小化
- minimize_window()
- 最大化
- maximize_window()
- 設置窗口具體的大小
- set_window_size(width,height)
- 設置窗口位置
- set_window_position(x,y)
- set_window_position(x,y)
設置代理、UA 示例 回到目錄
- 設置代理
- webdriver.ChromeOptions().add_argument(
'--proxy-server=http://IP:Port'
)
- webdriver.ChromeOptions().add_argument(
- 設置UA
- webdriver.ChromeOptions().add_argument('User-Agent=ua')
- "="兩邊不能有空格
Cookie操作 示例 回到目錄
- 獲取Cookie
- get_cookies()
- 添加Cookie
- add_cookie()
- 添加cookie前需要先打開任意一個網頁
- 否則會報錯:InvalidCookieDomainException: Message: invalid cookie domain
- 刪除Cookie
- delete_all_cookies()
- Cookie鍵名
- name:cookie的名稱
- value:cookie對應的值
- domain:服務器域名
- expiry:cookie有效終止日期
- path:path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的cookie
- httpOnly:防腳本攻擊
- secure:規定cookie只能在https協議下才能夠發送到服務器
跳過Selenium檢測 示例 回到目錄
window.navigator.webdriver
- 普通瀏覽器,js 中,window.navigator.webdriver 為 undefined
- Selenium ,js 中,window.navigator.webdriver 為 True
- 使用
- webdriver.ChromeOptions().add_experimental_option('excludeSwitches', ['enable-automation'])
- webdriver.ChromeOptions().add_experimental_option('excludeSwitches', ['enable-automation'])
示例
執行js(滑動滾動條)、窗口切換、關閉窗口、關閉瀏覽器 回到目錄
import time
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get("http://news.baidu.com/")
print('執行js打開新窗口前')
print('所有窗口的句柄:', driver.window_handles)
print('當前窗口的句柄:', driver.current_window_handle)
# 執行js打開新窗口
new_js = 'window.open("https://www.toutiao.com/")'
driver.execute_script(new_js)
print('執行js打開新窗口后')
all_handle = driver.window_handles
print('所有窗口的句柄:', all_handle)
print('當前窗口的句柄:', driver.current_window_handle)
print('切換句柄...')
driver.switch_to.window(all_handle[1])
print('當前窗口的句柄:', driver.current_window_handle)
# 頁面高度
height = 0
# 執行js滑動滾動條
while height < 10000:
# 滑動滾動條到指定位置
driver.execute_script('document.documentElement.scrollTop=10000')
# 頁面高度
height = driver.execute_script('return document.body.scrollHeight')
time.sleep(2)
# 關閉新打開的窗口
driver.close()
finally:
time.sleep(3)
# 關閉瀏覽器
driver.quit()
登錄QQ空間:frame切換、輸入內容、清除內容、點擊、鍵盤事件 回到目錄
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
try:
driver.get("https://qzone.qq.com/")
time.sleep(0.5)
"""通過元素定位,切到指定frame(登錄框)
frame = driver.find_element(By.XPATH,'//iframe')
driver.switch_to.frame(frame)
"""
# 也可通過 ID 或 name 定位 frame
driver.switch_to.frame('login_frame')
# 點擊 帳號密碼登錄
driver.find_element(By.LINK_TEXT, '帳號密碼登錄').click()
time.sleep(0.5)
text_box = driver.find_element(By.ID, 'u')
# 輸入內容
text_box.send_keys('0123456789')
time.sleep(1)
# 清除內容
text_box.clear()
time.sleep(1)
text_box.send_keys('正確的賬號')
password_box = driver.find_element(By.CSS_SELECTOR, '.inputstyle.password')
password_box.send_keys('正確的密碼')
time.sleep(1.5)
# 執行鍵盤操作:回車鍵
password_box.send_keys(Keys.ENTER)
time.sleep(7)
finally:
time.sleep(3)
# 關閉瀏覽器
driver.quit()
頁面彈窗、截圖、獲取元素屬性 回到目錄
import time
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get("https://www.baidu.com/")
time.sleep(0.3)
driver.find_element_by_link_text('設置').click()
time.sleep(0.3)
driver.find_element_by_link_text('搜索設置').click()
time.sleep(0.3)
driver.find_element_by_link_text('保存設置').click()
time.sleep(1)
# 獲取彈窗的對象
alert_box = driver.switch_to.alert
# 獲取彈窗的內容
print('彈窗內容:',alert_box.text)
# 對彈窗對象的確定操作
alert_box.accept()
# 按鈕:百度一下
button = driver.find_element_by_css_selector('[type="submit"]')
# 獲取元素標簽上的屬性
print('get_attribute:', button.get_attribute('value'))
# 元素的坐標
print('location:', button.location)
# 元素的大小
print('size:', button.size)
# 截圖
driver.get_screenshot_as_file('1.png')
finally:
time.sleep(3)
# 關閉瀏覽器
driver.quit()
設置窗口大小、獲取網頁源代碼、刷新頁面 回到目錄
import time
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get("https://www.toutiao.com/")
time.sleep(1)
# 最小化
driver.minimize_window()
time.sleep(1)
# 設置窗口具體的大小
driver.set_window_size(500,500)
time.sleep(1)
# 設置窗口位置
driver.set_window_position(800,200)
time.sleep(1)
# 最大化
driver.maximize_window()
time.sleep(1)
# 打印網頁源碼(JS渲染過的)
print(driver.page_source)
# 刷新當前頁面
driver.refresh()
finally:
time.sleep(3)
# 關閉瀏覽器
driver.quit()
Cookie操作 回到目錄
import time
import json
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get('https://www.cnblogs.com/')
"""獲取Cookie
# 等待60秒用於手動登錄
time.sleep(60)
# 保存獲取到的Cookie
cookies = driver.get_cookies()
with open('1.txt', 'w+') as f:
f.write(json.dumps(cookies))
"""
"""添加Cookie
with open('1.txt') as f:
cookies = json.loads(f.read())
# 添加cookie前需要先打開任意一個網頁
# 然后再進行添加
# 否則會報錯:InvalidCookieDomainException: Message: invalid cookie domain
for cookie in cookies:
driver.add_cookie(cookie)
# 添加完畢后,再打開對應網頁,便是已登錄狀態
driver.get('https://www.cnblogs.com/')
time.sleep(5)
"""
"""清空cookie
driver.delete_all_cookies()
# 清空cookie后是未登錄的狀態
driver.get('https://www.cnblogs.com/')
"""
finally:
time.sleep(3)
driver.quit()
設置代理、UA 回到目錄
import time
from selenium import webdriver
opt = webdriver.ChromeOptions()
# 設置代理
opt.add_argument('--proxy-server=http://121.40.162.239:808')
# 設置UA
opt.add_argument('User-Agent=ABCDEFG')
driver = webdriver.Chrome(options=opt)
try:
driver.get('http://httpbin.org/get')
finally:
time.sleep(3)
driver.quit()
等待加載 回到目錄
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
try:
driver.get('https://www.python.org/getit/')
# 顯式等待的等待條件 --> 參數為數組類型
method = EC.presence_of_element_located((By.LINK_TEXT, 'Downloads'))
# 顯式等待
WebDriverWait(driver, 20, 0.2).until(method)
# 隱式等待
# driver.implicitly_wait(20)
driver.find_element(By.LINK_TEXT, 'Downloads').click()
finally:
time.sleep(10)
driver.quit()
動作鏈 回到目錄
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
try:
driver.get('http://www.treejs.cn/v3/demo/cn/exedit/drag.html')
time.sleep(2)
# 定位元素
element = driver.find_element_by_id('treeDemo_2_span')
target = driver.find_element_by_id('treeDemo_12_span')
# 動作鏈:拖拽
ActionChains(driver).drag_and_drop(element,target).perform()
finally:
time.sleep(10)
driver.quit()
跳過Selenium檢測 回到目錄
import time
from selenium import webdriver
opt = webdriver.ChromeOptions()
# 方法一
# opt.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=opt)
# 方法二
# # 清除selenium webdriver的值
# driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
# "source": """
# Object.defineProperty(navigator,'webdriver',{
# get:()=>undefined
# })
# """
# })
try:
driver.get('http://www.baidu.com')
finally:
time.sleep(10)
driver.quit()