Selenium4+Pytest+Allure+PO自動(dòng)化測(cè)試框架最新設(shè)計(jì)

最新設(shè)計(jì)說明: 使用selenium4的以服務(wù)方式連接驅(qū)動(dòng),使用 selenium4唯一的兩種定位方式,并加上智能流暢等待的封裝莺琳。
最終效果:1饱岸、實(shí)現(xiàn)頁面代碼與測(cè)試 代碼分離掺出,2、封裝公共方法苫费,其他頁面通過繼承調(diào)用汤锨。3、實(shí)現(xiàn) 測(cè)試 代碼與 測(cè)試數(shù)據(jù)分離 4百框、實(shí)現(xiàn)allure輸出加上附加截圖等報(bào)告闲礼。5、實(shí)現(xiàn)并發(fā)執(zhí)行。

1柬泽、POM介紹

2慎菲、封裝通用方法

# 哪些公共基本操作方法,初始化應(yīng)該有操作 方法
from selenium.webdriver.support.wait import WebDriverWait


class BaseAction(object):
    # :后面是 數(shù)據(jù)類型锨并,這個(gè)driver就是瀏覽器
    def __init__(self, driver):
        # 進(jìn)行瀏覽器操作露该,初始化一 定有瀏覽器
        self.driver = driver

    # 我把發(fā)現(xiàn)元素方法封裝,加上等待步驟
    def find_element(self, location, timeout=10, poll_frequency=1):
        #  By.ID類型 第煮,值解幼,加上智能等待
        local_by, local_value = location
        wait = WebDriverWait(self.driver, timeout, poll_frequency)
        return wait.until(lambda driver: self.driver.find_element(local_by, local_value))

    def find_elements(self, location, timeout=10, poll_frequency=1):
        #  By.ID類型 ,值包警,加上智能等待
        local_by, local_value = location
        wait = WebDriverWait(self.driver, timeout, poll_frequency)
        return wait.until(lambda driver: self.driver.find_elements(local_by, local_value))

    #     再封裝一下輸入文本方法
    def input(self, location, text):
        # 使用我們 封裝方法找到元素
        ele = self.find_element(location)
        # 點(diǎn)擊元素
        ele.click()
        # 清除元素內(nèi) 文本信息
        ele.clear()
        # 輸入文本信息
        ele.send_keys(text)

    def click(self, location):
        self.find_element(location).click()

3撵摆、頁面代碼與測(cè)試代碼分開

編寫每個(gè)頁面的屬性和方法(通常一個(gè)文件包括一個(gè)模塊大概4個(gè)增刪改查功能的頁面)以bing為 例,編寫搜索頁 和 結(jié)果頁的 屬性和 方法害晦。

from selenium.webdriver.common.by import By
from .base_action import BaseAction

# 瀏覽器bing搜索頁 中也要 有 公共的方法可 用
class BingSearchPage(BaseAction):
    # 屬性特铝,元素,元素定位,如果定位換了壹瘟,只換這里就行了鲫剿,其他代碼不用改
    search_text=By.ID,"sb_form_q"
    search_click=By.ID,"search_icon"

    # 方法  在搜索框中輸入信息,
    def enter_keyword(self,text):
        self.input(self.search_text,text)

    # 方法  點(diǎn)擊搜索圖標(biāo)
    def click_search(self):
        self.click(self.search_click)

# 瀏覽器bing搜索結(jié)果頁
class SearchResultPage(BaseAction):
#     沒什么屬性
#      方法:返回要 驗(yàn)證元素文本
    def get_source(self,txt):
        wait = WebDriverWait(self.driver, 10, 1)
        element = wait.until(EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT,txt)))
        return element.text

4、測(cè)試代碼第一版本

使用 pytest的fixture,yield等 實(shí)現(xiàn)初始化和銷毀俐筋。還有業(yè)務(wù)邏輯牵素。

