国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python自動(dòng)化測(cè)試工具selenium使用指南

這篇具有很好參考價(jià)值的文章主要介紹了Python自動(dòng)化測(cè)試工具selenium使用指南。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概述

selenium是網(wǎng)頁應(yīng)用中最流行的自動(dòng)化測(cè)試工具,可以用來做自動(dòng)化測(cè)試或者瀏覽器爬蟲等。官網(wǎng)地址為:相對(duì)于另外一款web自動(dòng)化測(cè)試工具QTP來說有如下優(yōu)點(diǎn):

  • 免費(fèi)開源輕量級(jí),不同語言只需要一個(gè)體積很小的依賴包
  • 支持多種系統(tǒng),包括Windows,Mac,Linux
  • 支持多種瀏覽器,包括Chrome,F(xiàn)ireFox,IE,safari,opera等
  • 支持多語言,包括Java,C,python,c#等主流語言
  • 支持分布式測(cè)試用例執(zhí)行
python+selenium環(huán)境安裝

首先需要安裝python(推薦3.7+)環(huán)境,然后直接用pip install selenium安裝依賴包即可。

另外還需要下載瀏覽器相應(yīng)的webdriver驅(qū)動(dòng)程序,注意下載的驅(qū)動(dòng)版本一定要匹配瀏覽器版本。

  • Firefox瀏覽器驅(qū)動(dòng):
  • Chrome瀏覽器驅(qū)動(dòng):
  • IE瀏覽器驅(qū)動(dòng):
  • Edge瀏覽器驅(qū)動(dòng):
  • Opera瀏覽器驅(qū)動(dòng):

下載以后可以把驅(qū)動(dòng)程序加到環(huán)境變量,這樣使用時(shí)就不用手動(dòng)指定驅(qū)動(dòng)程序路徑。

使用selenium啟動(dòng)瀏覽器

可以在python中使用下面的代碼啟動(dòng)一個(gè)Chrome瀏覽器,然后控制這個(gè)瀏覽器的行為或者讀取數(shù)據(jù)。

from selenium import webdriver
 
# 啟動(dòng)Chrome瀏覽器,要求chromedriver驅(qū)動(dòng)程序已經(jīng)配置到環(huán)境變量
# 將驅(qū)動(dòng)程序和當(dāng)前腳本放在同一個(gè)文件夾也可以
driver = webdriver.Chrome()
 
# 手動(dòng)指定驅(qū)動(dòng)程序路徑
driver = webdriver.Chrome(r'D:/uusama/tools/chromedriver.exe')
 
driver = webdriver.Ie()        # Internet Explorer瀏覽器
driver = webdriver.Edge()      # Edge瀏覽器
driver = webdriver.Opera()     # Opera瀏覽器
driver = webdriver.PhantomJS()   # PhantomJS
 
driver.get('http://uusama.com')  # 打開指定路徑的頁面

啟動(dòng)的時(shí)候還可以設(shè)置啟動(dòng)參數(shù),比如下面的代碼實(shí)現(xiàn)啟動(dòng)時(shí)添加代理,并且忽略https證書校驗(yàn)。

from selenium import webdriver
 
# 創(chuàng)建chrome啟動(dòng)選項(xiàng)對(duì)象
options = webdriver.ChromeOptions()
 
 
options.add_argument("--proxy-server=127.0.0.1:16666")  # 設(shè)置代理
options.add_argument("---ignore-certificate-errors")  # 設(shè)置忽略https證書校驗(yàn)
options.add_experimental_option("excludeSwitches", ["enable-logging"])  # 啟用日志
 
# 設(shè)置瀏覽器下載文件時(shí)保存的默認(rèn)路徑
prefs = {"download.default_directory": get_download_dir()}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=options)

啟動(dòng)的時(shí)候還可以設(shè)置啟動(dòng)參數(shù),比如下面的代碼實(shí)現(xiàn)啟動(dòng)時(shí)添加代理,并且忽略https證書校驗(yàn)。

from selenium import webdriver
 
# 創(chuàng)建chrome啟動(dòng)選項(xiàng)對(duì)象
options = webdriver.ChromeOptions()
 
 
options.add_argument("--proxy-server=127.0.0.1:16666")  # 設(shè)置代理
options.add_argument("---ignore-certificate-errors")  # 設(shè)置忽略https證書校驗(yàn)
options.add_experimental_option("excludeSwitches", ["enable-logging"])  # 啟用日志
 
