Selenium經常使用操做

目錄

安裝

pip install selenium



css

元素選取

單個元素查找方法

  • 注: 其中的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)
  • 移動鼠標到指定的x,y位置
    • 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_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)
try:
    driver.get('http://www.baidu.com')
finally:
    time.sleep(10)
    driver.quit()

相關文章
相關標籤/搜索