1. 程式人生 > 遊戲攻略 >《原神攻略》雷澤命之座解析與聖遺物選擇建議

《原神攻略》雷澤命之座解析與聖遺物選擇建議

一、Po模型介紹

1.簡介

在自動化中,Selenium自動化測試中有一個名字經常被提及PageObject(思想與面向物件的特徵相同),通常PO模型可以大大提高測試用例的維護效率

2.為什麼要用PO

基於python selenium2開始ui自動化測試指令碼的編寫不是多麼艱鉅的任務。只需要定位到元素,執行對應元素的操作即可。我們所能做的就是元素的定位,然後進行鍵盤輸入或滑鼠動作。但隨著時間的遷移,測試套件將持續的增長。指令碼也將變的越來越多。如果我們需要維護10個頁面,100個頁面,甚至1000個呢?那麼頁面元素的任何改變都會讓我們的指令碼維護變得繁瑣複雜,而且變得耗時易出錯。那怎麼解決呢?ui自動化中,常用的一種方式,引入Page Object(PO):頁面物件模式來解決,po能讓我們的測試程式碼變得可讀性更好,可維護性高,複用性高。

3.PO的優勢

1、PO提供了一種業務流程與頁面元素操作分離的模式,這使得測試程式碼變得更加清晰。
2、頁面物件與用例分離,使得我們更好的複用物件。
3、可複用的頁面方法程式碼會變得更加優化
4、更加有效的命名方式使得我們更加清晰的知道方法所操作的UI元素。
# 總結:
重用,業務和物件分離,程式碼結構清晰,方便程式碼維護

二、Po的設計模式

三、PO的核心要素

1.在PO模式中抽離封裝整合一個BasePage類,該基類應該擁有一個只實現webdriver例項的屬性
2.每一個page都繼承BasePage,通過driver來管理本page中元素,將page中的操作封裝成一個個方法
3.TestCase繼承unittest.Testcase類,並依賴page類,從而實現相應的測試步驟 # 總結 PO設計模式中的BasePage基類對應案例中的BasePage.py檔案 PO模式中的pages中的案例顯示Search.py PO模式設計中TestCase對應案例中的TestCase.py

四、非PO實現

# 程式碼展示
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_id(
"kw").send_keys("jack") sleep(1) driver.find_element_by_id("su").click() sleep(2) driver.quit()
# 程式碼分析
不同的執行指令碼環境,遊覽器不同:驅動webdriver.Firefox()可以剝離;
請求地址的變化(生產環境和測試環境):url = http://www.baidu.com可以剝離;
操作元素時,常常要等待元素載入完成方可進行操作:可以把webdriver提供的find_element*方法封裝,在元素操作前,先判斷元素是否可以操作;
實際測試場景中,可能有多個測試場景,如果每個測試場景都需要維護url,遊覽器驅動,元素定位等,效率會非常低;
因此基於以上分析,是否可以設計一個所有測試介面(selenium本身是B/S系統開展測試)的基類,來維護公共的方法,此處定義名字為BasePage.py,用於存放頁面公共方法及webdriver原有方法二次封裝等。

五、PO實現(多個 page介面)

1.Base基類(base.py)

from selenium.webdriver.common.action_chains import ActionChains  # 滑鼠操作


class BasePage():
    """初始化方法"""

    def __init__(self, dir, url):
        self.dir = dir  
        self.url = url  

    """進入網址的方法"""

    def enter_url(self):
        self.dir.get(self.url)

    """定位元素"""

    def find_element(self, *args):
        return self.dir.find_element(*args)

    """點選"""

    def click_element(self, *args):
        ActionChains(self.dir).click(self.find_element(*args)).perform()

    """輸入"""

    def send_element(self, text, *args):
        self.dir.find_element(*args).send_keys(text)

    """清除"""

    def clear_element(self, *args):
        self.dir.find_element(*args).clear()

    """表單切換"""

    def switch_iframe(self, *args):
        self.dir.switch_to.frame(self.dir.find_element(*args))

    """視窗切換"""

    def switch_window(self, n):
        self.dir.switch_to.window(self.dir.window_handles[n])

2.Pages查詢頁面元素類(hao.py和bddt.py)

# hao.py
from Base.base import BasePage
from selenium.webdriver.common.by import By
from selenium import webdriver


class SearchPage(BasePage):
    """初始化"""

    def __init__(self, dir, url):
        BasePage.__init__(self, dir, url)

    """進入百度"""

    def enter_bd(self):
        self.enter_url()

    """輸入搜尋內容"""

    def ssnr(self, text):
        self.send_element(text, By.ID, "kw")

    """點選百度一下按鈕"""

    def clickff(self):
        self.click_element(By.ID, "su")
# bddt.py
from Base.base import BasePage
from selenium.webdriver.common.by import By
from selenium import webdriver


class SearchPage2(BasePage):
    """初始化"""

    def __init__(self, dir, url):
        BasePage.__init__(self, dir, url)

    """點選進入hao123"""

    def clickenter(self):
        self.click_element(By.CSS_SELECTOR, ".t>a")

    """切換控制代碼hao123"""

    def qiehuan(self, n):
        self.switch_window(n)

    """點選百度地圖"""

    def clickbddt(self):
        self.click_element(By.CSS_SELECTOR, ".js_bd > li:nth-child(6) > div:nth-child(1) > a:nth-child(1)")

3.Case測試用例(test001.py)

import unittest
from selenium import webdriver
from Pages.hao import SearchPage
from Pages.bddt import SearchPage2
import time

class Test01Class(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.dir = webdriver.Firefox()
        cls.dir.implicitly_wait(30)

    def test01(self):
        url = "http://www.baidu.com"
        s = SearchPage(self.dir, url)
        s.enter_bd()
        s.ssnr("123")
        s.clickff()

        # self.dir.switch_to.window(self.dir.window_handles[-1])

    def test02(self):
        url = ""
        b = SearchPage2(self.dir, url)
        b.clickenter()
        b.qiehuan(1)
        time.sleep(10)
        b.clickbddt()

    @classmethod
    def tearDownClass(cls) -> None:
        cls.dir.quit()
        pass


if __name__ == '__main__':
    unittest.main()