<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] UI自動化和接口自動化框架的設計思路大同小異,主要目的還是分離業務代碼和測試數據,達到代碼的復用,提高測試用例的可維護性以及最最重要的減少人工勞動力。 <br /> **框架目錄結構:** ![](https://img.kancloud.cn/6d/09/6d090eea379982b050a72710db9d5ee1_261x228.png) ``` case:存放具體的測試代碼 comm:存放共通的方法 file:存放測試用例等測試過程中用到的測試數據 result:每次測試的log和測試報告的存放位置 caseList:規定執行哪些測試 config:配置靜態數據 readConfig:讀取config文件內容 runAll:測試執行入口文件 ``` 首先,要保證你的python已經安裝了selenium包,如果你是用pip來管理自己的python環境的,那么你可以通過下面的命令來導入selenium模塊: `pip install selenium ` 然后,你需要到網上去下載對應瀏覽器的驅動,這里小編使用的是chrome瀏覽器,(chrome下載地址:http://chromedriver.storage.googleapis.com/index.html)。下載完成之后呢,將下載的瀏覽器驅動放到本地的python安裝目錄下,這樣就可以直接在框架中使用了。至此,必備的條件都有了,我們就可以開工啦。 這里呢,我們就只挑部分內容進行講解,有許多跟接口測試框架相同或相似的方法和文件,就不一一進行二次說明了,第一次看的盆友們,有不明白的地方可以看這篇文章,進行補充學習https://my.oschina.net/u/3041656/blog/820023 <br /> **打開瀏覽器:** ``` from selenium import webdriver class Driver: def __init__(self): self.browser = webdriver.Chrome() def open_browser(self): """ Do something for browser :return: browser """ # 窗口最大化 self.browser.maximize_window() # 打開地址鏈接 url = 'http://www.baidu.com' self.browser.get(url) return self.browser def close_browser(self): """ quit browser :return: """ self.browser.quit() ``` 從上面的代碼可以看出,我們進行了打開/關閉瀏覽器的方法定義,只有簡單的幾行代碼,當然了,這里為了方便大家觀看,我把url地址直接寫了出來,在實際操作時,我們可以將其抽離出來,根據自己的需要,傳入不同的url地址。這就留著讓大家去自己實現吧。 <br /> **一個搜索例子:** ``` # -*- coding: utf-8 -*- from time import sleep from selenium import webdriver import unittest class Login(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() # 窗口最大化 self.driver.maximize_window() self.msg = '海賊王' self.url = "http://www.baidu.com" def testSearch(self): ''' test body :return: ''' # open browser self.driver.get(self.url) sleep(3) # click search input self.driver.find_element_by_id('kw').click() sleep(1) # input value self.driver.find_element_by_id('kw').send_keys(self.msg) sleep(1) self.driver.find_element_by_id('su').click() sleep(1) def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main() ``` <br /> **添加log日志:** 在上面的基礎上,我們可以添加執行時輸出的log日志。所以開始寫log文件,并將它放在comm文件夾下,作為共同方法來用。這部分內容在接口測試框架那里已經介紹過了,所以請還不清楚的朋友們移步此處:[https://my.oschina.net/u/3041656/blog/820023](https://my.oschina.net/u/3041656/blog/820023) <br /> **抽離出瀏覽器的相關操作:** 我們可以將對瀏覽器的操作剝離出來,單獨放到一個文件中,這樣既清晰,又避免了重復的代碼操作。而且維護起來也比較方便。 ``` from selenium import webdriver from comm.Log import MyLog as Log import readConfig import threading localReadConfig = readConfig.ReadConfig() class Driver: def __init__(self): self.log = Log.get_log() self.logger = self.log.get_logger() self.browser = webdriver.Chrome() def open_browser(self, name1, name2): """ Do something for browser :return: browser """ self.logger.info("Open browser") # 窗口最大化 self.browser.maximize_window() # 打開地址鏈接 url = localReadConfig.get_webServer(name1, name2) self.browser.get(url) return self.browser def close_browser(self): """ quit browser :return: """ self.browser.quit() self.logger.info("Quit browser") def get_driver(self): """ get web driver :return: """ return self.browser class MyDriver: driver = None mutex = threading.Lock() def __init__(self): pass @staticmethod def get_browser(): if MyDriver.driver is None: MyDriver.mutex.acquire() MyDriver.driver = Driver() MyDriver.mutex.release() return MyDriver.driver if __name__ == "__main__": driver = MyDriver.browser() browser = driver.open_browser() ``` 以上便是剝離出來的部分,并且將它放到了單獨的線程中。 <br /> **關于Element的那些事兒:** 做過UI功能測試的朋友們應該都知道,元素是我們測試最基本也是最重要的東西,以為它是我們直接的操作對象,所以,處理好它們,我們就會省掉很多的麻煩,所以呢,接下來,將會繼續分享自己處理element的一些方法。 ``` class Element: def __init__(self, activity_name, element_name): self.driver1 = Driver.get_browser() self.driver = self.driver1.get_driver() self.activity = activity_name self.element = element_name element_dict = get_el_dict(self.activity, self.element) self.pathType = element_dict.get('pathType') self.pathValue = element_dict.get('pathValue') def is_exist(self): """ Determine element is exist :return: TRUE OR FALSE """ try: if self.pathType == 'ID': self.driver.find_element_by_id(self.pathValue) return True if self.pathType == 'XPATH': self.driver.find_elements_by_xpath(self.pathValue) return True if self.pathType == 'CLASSNAME': self.driver.find_element_by_class_name(self.pathValue) return True if self.pathType == 'NAME': self.driver.find_element_by_name(self.pathValue) return True except NoSuchElementException: return False def wait_element(self, wait_time): """ wait element appear in time :param wait_time: wait time :return: true or false """ time.sleep(wait_time) if self.is_exist(): return True else: return False def get_element(self): """ get element :return: element """ try: if self.pathType == 'ID': element = self.driver.find_element_by_id(self.pathValue) return element if self.pathType == 'XPATH': element = self.driver.find_elements_by_xpath(self.pathValue) return element if self.pathType == 'CLASSNAME': element = self.driver.find_element_by_class_name(self.pathValue) return element if self.pathType == 'NAME': element = self.driver.find_element_by_name(self.pathValue) return element except NoSuchElementException: return None def get_element_by_index(self, index): """ get element by index :param index: index :return: element """ try: if self.pathType == 'ID': element = self.driver.find_element_by_id(self.pathValue) return element[index] if self.pathType == 'XPATH': element = self.driver.find_elements_by_xpath(self.pathValue) return element[index] if self.pathType == 'CLASSNAME': element = self.driver.find_element_by_class_name(self.pathValue) return element[index] if self.pathType == 'NAME': element = self.driver.find_element_by_name(self.pathValue) return element[index] except NoSuchElementException: return None def get_element_list(self): """ get element list :return: element list """ try: if self.pathType == 'ID': element_list = self.driver.find_element_by_id(self.pathValue) return element_list if self.pathType == 'XPATH': element_list = self.driver.find_elements_by_xpath(self.pathValue) return element_list if self.pathType == 'CLASSNAME': element_list = self.driver.find_element_by_class_name(self.pathValue) return element_list if self.pathType == 'NAME': element_list = self.driver.find_element_by_name(self.pathValue) return element_list except NoSuchElementException: return None def click(self): """ click element :return: """ element = self.get_element() time.sleep(1) element.click() def send_key(self, key): """ input key :param key: input value :return: """ element = self.get_element() time.sleep(1) element.clear() element.send_keys(key) def input_keys(self, index, key): """ By index send key :param index: index :param key: key :return: """ element = self.get_element_by_index(index) time.sleep(1) element.clear() element.send_keys(key) def get_text_value(self): """ get attribute :return: """ element = self.get_element() value = element.get_attribute('text') return str(value) ``` **那些讓人費神的測試數據文件:** 每一個好的測試,都離不開一份好的測試用例數據,那么,這么多的數據,我們要怎樣進行管理才能既不亂又方便以后對數據進行更改維護呢? 其實,小編也不知道有什么好辦法,小編就是使用excel文件來對測試用例進行統一管理的。請看下面: ![](https://static.oschina.net/uploads/space/2017/0313/154526_aC0M_3041656.png) 形式就是這么個形式,內容就隨便你們怎么修改了。畢竟我也只能幫你們到這里了。至于對excel文件內容的讀取,在接口測試那篇博文中也有詳細介紹哦。不明白的同學請移步:[https://my.oschina.net/u/3041656/blog/820023](https://my.oschina.net/u/3041656/blog/820023) 其實,出來測試用例,還有一個數量龐大的數據群體,就是:元素定位的數據,包括:id,name,classname,xpath等等,這些數據可是我們在測試過程中找到頁面元素的不二法門。所以各位朋友一定要注意啦,一定要處理好它們。 請看下面: ![](https://img.kancloud.cn/71/c4/71c4ee6f25cae034b4f5beaa5fadea83_1033x516.png)
                  <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>

                              哎呀哎呀视频在线观看