from selenium.webdriver.chrome.service import Service as ChromeService
import pytest,os
import allure
from selenium import webdriver
from .page_bing import BingSearchPage, SearchResultPage

# 測(cè)試步驟:
# 初始化:
# 打開瀏覽器,關(guān)閉 瀏覽器(范圍 :module,一個(gè)文件只執(zhí)行一次)
@pytest.fixture(scope="module")
def driver():
    par_path = os.path.abspath(".")
    CHROMEDRIVER_PATH = par_path + "/driver/chromedriver"
    # selenium4的最新寫法
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)
    service = ChromeService(executable_path=CHROMEDRIVER_PATH)
    driver = webdriver.Chrome(service=service, options=options)
    driver.implicitly_wait(30)
    # 執(zhí)行第 一次 返回driver澄者,當(dāng)測(cè)試方法執(zhí)行完成后再進(jìn)入時(shí)從這句開始執(zhí)行笆呆,直接執(zhí)行關(guān)閉瀏覽器
    yield driver
    driver.close()


def test_bing_soso(driver):
    # 參數(shù)driver是上面的方法名,通過傳參的方式粱挡,在測(cè)試方法 前調(diào)用赠幕。
    #    輸入bing地址
    driver.get("https://cn.bing.com")
    #  初始化bing搜索 頁
    bing_search = BingSearchPage(driver)
    # 在搜索框輸入關(guān)鍵 字
    bing_search.enter_keyword("selenium")
    # 點(diǎn)擊搜索
    bing_search.click_search()
    # 初始化結(jié)果頁
    result_page = SearchResultPage(driver)
    # 斷言搜索結(jié)果正確
    assert "selenium" in result_page.get_source("selenium")

5、測(cè)試第二版本

加上數(shù)據(jù)驅(qū)動(dòng) @pytest.mark.parametrize

@pytest.mark.parametrize("keyword",["fiddler","appium","pytest"])
def test_bing_soso(driver,keyword):
    # 參數(shù)driver是上面的方法名询筏,通過傳參的方式榕堰,在測(cè)試方法 前調(diào)用。
    #    輸入bing地址
    driver.get("https://cn.bing.com")
    #  初始化bing搜索 頁
    bing_search = BingSearchPage(driver)
    # 在搜索框輸入關(guān)鍵 字
    bing_search.enter_keyword(keyword)
    # 點(diǎn)擊搜索
    bing_search.click_search()
    # 初始化結(jié)果頁
    result_page = SearchResultPage(driver)
    # 斷言搜索結(jié)果正確
    # time.sleep(3)
    assert keyword in result_page.get_source(keyword)

6嫌套、測(cè)試第三版本

測(cè)試代碼與數(shù)據(jù)分開逆屡,使用 yaml文件

test_data.yaml
- selenium
- fiddler
- jmeter
- postman
- 拜登新冠
- 俄烏戰(zhàn)爭(zhēng)

代碼:

import yaml
from selenium.webdriver.chrome.service import Service as ChromeService
import pytest,os,time
import allure
from selenium import webdriver
from .page_bing import BingSearchPage, SearchResultPage

# 測(cè)試步驟:
# 初始化:
# 打開瀏覽器,關(guān)閉 瀏覽器(范圍 :module,一個(gè)文件只執(zhí)行一次)
par_path = os.path.abspath(".")
@pytest.fixture(scope="module")
def driver():
    CHROMEDRIVER_PATH = par_path + "/driver/chromedriver"
    # selenium4的最新寫法
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)
    service = ChromeService(executable_path=CHROMEDRIVER_PATH)
    driver = webdriver.Chrome(service=service, options=options)
    driver.implicitly_wait(30)
    # 執(zhí)行第 一次 返回driver踱讨,當(dāng)測(cè)試方法執(zhí)行完成后再進(jìn)入時(shí)從這句開始執(zhí)行魏蔗,直接執(zhí)行關(guān)閉瀏覽器
    yield driver
    driver.quit()


