<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ``` 一、數據驅動 1.1 什么是數據驅動? 說明: 1. 通過測試數據控制用例的執行,直接影響測試結果; 2. 數據驅動是最好結合PO+參數化技術使用; 1.2 數據驅動優點 將維護關注點放到測試數上,而不去關注測試腳本代碼; 1.3 數據驅動常用的格式 1.json(重點) 2.xml 3.excel 4.csv 5.txt 1.4 json介紹 1. 一種純文本格式,后綴.json; 2. 一種輕量級數據交換格式:(接口數據傳遞基本使用 json格式) 3. 由鍵值對組成,和 python的字典格式一模一樣,不同之處在于(json是文本格式) 4. json語法:花括號包含鍵值對,鍵與值之間使用冒號(:)分隔,鍵值對之間使用逗號(,)分隔; 1.5 json與字典轉換 1).字典轉為json字符串 方法: dumps() 操作: 1.導包 2.調用dumps方法 3.打印類型 注意: 使用dumps方法,而不是dump方法; 2)json字符串轉字典 方法:1oads() 操作: 1.導包 2.調用1oads方法 3.打印類型 注意: 1.使用1oads方法而不是1oad方法; 2.字符串中的鍵名必須使用雙引號; ``` <details> <summary>test01_dict_json.py</summary> ``` # test01_dict_json.py ''' 目標:將python中的字典轉換為 json字符串 案例: data = {"name":"張三", "age":18} 操作: 1. 導包 import json 2. 調用dumps()方法 將字典轉換為 json字符串 注意: json中:還有一個方法 dump()寫入json,勿要選錯; ''' import json '''將字典轉換為json字符串''' # data = {"name":"張三", "age":18} # # 調用dumps進行轉換json字符串 # print("轉換之前的數據類型:", type(data)) # d2 = json.dumps(data) # print("轉換之后的數據類型:", type(d2)) ''' 目標:將字符串轉為json 方法:loads()將字符串轉為字典 注意:load() 此方法為讀取json方法,千萬別寫錯了。 ''' data = "{'data':'張三', 'age':18}" # 注意錯誤寫法,屬性名必須使用雙引號 data = '{"data":"張三", "age":18}' print("轉之前:", type(data)) d3 = json.loads(data) print("轉之后:", type(d3)) ``` </details> <br /> <details> <summary>test02_json_write.py</summary> ``` # test02_json_write.py ''' 目標:寫入json 案例: 1. data = {"name":"tom", "age":18} 2. data = {"name":"李四", "age":18} 操作: 1. 導包json 2. 方法 dump 注意: 1. 寫入操作 w 2. 寫入方法:dump()而不是dumps() ''' import json # data = {"name":"tom", "age":18} data = {"name":"李四", "age":18} # 獲取文件流 并 寫入數據 with open("../data/write.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False) ``` </details> <br /> <details> <summary>test03_json_read.py</summary> ``` # test03_json_read.py ''' 目標:讀取json 案例: 讀取 data/write.json 操作: 1. 導包 json 2. 方法 load(文件流) 注意: 1. 讀取操作 r 2. 讀取方法:load()而不是loads() ''' import json # 打開要讀取的文件流 并調用 load方法 with open("../data/write.json", "r", encoding="utf-8") as f: data = json.load(f) print(data) ``` </details> <br /> ``` drvier封裝 類名 # 定義類變量 driver = None @classmethod # 獲取 driver方法 如果 cls.driver is None: # 獲取瀏覽器驅動對象 # 最大化 # 打開url 注:url建議寫入配置文件中 返回 c1s.driver @classmethod # 關閉driver方法 如果c1s.driver: cls.driver.quit() # 注意此處一定要置空 cls.driver = None ``` ![6FCDF61E-5689-413A-B21E-3D1480D0FFD9.jpg](https://i.loli.net/2021/01/20/CP9qI4OviejY2k1.jpg) <details> <summary>base/base.py</summary> ``` # base/base.py from selenium.webdriver.support.wait import WebDriverWait import time class Base: def __init__(self, driver): self.driver = driver def base_find_element(self, loc, timeout=30, poll=0.5): ''' :param loc: 元素的定位信息,格式為元組 :param timeout: 默認超時時間30秒 :param poll: 訪問頻率,默認0.5秒查找一次元素 :return: 返回查找到的元素 ''' # 顯示等待 return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).\ until(lambda x:x.find_element(*loc)) def base_click(self, loc): self.base_find_element(loc).click() # 獲取value屬性方法封裝 def base_get_value(self, loc): # 使用get_attribute()方法獲取指定的元素屬性值 # 注意:返回 return self.base_find_element(loc).get_attribute("value") # 截圖 def base_get_img(self): self.driver.get_attribute_as_file( "../image{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S"))) ``` </details> <br /> <details> <summary>base/get_driver.py</summary> ``` # base/get_driver.py from selenium import webdriver from day07.po1 import page class GetDriver: # 設置類屬性 driver = None @classmethod def get_driver(cls): if cls.driver is None: cls.driver = webdriver.Chrome() cls.driver.maximize_window() cls.driver.get(page.url) return cls.driver # 退出driver @classmethod def quit_driver(cls): if cls.driver: cls.driver.quit() # 注意:此處有一個大坑 cls.driver = None if __name__ == '__main__': # 第一次獲取瀏覽器 print(GetDriver().get_driver()) # 第二次獲取瀏覽器 print(GetDriver().get_driver()) # 調用關閉,測試 關閉后driver是否為None GetDriver().quit_driver() # print(GetDriver().get_driver()) ``` </details> <br /> <details> <summary>page/__init__.py</summary> ``` # page/__init__.py from selenium.webdriver.common.by import By '''以下為服務器域名配置地址''' url = "http://cal.apple886.com/t" '''以下為計算器配置數據''' # 由于數字鍵有一定的規律,所以暫時先不用定位此鍵,用到的時候再考慮 clac_num = By.CSS_SELECTOR, "simple9" # 加號 clas_add = By.CSS_SELECTOR, "#simpleAdd" # 等號 clac_eq = By.CSS_SELECTOR, "#simpleEqule" # 獲取結果 clac_result = By.CSS_SELECTOR, "resultIp" # 清屏 clac_clear = By.CSS_SELECTOR, "#simpleClearAllBtn" ``` </details> <br /> <details> <summary>page/page_calc.py</summary> ``` # page/page_calc.py from selenium.webdriver.common.by import By from day07.po1.base import Base from day07.po1 import page class PageCalc(Base): # 點擊數字方法 def page_click_num(self, num): # 拆開單個按鈕的定位方式 for n in str(num): loc = By.CSS_SELECTOR, "simple{}".format(n) self.base_click() # 點擊加號 def page_click_add(self): self.base_click(page.clac_add) # 點擊等號 def page_click_eq(self): self.base_click(page.clac_eq) # 獲取結果方法 def page_get_value(self): return self.base_get_value(page.clac_result) # 點擊清屏 def page_click_clear(self): self.base_click(page.clac_clear) # 截圖 def page_get_image(self): self.base_get_img() # 組裝加法業務 def page_add_calc(self, a, b): self.page_click_num(a) self.page_click_add() self.page_click_num(b) self.page_click_eq() ``` </details> <br /> <details> <summary>scripts/test_calc.py</summary> ``` # scripts/test_calc.py import unittest from parameterized import parameterized from day07.po1.page.page_calc import PageCalc class TestCalc(unittest.TestCase): @classmethod def setUpClass(cls): cls.calc = PageCalc() def tearDown(cls) -> None: pass @parameterized.expand([1, 2, 3]) def test_add_calc(self, a, b, expect): self.calc.page_add_calc(a, b) try: self.assertEqual(self.calc.page_get_value(), expect) except: self.calc.page_get_image() ``` </details> <br />
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看