# 設(shè)置瀏覽器下載文件時(shí)保存的默認(rèn)路徑
prefs = {"download.default_directory": get_download_dir()}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=options)

一些非常有用的啟動(dòng)選項(xiàng),下面使用的options = webdriver.ChromeOptions():

  • options.add_argument("--proxy-server=127.0.0.1:16666"): 設(shè)置代理,可以結(jié)合mitmproxy進(jìn)行抓包等
  • option.add_experimental_option('excludeSwitches', ['enable-automation']): 設(shè)置繞過selenium檢測(cè)
  • options.add_argument("---ignore-certificate-errors"): 設(shè)置忽略https證書校驗(yàn)
  • options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}): 設(shè)置不請(qǐng)求圖片模式加快頁面加載速度
  • chrome_options.add_argument('--headless'): 設(shè)置無頭瀏覽器

selenium頁面加載等待和檢測(cè)

使用selenium打開頁面以后,還不能立刻操作,需要等到待處理頁面元素加載完成,這時(shí)就需要檢測(cè)和等待頁面元素加載。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-764903.html

使用time.sleep()等待

最簡單的方法就是打開頁面以后,使用time.sleep()強(qiáng)制等待一定時(shí)間,該方法只能設(shè)置一個(gè)固定時(shí)間等待,如果頁面提前加載完成,則會(huì)空等阻塞。

from time import sleep
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get('http://uusama.con')
time.sleep(10)
print('load finish')

使用implicitly_wait設(shè)置最長等待時(shí)間

另外還可以使用implicitly_wait設(shè)置最長等待時(shí)間,如果在給定時(shí)間內(nèi)頁面加載完成或者已經(jīng)超時(shí),才會(huì)執(zhí)行下一步。該方法會(huì)等到所有資源全部加載完成,也就是瀏覽器標(biāo)簽欄的loading圖表不再轉(zhuǎn)才會(huì)執(zhí)行下一步。有可能頁面元素已經(jīng)加載完成,但是js或者圖片等資源還未加載完成,此時(shí)還需要等待。

另需注意使用implicitly_wait只需設(shè)置一次,且對(duì)整個(gè)driver生命周期都起作用,凡是遇到頁面正在加載都會(huì)阻塞。

示例如下:

from selenium import webdriver
 
driver = webdriver.Chrome()
driver.implicitly_wait(30)   # 設(shè)置最長等30秒
driver.get('http://uusama.com')
print(driver.current_url)
 
driver.get('http://baidu.com')
print(driver.current_url)

使用WebDriverWait設(shè)置等待條件

使用WebDriverWait(selenium.webdriver.support.wait.WebDriverWait)能夠更加精確靈活地設(shè)置等待時(shí)間,WebDriverWait可在設(shè)定時(shí)間內(nèi)每隔一段時(shí)間檢測(cè)是否滿足某個(gè)條件,如果滿足條件則進(jìn)行下一步操作,如果超過設(shè)置時(shí)間還不滿足,則拋出TimeoutException異常,其方法聲明如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

其中各參數(shù)含義如下:

  • driver:瀏覽器驅(qū)動(dòng)
  • timeout:最長超時(shí)時(shí)間,默認(rèn)以秒為單位
  • poll_frequency:檢測(cè)的間隔(步長)時(shí)間,默認(rèn)為0.5秒
  • ignored_exceptions:忽略的異常,即使在調(diào)用until()until_not()的過程中拋出給定異常也不中斷

WebDriverWait()一般配合until()until_not()方法使用,表示等待阻塞直到返回值為True或者False,需要注意這兩個(gè)方法的參數(shù)都需是可調(diào)用對(duì)象,即方法名稱,可以使用expected_conditions模塊中的方法或者自己封裝的方法。?

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
 
driver = webdriver.Chrome()
driver.get("http://baidu.com")
 
# 判斷id為`input`的元素是否被加到了dom樹里,并不代表該元素一定可見,如果定位到就返回WebElement
element = WebDriverWait(driver, 5, 0.5).until(expected_conditions.presence_of_element_located((By.ID, "s_btn_wr")))
 
# implicitly_wait和WebDriverWait都設(shè)置時(shí),取二者中最大的等待時(shí)間
driver.implicitly_wait(5)
 