@pytest.mark.parametrize("keyword",yaml.safe_load(open(par_path+"/POM_test/test_data.yaml")))
def test_bing_soso(driver,keyword):
    # 參數(shù)driver是上面的方法名,通過傳參的方式痹筛,在測(cè)試方法 前調(diào)用莺治。
    #    輸入bing地址
    driver.get("https://cn.bing.com")
    #  初始化bing搜索 頁
    bing_search = BingSearchPage(driver)
    # 在搜索框輸入關(guān)鍵 字
    bing_search.enter_keyword(keyword)
    # 點(diǎn)擊搜索
    bing_search.click_search()
    # 初始化結(jié)果頁
    result_page = SearchResultPage(driver)
    # 斷言搜索結(jié)果正確
    assert keyword in result_page.get_source(keyword)
image.png

如果有漢語廓鞠,yaml加載文件的open()中參數(shù)加 encoding='utf8'
如果顯示結(jié)果也可看到正常漢語,建立pytest.ini谣旁,里面 寫 上 這 句就 可以

[pytest]
disable_test_id_escaping_and_forfeit_all_rights_to_community_support=True

7床佳、 加 allure報(bào)告 (簡(jiǎn)單)及 并行 執(zhí)行

@pytest.mark.parametrize("keyword",yaml.safe_load(open("/Users/lindafang/PycharmProjects/selenium_project0704/POM_test/test_data.yaml",encoding='utf8')))
def test_bing_soso(driver,keyword):
    # 參數(shù)driver是上面的方法名,通過傳參的方式榄审,在測(cè)試方法 前調(diào)用砌们。
    #    輸入bing地址
    driver.get("https://cn.bing.com")
    #  初始化bing搜索 頁
    bing_search = BingSearchPage(driver)
    # 在搜索框輸入關(guān)鍵 字
    bing_search.enter_keyword(keyword)
    # 點(diǎn)擊搜索
    bing_search.click_search()
    # 初始化結(jié)果頁
    result_page = SearchResultPage(driver)
    # 斷言搜索結(jié)果正確
    time.sleep(3)
    driver.save_screenshot(keyword+".png")
    allure.attach.file(keyword+".png","搜索成功截圖",attachment_type=allure.attachment_type.PNG)
    assert keyword in result_page.get_source(keyword)

并發(fā)運(yùn)行命令 及結(jié)果


image.png

image.png

完美!瘟判!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怨绣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拷获,更是在濱河造成了極大的恐慌,老刑警劉巖减细,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匆瓜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡未蝌,警方通過查閱死者的電腦和手機(jī)驮吱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萧吠,“玉大人左冬,你說我怎么就攤上這事≈叫停” “怎么了拇砰?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狰腌。 經(jīng)常有香客問我除破,道長(zhǎng),這世上最難降的妖魔是什么琼腔? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任瑰枫,我火速辦了婚禮,結(jié)果婚禮上丹莲,老公的妹妹穿的比我還像新娘光坝。我一直安慰自己,他們只是感情好甥材,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布盯另。 她就那樣靜靜地躺著,像睡著了一般擂达。 火紅的嫁衣襯著肌膚如雪土铺。 梳的紋絲不亂的頭發(fā)上胶滋,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音悲敷,去河邊找鬼究恤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛后德,可吹牛的內(nèi)容都是我干的部宿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼瓢湃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼理张!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绵患,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤雾叭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后落蝙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體织狐,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年筏勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了移迫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡管行,死狀恐怖厨埋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捐顷,我是刑警寧澤荡陷,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站套菜,受9級(jí)特大地震影響亲善,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逗柴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一蛹头、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戏溺,春花似錦渣蜗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至托享,卻和暖如春骚烧,著一層夾襖步出監(jiān)牢的瞬間浸赫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工赃绊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留既峡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓碧查,卻偏偏與公主長(zhǎng)得像运敢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忠售,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容