定義解釋
Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試應用程序看是否能夠很好地工作在不同瀏覽器和操作系統之上。測試系統功能——創建回歸測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生成.Net、Java、Perl等不同語言的測試腳本。
selenium 運行效果
chrome 瀏覽器的運行效果
安裝好 selenium 模塊后,運行下面代碼
from selenium import webdriver
driver = webdriver.Chrome()
#向一個url發起請求
driver.get("http://www.python.org")
#打印頁面標題
print(driver.title)
#退出模擬器 不退出會殘留進程
driver.quit()
selenium的作用和工作原理
利用瀏覽器原生的 API,封裝成一套更加面向對象的 Selenium web Driver API,直接操作瀏覽器頁面里的元素,甚至操作瀏覽器本生(截屏、窗口大小、關閉、安裝插件、配置證書等)
selenium 的簡單使用
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
#控制瀏覽器訪問url地址
driver.get("http://www.baidu.com")
#在百度中搜索python
driver.find_element(By.ID, "kw").send_keys("python")
#點擊百度搜索
driver.find_element(By.ID, "su").click()
print(driver.current_url)
#退出瀏覽器
driver.quit()
運行打印出當前 url:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python&fenlei=256&rsv_pq=0xe86c7938000744b9&rsv_t=2ebfD821B8kkLpalpk%2B8V8BJXURm5E5QmGKnhK5amkSt2VBud92sYJFn9Xkt&rqlang=en&rsv_enter=0&rsv_dl=tb&rsv_sug3=6&rsv_sug1=1&rsv_sug7=100&rsv_btype=i&inputT=422&rsv_sug4=422
webdriver.Chrome(executable_path=‘./chromedriver’)中executable參數指定的是下載好的chromedriver文件的路徑
driver.find_element(By.ID, “kw”).send_keys(“python”)定位id屬性值是’kw’的標簽,并向其中輸入字符串’python’
driver.find_element(By.ID, “su”).click()定位id屬性值是su的標簽,并點擊
click函數作用是:觸發標簽的js的click事件
selenium 提取數據
driver 對象的常用屬性和方法
- driver.page_source 當前標簽頁瀏覽器渲染之后的網頁源代碼
- driver.current_url 當前標簽頁的url
- driver.close() 關閉當前標簽頁,如果只有一個標簽頁則關閉整個瀏覽器
- driver.quit() 關閉瀏覽器
- driver.forward() 頁面前進
- driver.back() 頁面后退
- driver.screen_shot(img_name) 頁面截圖
driver對象定位標簽元素獲取標簽對象的方法
- find_element(By.TAG_NAME, “tag_name”) 通過元素的標簽名定位(如 、 等)
- find_element(By.CSS_SELECTOR, “css_selector”) 通過 CSS 選擇器定位元素
- find_element(By.NAME, “name_value”) 通過元素的 name 屬性定位
- find_element(By.CLASS_NAME, “class_name”) 通過元素的 class 屬性定位
- find_element(By.TAG_NAME, “tag_name”) 通過元素的標簽名定位(如 、 等)
- find_element(By.XPATH, “xpath_expression”) 通過 XPath 表達式定位元素
- find_element(By.LINK_TEXT, “link_text”) 通過鏈接的文本內容定位(適用于 標簽)
- find_element(By.PARTIAL_LINK_TEXT, “partial_link_text”) 通過鏈接的部分文本內容定位
注意:
- find_element和find_elements的區別:
- 多了個s就返回列表,沒有s就返回匹配到的第一個標簽對象
- find_element匹配不到就拋出異常,find_elements匹配不到就返回空列表
- by_link_text和by_partial_link_tex的區別:全部文本和包含某個文本
- 以上函數的使用方法
- driver.find_element_by_id(‘id_str’)
標簽對象提取文本內容和屬性值
selenium 鼠標和鍵盤操作
鼠標操作
鍵盤操作
#### 常用鍵盤鍵值
在這里插入圖片描述
selenium 的其他使用方法
selenium 標簽頁的切換
當 selenium 控制瀏覽器打開多個標簽頁時,如何控制瀏覽器在多個標簽頁之間進行切換?分兩步處理
- 獲取所有標簽頁的窗口權柄
- 利用窗口權柄字切換到權柄指向標簽頁對象的標識
- 這里的窗口權柄是指:標簽頁對象的標識
#1、獲取當前所有的標簽頁的權柄構成的列表
current_windows = driver.window_handles
#2、根據標簽頁權柄列表索引下標進行切換
driver.switch_to.window(current_windows[0])
測試示例
import time
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("http://www.baidu.com")time.sleep(1)
driver.find_element(By.ID, "kw").send_keys("python")
time.sleep(1)
driver.find_element(By.ID, "su").click()
time.sleep(1)#通過執行js來新開一個標簽頁
js = 'window.open("http://www.sougou.com");'
driver.execute_script(js)
time.sleep(1)#獲取當前全部窗口
current_windows = driver.window_handles
time.sleep(2)#根據窗口索引進行切換
driver.switch_to.window(current_windows[0])
time.sleep(2)
driver.switch_to.window(current_windows[1])time.sleep(6)
driver.quit()
switch_to 切換 frame 標簽
iframe 是嵌入在網頁中的另一個網頁。Selenium 提供了 <font style="color:rgb(51, 51, 51);background-color:rgb(250, 252, 253);">switch_to.frame()</font>
方法來切換到 iframe。
import time
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
url = 'https://wx.mail.qq.com/?cancel_login=true&from=get_ticket_fail'
driver.get(url)login_frame = driver.find_element(By.ID,'iframe_wx')
driver.switch_to.frame(login_frame)
print(driver.title)
"""操作frame外邊的元素需要切換出去"""
windows = driver.window_handles
driver.switch_to.window(windows[0])content = driver.find_element(By.CLASS_NAME,'login_pictures_title').text
print(content)driver.quit()
- 總結:
- 切換到定位的frame標簽嵌套的頁面中
driver.switch_to.frame(通過find_element_by函數定位的frame、iframe標簽對象)
- 利用切換標簽頁的方式切出frame標簽
- 切換到定位的frame標簽嵌套的頁面中
windows = driver.window_handles
driver.switch_to.window(windows[0])
selnium 對 cookie 的處理
Selenium 提供了get_cookies()、add_cookie()、delete_cookie()等方法來操作瀏覽器的 Cookies。
獲取 cookie
driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,還有domain等cookie其他維度的信息。所以如果想要把獲取的cookie信息和requests模塊配合使用的話,需要轉換為name、value作為鍵值對的cookie字典
#獲取當前標簽頁的全部cookie信息
print(driver.get_cookies())
#把cookie轉化為字典
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
添加 cookie
# 添加 Cookie
driver.add_cookie({"name": "test", "value": "123"})# 獲取所有 Cookies
cookies = driver.get_cookies()
刪除 cookie
#刪除一條cookie
driver.delete_cookie("CookieName")# 刪除所有的cookie
driver.delete_all_cookies()
執行 js 代碼
Selenium 提供了 `execute_script()方法來執行 JavaScript 代碼。
import time
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("http://www.python.org")
time.sleep(1)js = 'window.scrollTo(0, document.body.scrollHeight);'
driver.execute_script(js)time.sleep(5)
driver.quit()
頁面等待
在 Selenium 中,等待機制是確保頁面元素加載完成后再進行操作的關鍵。
由于網頁加載速度受網絡、服務器性能等因素影響,直接操作未加載完成的元素會導致腳本失敗。
Selenium 提供了多種等待機制來解決這一問題。
- 隱式等待
- 顯示等待
- 固定等待
- fluent wait
隱式等待
隱式等待是一種全局性的等待機制,它會在查找元素時等待一定的時間。如果在指定的時間內找到了元素,Selenium 會立即繼續執行后續操作;如果超時仍未找到元素,則會拋出 NoSuchElementException異常。
import time
from selenium import webdriverdriver = webdriver.Chrome()
#設置隱式等待時間為10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
- 優點:
- 簡單易用,只需設置一次即可應用于所有元素的查找操作
- 適用于大多數簡單的場景
- 缺點:
- 全局性等待,可能會導致不必要的等待時間
- 無法處理某些負責的等待條件,例如等待元素變為可點擊狀態。
顯示等待
顯式等待是一種更為靈活的等待機制,它允許你為特定的操作設置等待條件。顯式等待通常與WebDriverWait類和expected_conditions模塊一起使用。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#設置顯示等待,最多等待10秒,直到元素出現
element = WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located(By.TAG_NAME,'a'))
driver.quit()
常用的 expected_conditions
expected_conditions 模塊提供了多種預定義的等待條件,以下是一些常用的條件:
presence_of_element_located:等待元素出現在 DOM 中。
visibility_of_element_located:等待元素出現在 DOM 中并且可見。
element_to_be_clickable:等待元素可點擊。
text_to_be_present_in_element:等待元素的文本包含指定的文本。
優點:
- 靈活性高,可以為不同的操作設置不同的等待條件。
- 可以處理復雜的等待場景。
缺點:
- 代碼相對復雜,需要更多的代碼量。
- 需要為每個操作單獨設置等待條件。
固定等待
固定等待是一種最簡單的等待機制,它通過time.sleep()方法讓腳本暫停執行指定的時間。無論頁面是否加載完成,腳本都會等待指定的時間后再繼續執行。
import time
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#固定等待5秒
time.sleep(5)
print(driver.title)
driver.quit()
優點:
- 簡單易用,適用于簡單的測試場景。
缺點:
- 效率低下,可能會導致不必要的等待時間。
- 無法根據頁面加載情況動態調整等待時間。
Fluent Wait
作用:動態設置等待條件,可以自定義輪詢頻率和忽略特定異常。
方法:WebDriverWait 結合 polling_every 和 ignoring
特點:更靈活,適用于需要動態調整等待時間的場景。
import time
from selenium import webdriver
from selenium.common import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#設置fluent wait
wait = WebDriverWait(driver, timeout=10,poll_frequency=1,ignored_exceptions=[TimeoutException]).until(expected_conditions.presence_of_element_located(By.ID, "username")
)
driver.quit()
總結
- 隱式等待:適用于簡單的場景,全局性等待,但可能會導致不必要的等待時間。
- 顯式等待:適用于復雜的場景,靈活性高,但代碼相對復雜。
- 固定等待:簡單易用,但效率低下,不推薦在復雜的測試場景中使用。
- Fluent Wait::適用于需要動態調整等待時間的場景。
selenium 開啟無界面模式
絕大多數服務器是沒有界面的,selenium控制谷歌瀏覽器也是存在無界面模式的。
- 開啟無界面模式的方法
- 實例化配置對象
options = webdriver.ChromeOptions()
- 配置對象添加開啟無界面模式的命令
options.add_argument("--headless")
- 配置對象添加禁用gpu的命令
options.add_argument("--disable-gpu")
- 實例化帶有配置對象的driver對象
driver = webdriver.Chrome(chrome_options=options)
- 實例化配置對象
import time
from selenium import webdriver
options = webdriver.ChromeOptions() #創建一個配置對象
options.add_argument('--headless') #開啟無界面模式
options.add_argument('--disable-gpu') # 禁用gpu
# options.set_headles() # 無界面模式的另外一種開啟方式
driver = webdriver.Chrome(options) #實例化帶有配置的driver對象
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
selenium 使用代理 IP
selenium控制瀏覽器也是可以使用代理ip的!
- 使用代理ip的方法
- 實例化配置對象
options = webdriver.ChromeOptions()
- 配置對象添加使用代理ip的命令
options.add_argument('--proxy-server=http://202.20.16.82:9527')
- 實例化帶有配置對象的driver對象
driver = webdriver.Chrome('./chromedriver', chrome_options=options)
- 實例化配置對象
import time
from selenium import webdriver
options = webdriver.ChromeOptions() #創建一個配置對象
options.add_argument('--proxy-server=http://172.16.31.10:3128') #使用待遇ip
driver = webdriver.Chrome(options) #實例化帶有配置的driver對象
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
selenium 替換 user-agent
selenium控制谷歌瀏覽器時,User-Agent默認是谷歌瀏覽器的,但是這個值是可以修改的。
- 替換user-agent的方法
- 實例化配置對象
options = webdriver.ChromeOptions()
- 配置對象添加替換UA的命令
options.add_argument('--user-agent=Mozilla/5.0 HAHA')
- 實例化帶有配置對象的driver對象
driver = webdriver.Chrome('./chromedriver', chrome_options=options)
- 實例化配置對象
import time
from selenium import webdriver
options = webdriver.ChromeOptions() #創建一個配置對象
options.add_argument('--user-agent=Mozilla/5.0') #替換User-agent
driver = webdriver.Chrome(options) #實例化帶有配置的driver對象
driver.get("http://www.itcast.cn")
print(driver.title)
driver.quit()