最新設(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)
如果有漢語廓鞠,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é)果
完美!瘟判!