Selenium 是一個用于自動化Web應用程序測試的工具包,它提供了一套API,允許開發者編寫腳本來模擬用戶與瀏覽器的交互。這些API可以控制瀏覽器執行各種操作,如導航、點擊、輸入文本、滾動頁面等。使用Selenium結合Python進行自動化測試是一個常見的選擇,因為Selenium是一個強大的工具,可以模擬用戶與網頁的交互。以下是實現Selenium自動化測試的基本步驟:
-
安裝Selenium庫:
使用pip安裝Selenium庫:pip install selenium
-
下載WebDriver:
Selenium需要一個WebDriver來與瀏覽器進行交互。你需要根據你使用的瀏覽器下載相應的WebDriver。例如,如果你使用的是Chrome瀏覽器,新版本你需要下載ChromeDriver。使用的是ie瀏覽器的話,你需要下載iedriver. 這里需要注意一點就是chrome瀏覽器版本要和chromedriver版本匹配,由于在官網下載的chrome只有最新的,而chromedriver版本更新沒那么快,想要下載舊版的chrome可以參考https://repo.debiancn.org/pool/main/g/google-chrome-stable/,而對應舊的chromedriver還可以看看這個https://chromedriver.storage.googleapis.com/index.html -
編寫測試腳本:
使用Python編寫測試腳本,使用Selenium提供的API來控制瀏覽器。 -
啟動WebDriver:
在腳本中,你需要實例化WebDriver,指定瀏覽器驅動的路徑。 -
導航到網頁:
使用WebDriver打開一個網頁。 -
執行操作:
使用Selenium提供的API來執行各種操作,比如點擊按鈕、輸入文本、獲取頁面元素等。 -
斷言:
在自動化測試中,你需要驗證頁面的行為是否符合預期。 -
關閉瀏覽器:
測試完成后,關閉瀏覽器。
下面是一個簡單的示例腳本,演示了如何使用Selenium和Python打開一個網頁并獲取頁面標題:
from selenium import webdriver# 指定WebDriver路徑
driver_path = '/path/to/chromedriver'# 啟動Chrome瀏覽器
driver = webdriver.Chrome(executable_path=driver_path)# 打開網頁
driver.get('http://www.example.com')# 獲取頁面標題
title = driver.title
print('頁面標題:', title)# 關閉瀏覽器
driver.quit()
請確保替換/path/to/chromedriver
為你的ChromeDriver的實際路徑,以及將http://www.example.com
替換為你想要測試的網頁地址。其中,Selenium不僅可以用于打開網頁和獲取頁面信息,它還可以模擬許多其他的瀏覽器操作。以下是一些常見的操作示例:
-
點擊操作:
使用click()
方法模擬鼠標點擊。element = driver.find_element_by_id('some-id') element.click()
-
輸入文本:
使用send_keys()
方法在輸入框中輸入文本。input_field = driver.find_element_by_name('username') input_field.send_keys('your_username')
-
獲取和設置Cookie:
使用get_cookies()
和add_cookie()
方法來處理Cookie。cookies = driver.get_cookies() driver.add_cookie({'name': 'session', 'value': '123456'})
-
執行JavaScript:
使用execute_script()
方法執行JavaScript代碼。driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
-
切換窗口或框架:
使用switch_to.window()
或switch_to.frame()
方法在不同的窗口或框架之間切換。driver.switch_to.window('window_name') driver.switch_to.frame('frame_id')
-
滾動頁面:
使用execute_script()
可以滾動到頁面的特定位置。driver.execute_script('window.scrollTo(0, 100);') # 滾動到頁面頂部向下100像素的位置
-
截屏:
使用get_screenshot_as_file()
方法保存當前頁面的截圖。driver.get_screenshot_as_file('screenshot.png')
-
等待元素加載:
使用Selenium提供的WebDriverWait
和expected_conditions
來等待某個元素加載完成。from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "some-id")) )
-
執行高級用戶交互:
如拖放操作,可以使用動作鏈(ActionChains
)。from selenium.webdriver import ActionChainsaction = ActionChains(driver) action.click(element).perform()
-
獲取頁面源代碼:
使用page_source
屬性獲取當前頁面的HTML源代碼。page_source = driver.page_source
-
執行前進和后退操作:
使用back()
和forward()
方法模擬瀏覽器的前進和后退。driver.back() driver.forward()
這些只是Selenium能做的一小部分事情。Selenium非常靈活,可以模擬幾乎所有的瀏覽器操作,滿足各種自動化測試的需求。最后附上一個完整的自動鏈接網絡腳本
import argparse
import os
import subprocess
import timeimport yaml
from loguru import logger
from selenium import webdriver
from selenium.webdriver.common.by import By # 導入By類def is_pingable(host="www.baidu.com", timeout=30):try:# 執行ping命令result = subprocess.run(["ping", "-c", "1", host], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,timeout=timeout)# 檢查返回的結果return result.returncode == 0except subprocess.TimeoutExpired:return Falsedef connect_network(username, password, driver_name="chrome"):# 啟動瀏覽器if driver_name == "chrome":driver = webdriver.Chrome() # 使用Chrome瀏覽器elif driver_name == "firefox":driver = webdriver.Firefox() # 使用Firefox瀏覽器else:raise NotImplemented# 打開網頁driver.get("xxxx")# 找到用戶名和密碼輸入框,并輸入信息,這里針對網頁內容按f12進入調試,選擇頁面對應元素的id或者nameusername_input = driver.find_element(By.NAME, "une")password_input = driver.find_element(By.NAME, "pass")username_input.send_keys(username)password_input.send_keys(password)# 找到登錄按鈕并點擊login_button = driver.find_element(By.NAME, "btlogin")login_button.click()# 如果需要等待一段時間,可以使用以下語句driver.implicitly_wait(10) # 等待10秒鐘# 關閉瀏覽器driver.quit()if __name__ == '__main__':parser = argparse.ArgumentParser(description='Auto Connect Network')parser.add_argument('-c', '--config', type=str, default="config.yaml", help="config path")args = parser.parse_args()with open(args.config, 'r') as file:config = yaml.safe_load(file)username = config['username']password = config['password']interval = config['interval'] * 60test_mode = config['test_mode']driver_name = config['driver']ping_host = config['ping_host']log_name = "network.log"if os.path.exists(log_name):os.remove(log_name)logger.add(log_name, level="INFO")while True:if test_mode or not is_pingable(host=ping_host):logger.info("連接網絡")connect_network(username, password, driver_name)else:logger.info("網絡正常")time.sleep(interval)
其中yaml內容如下,
username: "xxx" # 用戶名
password: "xxx" # 密碼
interval: 15 # 檢查間隔時間,默認15分鐘
driver: chrome # 瀏覽器名稱,僅支持 `chrome`
ping_host: "www.baidu.com" # 測試網站
test_mode: False # 測試模式
其中,selenium+chrome還是有一些坑在里面的,你基于上面方法下載的chromedriver你會發現是114老版本的,基于新方法下載的里面沒有chromedriver可執行文件,你運行上面腳本會一直出現找不到chromedriver,即使你配置到相關環境變量中,但是不能解決,這時候在stackoverflow上找到解決問題方法
apt-get install chromium-driverdriver = webdriver.Chrome('/usr/bin/chromedriver')
即可,如果過程中出現AttributeError: ‘str’ object has no attribute 'capabilities’問題,這時候可以試試將selenium的版本降低,最后我這邊嘗試3.14.0版本是可以的
pip install selenium==3.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
參考鏈接:
1、https://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html
2、https://github.com/SeleniumHQ/selenium
3、https://blog.csdn.net/diwii/article/details/134541429