# 判斷某個(gè)元素是否被添加到了dom里并且可見,可見代表元素可顯示且寬和高都大于0
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID, 'su')))
 
# 判斷元素是否可見,如果可見就返回這個(gè)元素
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID, value='kw')))

?下面列出expected_conditions常用的一些方法:

  • title_is: 判斷當(dāng)前頁面title是否精確等于預(yù)期
  • title_contains: 判斷當(dāng)前頁面title是否包含預(yù)期字符串
  • presence_of_element_located: 判斷某個(gè)元素是否被加到了dom樹里,并不代表該元素一定可見
  • visibility_of_element_located: 判斷某個(gè)元素是否可見(元素非隱藏,并且元素的寬和高都不等于0)
  • visibility_of: 跟上面的方法做一樣的事情,只是上面的方法要傳入locator,這個(gè)方法直接傳定位到的element就好了
  • presence_of_all_elements_located: 判斷是否至少有1個(gè)元素存在于dom樹中。舉個(gè)例子,如果頁面上有n個(gè)元素的class都是'column-md-3',那么只要有1個(gè)元素存在,這個(gè)方法就返回True
  • text_to_be_present_in_element: 判斷某個(gè)元素中的text是否包含了預(yù)期的字符串
  • text_to_be_present_in_element_value: 判斷某個(gè)元素中的value屬性是否包含了預(yù)期的字符串
  • frame_to_be_available_and_switch_to_it: 判斷該frame是否可以switch進(jìn)去,如果可以的話,返回True并且switch進(jìn)去,否則返回False
  • invisibility_of_element_located: 判斷某個(gè)元素中是否不存在于dom樹或不可見
  • element_to_be_clickable: 判斷某個(gè)元素中是否可見并且是enable的,這樣的話才叫clickable
  • staleness_of: 等某個(gè)元素從dom樹中移除,注意,這個(gè)方法也是返回True或False
  • element_to_be_selected: 判斷某個(gè)元素是否被選中了,一般用在下拉列表
  • element_selection_state_to_be: 判斷某個(gè)元素的選中狀態(tài)是否符合預(yù)期
  • element_located_selection_state_to_be: 跟上面的方法作用一樣,只是上面的方法傳入定位到的element,而這個(gè)方法傳入locator
檢測(cè)document是否加載完成

另外還可以使用driver.execute_script('return document.readyState;') == 'complete'來檢測(cè)document是否加載完成。

注意document加載完成,是不包括那種異步加載ajax請(qǐng)求動(dòng)態(tài)渲染dom的,這種需要使用WebDriverWait檢測(cè)某個(gè)元素是否渲染完成。

selenium元素定位和讀取

查找元素

selenium提供了一系列api方便獲取chrome中的元素,這些API都返回WebElement對(duì)象或其列表,如:

  • find_element_by_id(id): 查找匹配id的第一個(gè)元素
  • find_element_by_class_name(): 查找匹配class的第一個(gè)元素
  • find_elements_by_xpath(): 查找匹配xpath的所有元素
  • find_elements_by_css_selector(): 查找匹配css選擇器的所有元素

其實(shí)可以看WebDriver類里面的實(shí)現(xiàn)源碼,其核心實(shí)現(xiàn)都是調(diào)用兩個(gè)基本函數(shù):

  • find_element(self, by=By.ID, value=None): 查找匹配策略的第一個(gè)元素
  • find_elements(self, by=By.ID, value=None): 查找匹配策略的所有元素

?其中by參數(shù)可以是ID,?CSS_SELECTOR,?CLASS_NAME,?XPATH等。下面舉幾個(gè)簡單的例子:

  • ?通過xpath查詢包含文本登錄的第一個(gè)元素: find_element_by_xpath("http://*[contains(text(),'登錄')]")
  • 查詢包含類名refresh的所有元素: find_elements_by_class_name('refresh')
  • 查詢table表格的第二行: find_element_by_css_selector('table tbody > tr:nth(2)')
dom元素交互

上面介紹的元素查找結(jié)果WebElement對(duì)象,常用的api有:

  • ?element.text: 返回元素的文本內(nèi)容(包括所有后代節(jié)點(diǎn)的內(nèi)容),注意如果元素display=none則返回為空字符串
  • element.screenshot_as_png: 元素的截圖
  • element.send_keys("input"): 元素輸入框輸入input字符串
  • element.get_attribute('data-v'): 獲取data-v名稱屬性值,除了自定義節(jié)點(diǎn)屬性,還可以獲取如textContent等屬性
  • element.is_displayed(): 判斷元素是否用戶可見
  • element.clear(): 清除元素文本
  • element.click(): 點(diǎn)擊元素,如果元素不可點(diǎn)擊會(huì)拋出ElementNotInteractableException異常
  • element.submit(): 模擬表單提交
查找元素失敗處理

如果找不到指定元素,則會(huì)拋出NoSuchElementException異常,而且需要注意,display=none的元素是可以獲取到的,凡是在dom節(jié)點(diǎn)中的元素都可以獲取到。

而且實(shí)際使用的時(shí)候要注意一些js代碼動(dòng)態(tài)創(chuàng)建的元素,可能需要輪詢獲取或者監(jiān)控。

一個(gè)檢查是否存在指定元素的方法如下:

def check_element_exists(xpath):
    try:
        driver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True

selenium交互控制

ActionChains動(dòng)作鏈

webdriver通過ActionChains對(duì)象來模擬用戶操作,該對(duì)象表示一個(gè)動(dòng)作鏈路隊(duì)列,所有操作會(huì)依次進(jìn)入隊(duì)列但不會(huì)立即執(zhí)行,直到調(diào)用perform()方法時(shí)才會(huì)執(zhí)行。其常用方法如下:

  • click(on_element=None): 單擊鼠標(biāo)左鍵
  • click_and_hold(on_element=None): 點(diǎn)擊鼠標(biāo)左鍵,不松開
  • context_click(on_element=None): 點(diǎn)擊鼠標(biāo)右鍵
  • double_click(on_element=None): 雙擊鼠標(biāo)左鍵
  • send_keys(*keys_to_send): 發(fā)送某個(gè)鍵到當(dāng)前焦點(diǎn)的元素
  • send_keys_to_element(element, *keys_to_send): 發(fā)送某個(gè)鍵到指定元素
  • key_down(value, element=None): 按下某個(gè)鍵盤上的鍵
  • key_up(value, element=None): 松開某個(gè)鍵
  • drag_and_drop(source, target): 拖拽到某個(gè)元素然后松開
  • drag_and_drop_by_offset(source, xoffset, yoffset): 拖拽到某個(gè)坐標(biāo)然后松開
  • move_by_offset(xoffset, yoffset): 鼠標(biāo)從當(dāng)前位置移動(dòng)到某個(gè)坐標(biāo)
  • move_to_element(to_element): 鼠標(biāo)移動(dòng)到某個(gè)元素
  • move_to_element_with_offset(to_element, xoffset, yoffset): 移動(dòng)到距某個(gè)元素(左上角坐標(biāo))多少距離的位置
  • perform(): 執(zhí)行鏈中的所有動(dòng)作
  • release(on_element=None): 在某個(gè)元素位置松開鼠標(biāo)左鍵
模擬鼠標(biāo)事件

下面代碼模擬鼠標(biāo)移動(dòng),點(diǎn)擊,拖拽等操作,注意操作時(shí)需要等待一定時(shí)間,否則頁面還來不及渲染。

from time import sleep
from selenium import webdriver
# 引入 ActionChains 類
from selenium.webdriver.common.action_chains import ActionChains
 
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
action_chains = ActionChains(driver)
 
target = driver.find_element_by_link_text("搜索")
# 移動(dòng)鼠標(biāo)到指定元素然后點(diǎn)擊
action_chains.move_to_element(target).click(target).perform()
time.sleep(2)
 
# 也可以直接調(diào)用元素的點(diǎn)擊方法
target.click()
time.sleep(2)
 
# 鼠標(biāo)移動(dòng)到(10, 50)坐標(biāo)處
action_chains.move_by_offset(10, 50).perform()
time.sleep(2)
 
# 鼠標(biāo)移動(dòng)到距離元素target(10, 50)處
action_chains.move_to_element_with_offset(target, 10, 50).perform()
time.sleep(2)
 
# 鼠標(biāo)拖拽,將一個(gè)元素拖動(dòng)到另一個(gè)元素
dragger = driver.find_element_by_id('dragger')
action.drag_and_drop(dragger, target).perform()
time.sleep(2)
 
