這里之講解用法,安裝配置就不詳細講解了。我比較喜歡的瀏覽器驅動是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,對於不同的錯誤,無論是網絡連接,代碼運行時間超時,還是數據未找到,都十分有用。