分享一個神器,Selenium 自動化測試工具

最近寫項目的時候,用到了Selenium,一個 Web 端的自動化測試工具,直接運行在瀏覽器中,用來模擬用戶操做。php

Selenium 不單單能夠用做自動化測試,還有不少種玩法,好比 Python 的爬蟲,實現某商品的秒殺,甚至是頁遊外掛腳本,只要是基於瀏覽器操做,只有你想不到,沒有 Selenium 作不到,就是這麼強大!css

直奔主題,咱們來感覺一下 Selenium。html

安裝

Python 的安裝就再也不科普,自行百度。python

經過 pip 命令安裝 Selenium程序員

pip install selenium

安裝瀏覽器驅動

Selenium 支持的瀏覽器不少,Firefox、Chrome、IE、Opera 等等。web

做爲一個程序員,想必大多經常使用的瀏覽器都是 Chrome,個人電腦是 Mac,安裝 Chrome 瀏覽器驅動,直接執行 brew cask install chromedriver 便可。chrome

更多 Selenium 瀏覽器驅動下載,請點擊windows

示例

先來一段簡單的代碼。後端

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.find_element_by_id('kw').send_keys('php')
browser.find_element_by_id('kw').send_keys(Keys.ENTER)

運行這段代碼,你會發現自動打開 Chrome,並訪問了百度,在輸入框輸入了 php,緊接着跳轉到了搜索的結果頁。api

經常使用方法

1. 頁面元素定位

Selenium 經常使用的元素定位方法

  • find_element_by_id()
  • find_element_by_class_name()
  • find_element_by_tag_name()
  • find_element_by_css_selector()
  • find_element_by_tag_name()

好比百度頁面的 HTML:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

咱們能夠這樣定位

element = driver.find_element_by_id('kw')
element = driver.find_element_by_class_name('s_ipt')
element = driver.find_element_by_css_selector('.s_ipt')

獲取元素以後,就是針對於元素的操做了,簡單能夠劃分兩類操做,鼠標事件和鍵盤事件等等。

2. 鼠標操做

element.click()  單擊;
element.context_click() 右擊;
element.double_click() 雙擊;
element.drag_and_drop() 拖動;
element.move_to_element() 鼠標懸停

3. 輸入和鍵盤事件

輸入文本:

element.send_keys("Hello world")

鍵盤操做:

element.send_keys(Keys.ENTER) 回車
element.send_keys(Keys.CONTROL,‘a’) 全選(Ctrl+A)
element.send_keys(Keys.CONTROL,‘c’) 複製(Ctrl+C)
element.send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X) 
element.send_keys(Keys.CONTROL,‘v’) 粘貼(Ctrl+V)
element.send_keys(Keys.F1) 鍵盤 F1
…… 等等

窗口切換

driver.switch_to_window("windowName")
# 獲取全部打開窗口句柄
all_handles = driver.window_handles

# 獲取當前窗口句柄
current_windows = driver.current_window_handle

頁面等待

如今不少項目都是先後端分離的,HTML 動態渲染,若是咱們打開某頁面,直接選取元素操做,就會拋出異常,因此設置頁面等待是頗有必要的。

等待分爲兩種類型:顯式等待和隱式等待。

顯式等待: 針對頁面的某一元素,每隔一段時間檢測一次當前頁面元素是否存在,若是超過設置時間檢測不到則拋出異常

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

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

element = WebDriverWait(driver, 5, 0.5).until(
            EC.presence_of_element_located((By.ID, "kw"))
        )
element.send_keys('selenium')
driver.quit()

隱式等待: 並不針對頁面上的某一元素進行等待,腳本執行到某個元素定位時,若是元素能夠定位,則繼續執行;若是元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位,直到超出設置時長,拋出異常。

# 設置隱式等待爲10秒
driver.implicitly_wait(10)

Selenium 還有更多的操做,好比設置瀏覽器 cookie、文件上傳、窗口截圖等待,這裏就很少介紹了,有興趣的話,你們能夠去看擴展閱讀。

女票再讓我幫她秒殺商品,不再用傻傻等待,分分鐘用 Selenium 寫個秒殺應用有木有!:)

擴展閱讀

相關文章
相關標籤/搜索