# 也可以使用點(diǎn)擊 -> 移動(dòng)來實(shí)現(xiàn)拖拽
action.click_and_hold(dragger).release(target).perform()
time.sleep(2)
action.click_and_hold(dragger).move_to_element(target).release().perform()

?

模擬鍵盤輸入事件

通過send_keys模擬鍵盤事件,常用有:

  • send_keys(Keys.BACK_SPACE): 刪除鍵(BackSpace)
  • send_keys(Keys.SPACE): 空格鍵(Space)
  • send_keys(Keys.TAB): 制表鍵(Tab)
  • send_keys(Keys.ESCAPE): 回退鍵(Esc)
  • send_keys(Keys.ENTER): 回車鍵(Enter)
  • send_keys(Keys.F1): 鍵盤 F1
  • send_keys(Keys.CONTROL,'a'): 全選(Ctrl+A)
  • send_keys(Keys.CONTROL,'c'): 復(fù)制(Ctrl+C)
  • send_keys(Keys.CONTROL,'x'): 剪切(Ctrl+X)
  • send_keys(Keys.CONTROL,'v'): 粘貼(Ctrl+V)

示例:定位到輸入框,然后輸入內(nèi)容

# 輸入框輸入內(nèi)容
driver.find_element_by_id("kw").send_keys("uusamaa")
 
# 模擬回車刪除多輸入的一個(gè)字符a
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)

?

警告框處理

用于處理調(diào)用alert彈出的警告框。

  • driver.switch_to_alert(): 切換到警告框
  • text:返回alert/confirm/prompt中的文字信息,比如js調(diào)用alert('failed')則會(huì)獲取failed字符串
  • accept():接受現(xiàn)有警告框
  • dismiss():關(guān)閉現(xiàn)有警告框
  • send_keys(keysToSend):將文本發(fā)送至警告框

selenium瀏覽器控制

基本常用api

下面列出一些非常實(shí)用的瀏覽器控制api:

  • driver.current_url: 獲取當(dāng)前活動(dòng)窗口的url
  • driver.switch_to_window("windowName"): 移動(dòng)到指定的標(biāo)簽窗口
  • driver.switch_to_frame("frameName"): 移動(dòng)到指定名稱的iframe
  • driver.switch_to_default_content(): 移動(dòng)到默認(rèn)文本內(nèi)容區(qū)
  • driver.maximize_window(): 將瀏覽器最大化顯示
  • driver.set_window_size(480, 800): 設(shè)置瀏覽器寬480、高800顯示
  • driver.forword(), driver.back(): 瀏覽器前進(jìn)和后退
  • driver.refresh(): 刷新頁面
  • driver.close(): 關(guān)閉當(dāng)前標(biāo)簽頁
  • driver.quiit(): 關(guān)閉整個(gè)瀏覽器
  • driver.save_screenshot('screen.png'): 保存頁面截圖
  • driver.maximize_window(): 將瀏覽器最大化顯示
  • browser.execute_script('return document.readyState;'): 執(zhí)行js腳本

?

selenium讀取和加載cookie

使用get_cookiesadd_cookie可以實(shí)現(xiàn)將cookie緩存到本地,然后啟動(dòng)時(shí)加載,這樣可以保留登錄態(tài)。實(shí)現(xiàn)如下

import os
import json
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
 
# 讀取所有cookie并保存到文件
cookies = driver.get_cookies()
cookie_save_path = 'cookie.json'
with open(cookie_save_path, 'w', encoding='utf-8') as file_handle:
    json.dump(cookies, file_handle, ensure_ascii=False, indent=4)
 
# 從文件讀取cookie并加載到瀏覽器
with open(cookie_save_path, 'r', encoding='utf-8') as file_handle:
    cookies = json.load(file_handle)
    for cookie in cookies:
        driver.add_cookie(cookie)
selenium打開新的標(biāo)簽頁窗口

使用driver.get(url)會(huì)默認(rèn)在第一個(gè)標(biāo)簽窗口打開指定連接,點(diǎn)擊頁面中的_blank的鏈接時(shí)也會(huì)打開一個(gè)新的標(biāo)簽窗口。

還可以用下面的方式手動(dòng)打開一個(gè)指定頁面的標(biāo)簽窗口,需要注意打開新窗口或者關(guān)閉以后,還需要手動(dòng)調(diào)用switch_to.window切換當(dāng)前活動(dòng)的標(biāo)簽窗口,否則會(huì)拋出NoSuchWindowException異常。

from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
 
new_tab_url = 'http://uusama.com'
driver.execute_script(f'window.open("{new_tab_url}", "_blank");')
time.sleep(1)
 
# 注意:必須調(diào)用switch_to.window手動(dòng)切換window,否則會(huì)找不到tab view
# 聚焦到新打開的tab頁面,然后關(guān)閉
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
driver.close()   # 關(guān)閉當(dāng)前窗口
 
# 手動(dòng)回到原來的tab頁面
driver.switch_to.window(driver.window_handles[0])
time.sleep(1)

除了使用execute_script外,還可以使用模擬打開新tab頁按鍵的方式新建一個(gè)標(biāo)簽頁窗口:

  • driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
  • ActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform()

selenium一些問題記錄

獲取隱藏元素的文本內(nèi)容

?如果一個(gè)元素是隱藏的,即display=none,雖然可以通過find_element查找到該元素,但是用element.text屬性是獲取不到該元素文本內(nèi)容的,其值是空字符串,這時(shí)可以用下面的方式獲?。?/p>

element = driver.find_element_by_id('uusama')
driver.execute_script("return arguments[0].textContent", element)
driver.execute_script("return arguments[0].innerHTML", element)
 
# 相應(yīng)的也可以把隱藏的元素設(shè)置為非隱藏
driver.execute_script("arguments[0].style.display = 'block';", element)
瀏覽器崩潰WebDriverException異常處理

比如在Chrome中長時(shí)間運(yùn)行一個(gè)頁面會(huì)出現(xiàn)Out Of Memory內(nèi)存不足的錯(cuò)誤,此時(shí)WebDriver會(huì)拋出WebDriverException異常,基本所有api都會(huì)拋出這個(gè)異常,這個(gè)時(shí)候需要捕獲并進(jìn)行特殊處理。

我的處理方式是記錄頁面的一些基本信息,比如url,cookie等,并定期寫入到文件中,如果檢測(cè)到該異常,則重啟瀏覽器并且加載url和cookie等數(shù)據(jù)。

selenium抓取頁面請(qǐng)求數(shù)據(jù)

網(wǎng)上有通過driver.requests或者通過解析日志來獲取頁面請(qǐng)求的方式,但是我感覺都不是很好使。最后使用mitmproxy代理進(jìn)行抓包處理,然后啟動(dòng)selenium時(shí)填入代理來實(shí)現(xiàn)。

proxy.py為在mitmproxy基礎(chǔ)上封裝的自定義代理請(qǐng)求處理,其代碼如下:

import os
import gzip
from mitmproxy.options import Options
from mitmproxy.proxy.config import ProxyConfig
from mitmproxy.proxy.server import ProxyServer
from mitmproxy.tools.dump import DumpMaster
from mitmproxy.http import HTTPFlow
from mitmproxy.websocket import WebSocketFlow
 
 
class ProxyMaster(DumpMaster):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
 
    def run(self, func=None):
        try:
            DumpMaster.run(self, func)
        except KeyboardInterrupt:
            self.shutdown()
 
 
def process(url: str, request_body: str, response_content: str):
    # 抓包請(qǐng)求處理,可以在這兒轉(zhuǎn)存和解析數(shù)據(jù)
    pass
 
 
class Addon(object):
    def websocket_message(self, flow: WebSocketFlow):
        # 監(jiān)聽websockt請(qǐng)求
        pass
 
    def response(self, flow: HTTPFlow):
        # 避免一直保存flow流,導(dǎo)致內(nèi)存占用飆升
        # flow.request.headers["Connection"] = "close"
        # 監(jiān)聽http請(qǐng)求響應(yīng),并獲取請(qǐng)求體和響應(yīng)內(nèi)容
        url = flow.request.url
        request_body = flow.request
        response_content = flow.response
 
        # 如果返回值是壓縮的內(nèi)容需要進(jìn)行解壓縮
        if response_content.data.content.startswith(b'\x1f\x8b\x08'):
            response_content = gzip.decompress(response_content.data.content).decode('utf-8')
        Addon.EXECUTOR.submit(process, url, request_body, response_content)
 
 
