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.ID, '...')

  • 通過ID查找一個

find_elements(By.XPATH, '...')

  • 通過Xpath查找多個

By.xxx 選擇使用的查找方法,使用xxx方式解析

  • By對象導入: from selenium.webdriver.common.by import By





輸入、清除、點擊 示例 回到目錄

  • 輸入內容
    • send_keys('內容')
  • 清除內容
    • clear()
  • 點擊
    • click()



關閉窗口、瀏覽器 示例 回到目錄

  • 關閉當前句柄窗口(不關閉進程)
    • close()
  • 關閉整個瀏覽器進程
    • quit()



窗口切換 示例 回到目錄

用selenium操作的是第一個打開的窗口,新打開的窗口是無法直接去操作的

需要切換窗口的句柄

  • 獲取所有窗口的句柄
    • window_handles
      • window_handles的順序並不是瀏覽器上窗口的順序
  • 獲取當前窗口的句柄
    • current_window_handle
  • 切換句柄到指定的窗口
    • 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()



頁面彈窗 示例 回到目錄

  • 定位到alert彈窗,返回一個彈窗的對象
    • switch_to.alert
  • 對彈窗對象的取消操作(相當於點擊彈窗上的取消按鈕)
    • dismiss()
  • 對彈窗對象的確定操作(相當於點擊彈窗上的確定按鈕)
    • accept()
  • 對彈窗對象內的輸入框輸入數據(針對於prompt彈窗)
    • send_keys(key)
  • 獲取彈窗內的文本
    • 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)



執行js 示例 回到目錄

  • execute_script( js語句 )



截圖 示例 回到目錄

  • 截圖保存
    • get_screenshot_as_file('***.png')
  • 將截圖作為二進制數據返回
    • get_screenshot_as_png()



獲取元素屬性 示例 回到目錄

  • 獲取元素標簽上的屬性
    • get_attribute('href')
  • 元素的坐標
    • location
  • 元素的大小
    • size



獲取網頁源代碼、刷新頁面 示例 回到目錄

  • 網頁源代碼
    • page_source
  • 刷新頁面
    • refresh()



設置窗口大小 示例 回到目錄

  • 最小化
    • minimize_window()
  • 最大化
    • maximize_window()
  • 設置窗口具體的大小
    • set_window_size(width,height)
  • 設置窗口位置
    • set_window_position(x,y)



設置代理、UA 示例 回到目錄

  • 設置代理
    • webdriver.ChromeOptions().add_argument('--proxy-server=http://IP:Port')
  • 設置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'])



示例

執行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()





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM