selenium自動化測試爬取動態頁面大全


  這里之講解用法,安裝配置就不詳細講解了。我比較喜歡的瀏覽器驅動是ChromeDriver和無界面的PhantomJS。

一:瀏覽器信息測試

1.初始化瀏覽器

  用下面的代碼初始化瀏覽器

from selenium import webdriver

# 把瀏覽器對象賦值為browser對象,然后就可以進行模擬瀏覽器操作
browser = webdriver.Chrome()

2.訪問網頁

browser.get('url地址')
# 這個是打印網頁源代碼
print(browser.page_source)
browser.close() # 處理完后要關閉這個對象

二:查找結點

  我們要想執行某個操作,比如填充表單,模擬點擊等,或者向某個輸入框輸入文字,首先要知道位置,而selenium提供了一系列的查找節點的方法,如下。

1.單個節點

查找方法 說明
find_element_by_id 通過id來查找標簽
find_element_by_name 通過name屬性來查找標簽
find_element_by_xpath 通過xpath來查找標簽
find_element_by_link_text 通過鏈接的文字來查找標簽
find_element_by_partial_link_text 通過鏈接的關鍵字來查找標簽
find_element_by_tag_name 通過標簽名來查找標簽
find_element_by_class_name 通過class的屬性來查找標簽
find_element_by_css_selector 通過css選擇器來查找標簽

還有一種通用方法是find_element()傳兩個參數,一個是By.查找方式,一個是值,比如find_element(By.ID,id)和find_element_by_id結果一致。

2.多個節點

  查找多個節點的時候,直接在查找單個節點的方法中加上s,如find_elements_by_name或者find_elements(By.NAME,name),列表中的每一個節點都是WebElement類型。

三:測試動作

1.簡單的交互

  selenium可以驅動瀏覽器執行一些操作,就是讓瀏覽器模擬執行一些動作。下面是一些常見方法總結。

方法 說明
send_keys 輸入文字
clear 清空文字
click 點擊按鈕

2.特殊的交互

  有一些交互操作沒有特定的執行對象,比如鼠標拖曳,鍵盤按鍵等,這些相對復雜的動作用動作鏈的方式執行。這里暫時用不到,先略過。

3.模擬運行JavaScript

  用execute_script()方法可以模擬運行JavaScript,基本上所有復雜的動作都可以用執行JavaScript的方式來實現。

四:獲取節點信息

  用 get_attribute() 方法來獲取節點的屬性。
  用 text 屬性來獲取節點的文本值。
  用 id 屬性來獲取節點id。
  用 location 屬性來獲取節點在頁面中的相對位置。
  用 tag_name 屬性來獲取標簽名稱。
  用 size 屬性來獲取節點的大小。

五:切換子頁面Frame

  網頁有一種節點是iframe,也就是子Frame,相當於頁面的子頁面。網頁打開的時候,默認是在父級Frame里面進行操作,要獲取子Frame的節點,需要用到switch_to.frame()方法進行切換。
  用switch_to.parent_frame()可以獲取到父頁面的內容。

六,延時請求

  在selenium中,get()方法會在網頁框架加載完成后結束執行,此時如果獲取網頁源碼,可能並不是瀏覽器完全加載的頁面,如果有額外的ajax請求,網頁源代碼也不一定能成功獲取,需要延時等待一定時間,確保 動態網頁源代碼 全部加載出來。
  等待方式有兩種,一種是隱式等待,一種是顯式等待。

1.隱式等待

  隱式等待就是一般的等待,在執行測試的時候,先等待完之后,再進行接下來的步驟,用implicitly_wait(),參數是時間。

2.顯式等待

  隱式等待的效果並沒有那么好,只是規定了一個固定的時間,而網頁的加載時間會受到網絡條件的影響。
  這里有一個顯式等待的方法就是指定要查找的節點,然后指定一個最長等待時間,在規定的時間內加載出來就返回,加載不出來,則拋出異常。
示例如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as  EC

browser = webdriver.Chrome()
browser.get('url地址')
# 先指定最長等待時間為20s
wait = WebDriverWait(browser,20)
# 傳入等待條件expected_conditions,這里的presence_of_element_located代表節點出現的意思
input = wait.until(EC.presence_of_element_located(By.ID,'a'))
# 按鈕等待條件,這里的element_to_be_clickable表示可點擊的,10秒內能點擊,就成功
button = wait.until(EC.element_to_be_clickable(By.CSS_SELECTOR,'.btn-ss'))
print(input,button)

下面是 所有的等待條件

等待條件 說明
title_is 標題是某內容
title_contains 標題包含某內容
presence_of_all_elements_located 某個節點是否加載出來
visibility_of_element_located 某個節點是否可見
visibility_of 某個節點是否可見,傳入節點對象
presence_of_all_elements_located 所有節點加載出來
text_to_be_present_in_element 某個節點文本包含某文字
text_to_be_present_in_element_value 某個節點值包含某文字
frame_to_be_available_and_switch_to_it 加載並切換
invisibility_of_element_located 節點不可見
element_to_be_clickable 節點可點擊
staleness_of 判斷一個節點是否存在DOM,可判斷頁面是否已刷新
element_to_be_selected 節點可選擇,傳入節點對象
element_located_to_be_selected 節點可選擇,傳入定位元組
element_selection_state_to_be 傳入節點對象以及狀態,相等返回True,否則返回False
element_located_selection_state_to_be 傳入定位元組以及狀態,相等返回True,否則返回False
alert_is_present 是否出現警告

七:前進和后退

  selenium測試用back()方法后退,用forward()方法前進。

八:Cookies

  使用selenium可以方便地對Cookies進行操作。
  用get_cookies()方法獲取所有的Cookies。
  用add_cookies()方法增加Cookies。
  用delete_all_cookies()和delete_cookies()方法刪除Cookies。

八:選項卡處理

  在訪問網頁的時候,會開啟一個個選項卡,在selenium中也可以對選項卡進行操作。

browser.execute_script('windows.open()')
print(window_handles)
browser.switch_to_window(browser.window_handles[1])

  用execute_script方法執行JavaScript語句,這里的window_handles獲取當前開啟的所有選項卡,返回的是選項卡的代號列表。用browser.window_handles[index]即可以跳轉到index索引對應的選項卡。

九:捕獲異常

  捕獲異常是經常要用到的方法,語句是try-except-finally,對於不同的錯誤,無論是網絡連接,代碼運行時間超時,還是數據未找到,都十分有用。


免責聲明!

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



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