def run_proxy_server():
    options = Options(listen_host='0.0.0.0', listen_port=16666)
    config = ProxyConfig(options)
    master = ProxyMaster(options, with_termlog=False, with_dumper=False)
    master.server = ProxyServer(config)
    master.addons.add(Addon())
    master.run()
 
 
if __name__ == '__main__':
    with open('proxy.pid', mode='w') as fin:
        fin.write(os.getpid().__str__())
    run_proxy_server()

在使用mitmproxy過程中,隨著時(shí)間推移proxy.py會(huì)出現(xiàn)占用內(nèi)存飆升的問題,在github的issue區(qū)有人也遇到過,有說是因?yàn)閔ttp連接keep-alive=true請(qǐng)求會(huì)一直保存不會(huì)釋放,導(dǎo)致請(qǐng)求越多越占用內(nèi)存,然后通過添加flow.request.headers["Connection"] = "close"來手動(dòng)關(guān)閉連接,我加了以后有一定緩解,但還是不能從根本上解決。

最后通過寫入proxy.pid記錄代理程序進(jìn)程,然后用另外一個(gè)程序定時(shí)重啟proxy.py來解決內(nèi)存泄漏的問題。

感謝每一個(gè)認(rèn)真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

Python自動(dòng)化測(cè)試工具selenium使用指南,測(cè)試工具,測(cè)試用例,程序人生,功能測(cè)試,單元測(cè)試,jmeter,selenium

這些資料,對(duì)于【軟件測(cè)試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個(gè)倉庫也陪伴上萬個(gè)測(cè)試工程師們走過最艱難的路程,希望也能幫助到你!有需要的小伙伴可以點(diǎn)擊下方小卡片領(lǐng)取?

Python自動(dòng)化測(cè)試工具selenium使用指南,測(cè)試工具,測(cè)試用例,程序人生,功能測(cè)試,單元測(cè)試,jmeter,selenium

?

