這裏之講解用法,安裝配置就不詳細講解了。我比較喜歡的瀏覽器驅動是ChromeDriver和無界面的PhantomJS。css
用下面的代碼初始化瀏覽器java
from selenium import webdriver # 把瀏覽器對象賦值爲browser對象,而後就能夠進行模擬瀏覽器操做 browser = webdriver.Chrome()
browser.get('url地址') # 這個是打印網頁源代碼 print(browser.page_source) browser.close() # 處理完後要關閉這個對象
咱們要想執行某個操做,好比填充表單,模擬點擊等,或者向某個輸入框輸入文字,首先要知道位置,而selenium提供了一系列的查找節點的方法,以下。python
查找方法 | 說明 |
---|---|
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結果一致。web
查找多個節點的時候,直接在查找單個節點的方法中加上s,如find_elements_by_name或者find_elements(By.NAME,name),列表中的每個節點都是WebElement類型。ajax
selenium能夠驅動瀏覽器執行一些操做,就是讓瀏覽器模擬執行一些動做。下面是一些常見方法總結。windows
方法 | 說明 |
---|---|
send_keys | 輸入文字 |
clear | 清空文字 |
click | 點擊按鈕 |
有一些交互操做沒有特定的執行對象,好比鼠標拖曳,鍵盤按鍵等,這些相對複雜的動做用動做鏈的方式執行。這裏暫時用不到,先略過。瀏覽器
用execute_script()方法能夠模擬運行JavaScript,基本上全部複雜的動做均可以用執行JavaScript的方式來實現。cookie
用 get_attribute() 方法來獲取節點的屬性。
用 text 屬性來獲取節點的文本值。
用 id 屬性來獲取節點id。
用 location 屬性來獲取節點在頁面中的相對位置。
用 tag_name 屬性來獲取標籤名稱。
用 size 屬性來獲取節點的大小。網絡
網頁有一種節點是iframe,也就是子Frame,至關於頁面的子頁面。網頁打開的時候,默認是在父級Frame裏面進行操做,要獲取子Frame的節點,須要用到switch_to.frame()方法進行切換。
用switch_to.parent_frame()能夠獲取到父頁面的內容。
在selenium中,get()方法會在網頁框架加載完成後結束執行,此時若是獲取網頁源碼,可能並非瀏覽器徹底加載的頁面,若是有額外的ajax請求,網頁源代碼也不必定能成功獲取,須要延時等待必定時間,確保 動態網頁源代碼 所有加載出來。
等待方式有兩種,一種是隱式等待,一種是顯式等待。
隱式等待就是通常的等待,在執行測試的時候,先等待完以後,再進行接下來的步驟,用implicitly_wait(),參數是時間。
隱式等待的效果並無那麼好,只是規定了一個固定的時間,而網頁的加載時間會受到網絡條件的影響。
這裏有一個顯式等待的方法就是指定要查找的節點,而後指定一個最長等待時間,在規定的時間內加載出來就返回,加載不出來,則拋出異常。
示例以下:
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()方法前進。
使用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,對於不一樣的錯誤,不管是網絡鏈接,代碼運行時間超時,仍是數據未找到,都十分有用。