到了這里,關(guān)于Python自動(dòng)化測(cè)試工具selenium使用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python自動(dòng)化測(cè)試工具selenium使用指南 ,絕對(duì)能幫到你

    python自動(dòng)化測(cè)試工具selenium使用指南 ,絕對(duì)能幫到你

    目錄 概述 python+selenium環(huán)境安裝 使用selenium啟動(dòng)瀏覽器 selenium頁面加載等待和檢測(cè) 使用time.sleep()等待 使用implicitly_wait設(shè)置最長等待時(shí)間 使用WebDriverWait設(shè)置等待條件 檢測(cè)document是否加載完成 selenium元素定位和讀取 查找元素 dom元素交互 查找元素失敗處理 selenium交互控制 Actio

    2024年02月08日
    瀏覽(49)
  • ubuntu 18.04 配置自動(dòng)化測(cè)試工具 appium + selenium+python3

    sudo add-apt-repository ppa:danielrichter2007/grub-customizer sudo apt-get update sudo apt-get install grub-customizer sudo apt-get install openjdk-8-jdk ================================================================================ 【已經(jīng)安裝Android studio 可以跳過】 下載SDK =============================== 配置環(huán)境變量 【配置環(huán)境變量

    2024年02月03日
    瀏覽(27)
  • 【測(cè)試開發(fā)】第五節(jié).測(cè)試——自動(dòng)化測(cè)試(Selenium工具)

    【測(cè)試開發(fā)】第五節(jié).測(cè)試——自動(dòng)化測(cè)試(Selenium工具)

    作者簡介:大家好,我是未央; 博客首頁:未央.303 系列專欄:Java測(cè)試開發(fā) 每日一句: 人的一生,可以有所作為的時(shí)機(jī)只有一次,那就是現(xiàn)在?。?! 前言 一、自動(dòng)化測(cè)試的概念以及分類 二、Selenium—web自動(dòng)化測(cè)試工具 2.1?自動(dòng)化測(cè)試的一些前置工作 2.2 第一個(gè)自動(dòng)化實(shí)例

    2024年02月04日
    瀏覽(32)
  • 自動(dòng)化測(cè)試工具——Selenium詳解

    自動(dòng)化測(cè)試工具——Selenium詳解

    Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。是一個(gè)開源的Web的自動(dòng)化測(cè)試工具,最初是為網(wǎng)站自動(dòng)化測(cè)試而開發(fā)的,類型像我們玩游戲用的按鍵精靈,可以按指定的命令自動(dòng)操作,不同是Selenium可以直接運(yùn)行在瀏覽器上,它支持所有主流的瀏覽器,支持的瀏覽器包括IE(7, 8,

    2024年01月20日
    瀏覽(24)
  • 一文詳解:自動(dòng)化測(cè)試工具——Selenium

    一文詳解:自動(dòng)化測(cè)試工具——Selenium

    Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。是一個(gè)開源的Web的自動(dòng)化測(cè)試工具,最初是為網(wǎng)站自動(dòng)化測(cè)試而開發(fā)的,類型像我們玩游戲用的按鍵精靈,可以按指定的命令自動(dòng)操作,不同是Selenium可以直接運(yùn)行在瀏覽器上,它支持所有主流的瀏覽器,支持的瀏覽器包括IE(7, 8,

    2024年01月16日
    瀏覽(30)
  • 如何使用自動(dòng)化測(cè)試工具Selenium?

    如何使用自動(dòng)化測(cè)試工具Selenium?

    哈嘍,大家好,我是小浪。那么有一段時(shí)間沒有更新了,還是在忙實(shí)習(xí)和秋招的事情,那么今天也是實(shí)習(xí)正式結(jié)束啦,開始繼續(xù)更新我們的學(xué)習(xí)博客,后期主要是開發(fā)和測(cè)試的學(xué)習(xí)博客內(nèi)容巨多,感興趣的小伙伴們可以一鍵三連支持一下歐~ 目錄 一、什么是自動(dòng)化測(cè)試? 二、

    2024年02月11日
    瀏覽(100)
  • 自動(dòng)化測(cè)試工具selenium的安裝方法

    一、什么是selenium Selenium 是一套 Web網(wǎng)站 的程序自動(dòng)化操作 解決方案。 通過它,我們可以寫出自動(dòng)化程序,像人一樣在瀏覽器里操作web界面。 比如點(diǎn)擊界面按鈕,在文本框中輸入文字 等操作。 Selenium 通過使用? WebDriver ?支持市場(chǎng)上所有主流瀏覽器的自動(dòng)化。 Webdriver 是一個(gè)

    2024年02月09日
    瀏覽(30)
  • 自動(dòng)化測(cè)試工具Selenium的語法續(xù).

    自動(dòng)化測(cè)試工具Selenium的語法續(xù).

    OK,那么上篇博客我們介紹了如何搭建基于Java+selenium的環(huán)境,并且使用selenium的一些語法給大家演示了如何進(jìn)行自動(dòng)化測(cè)試的案例,那么本篇博客我們來繼續(xù)學(xué)習(xí)selenium的一些其他的比較重要的語法,感謝關(guān)注,期待三連~ 目錄 一、定位一組元素 二、下拉框處理 三、上傳文件

    2024年02月10日
    瀏覽(32)
  • Selenium教程:自動(dòng)化瀏覽器測(cè)試工具

    Selenium教程:自動(dòng)化瀏覽器測(cè)試工具

    Selenium是一款用于自動(dòng)化瀏覽器測(cè)試的工具,它提供了一系列的API和功能,使得開發(fā)人員可以編寫腳本來模擬用戶在瀏覽器中的行為。無論是在Web應(yīng)用程序的功能測(cè)試、性能測(cè)試還是數(shù)據(jù)抓取方面,Selenium都是一個(gè)強(qiáng)大且廣泛使用的工具。 在開始使用Selenium之前,您需要進(jìn)行安

    2024年02月07日
    瀏覽(201)
  • Web測(cè)試自動(dòng)化工具Selenium的使用

    Selenium是一個(gè)Web應(yīng)用測(cè)試的自動(dòng)化工具,它通過模擬點(diǎn)擊實(shí)現(xiàn)對(duì)Web應(yīng)用的功能測(cè)試。測(cè)試時(shí),除了Selenium,還需要對(duì)應(yīng)的瀏覽器驅(qū)動(dòng),如在Chrome實(shí)現(xiàn)自動(dòng)點(diǎn)擊,則需要chromedriver。 Selenium支持多種語言和多種瀏覽器,本文僅記錄python+chrome的使用。 1. 安裝python 略 2. 安裝Selenium 注

    2024年01月16日
    瀏覽(95)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包