UI自动化+web测试基础3-2,京东流程
生活随笔
收集整理的這篇文章主要介紹了
UI自动化+web测试基础3-2,京东流程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天上午做了一個(gè)京東的一個(gè)項(xiàng)目的總體流程,僅供參考,,,沒有斷言的用例就是完美的用例
主要:就是首頁中搜索商品,然后點(diǎn)擊商品,然后將商品加入購物車,加入購物車后點(diǎn)擊去購物車結(jié)算,去結(jié)算
封裝類,自己定義包名,方法名我定義的是firefox.py
firefox.py
#-*- coding:utf-8 -*- # 倒包 from selenium import webdriver# 導(dǎo)入休眠包 import time# 導(dǎo)入枚舉包 from enum import Enum# 倒包 from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By# 定義類繼承單元測試 class FireFox(object):# 打開瀏覽器 def firefox_start(self,url):# 打開瀏覽器 self.driver = webdriver.Firefox()# 設(shè)置最大化 self.driver.maximize_window()# 大愛指定網(wǎng)站 self.driver.get(url)# 設(shè)置休眠 self.TimeSleep(ENUMS.FIVE_TIME)pass # 關(guān)閉瀏覽器 def firefox_close(self):# 關(guān)閉 self.driver.quit()pass # 靜態(tài)休眠 def TimeSleep(self,number):time.sleep(number)pass # 隱士休眠 def TimeImplay(self,number):self.driver.implicitly_wait(number)pass # 查找控件方式 8 種 def FindID(self,ID):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, ids = (By.ID,ID)# 休眠 WebDriverWait(self.driver,ENUMS.TWENTY_TIME,ENUMS.ONE_HALF).until(EC.presence_of_element_located(ids))return self.driver.find_element_by_id(ID)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickID(self,ID):self.FindID(ID).click()# 輸入內(nèi)容 def SendkeysID(self,ID,message):self.FindID(ID).send_keys(message)# 查找控件方式 8 種 def FindName(self, name):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, names = (By.NAME, name)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(names))return self.driver.find_element_by_name(name)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickName(self, name):self.FindName(name).click()# 輸入內(nèi)容 def SendkeysName(self, name, message):self.FindName(name).send_keys(message)# 查找控件方式 8 種 def FindClass(self, cls):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, clss = (By.CLASS_NAME, cls)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(clss))return self.driver.find_element_by_class_name(cls)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickClass(self, cls):self.FindClass(cls).click()# 輸入內(nèi)容 def SendkeysClass(self, cls, message):self.FindClass(cls).send_keys(message)# 查找控件方式 8 種 def FindXpath(self, xpath):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, xpaths = (By.XPATH, xpath)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(xpaths))return self.driver.find_element_by_xpath(xpath)# 查找控件方式 8 種 def FindXpaths(self, xpath):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, xpaths = (By.XPATH, xpath)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(xpaths))return self.driver.find_elements_by_xpath(xpath)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickXpath(self, xpaht):self.FindXpath(xpaht).click()# 輸入內(nèi)容 def SendkeysXpath(self, xpaht, message):self.FindXpath(xpaht).send_keys(message)# 查找控件方式 8 種 def FindLink(self, link):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, links = (By.LINK_TEXT, link)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(links))return self.driver.find_element_by_link_text(link)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickLink(self, link):self.FindLink(link).click()# 輸入內(nèi)容 def SendkeysLink(self, linl, message):self.FindLink(linl).send_keys(message)# 查找控件方式 8 種 def FindPaty(self, link):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, links = (By.PARTIAL_LINK_TEXT, link)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(links))return self.driver.find_element_by_partial_link_text(link)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickPart(self, link):self.FindPaty(link).click()# 輸入內(nèi)容 def SendkeysPart(self, linl, message):self.FindPaty(linl).send_keys(message)# 查找控件方式 8 種 def FindTag(self, tag):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, tags = (By.TAG_NAME, tag)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(tags))return self.driver.find_element_by_tag_name(tag)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickTag(self, tag):self.FindTag(tag).click()# 輸入內(nèi)容 def SendkeysTag(self, tag, message):self.FindTag(tag).send_keys(message)# 查找控件方式 8 種 def FindCss(self, css):# 使用顯示休眠,一共休眠20秒,每隔0.5秒休眠一次, csses = (By.CSS_SELECTOR, css)# 休眠 WebDriverWait(self.driver, ENUMS.TWENTY_TIME, ENUMS.ONE_HALF).until(EC.presence_of_element_located(csses))return self.driver.find_element_by_css_selector(css)# 根據(jù)id設(shè)置點(diǎn)擊事件 def ClickCss(self, css):self.FindCss(css).click()# 輸入內(nèi)容 def SendkeysCss(self, css, message):self.FindCss(css).send_keys(message)# 獲取title def getTitle(self):return self.driver.title# 獲取當(dāng)前窗口 def getCurrent_Window(self):return self.driver.current_window_handle# 切換窗口的方法 def switch_to_window(self,current):# 獲取所有的窗口 allwindows = self.driver.window_handles# 使用for循環(huán)進(jìn)行切換 for window in allwindows:if window != current:self.driver.switch_to.window(window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickID_Window(self,ID):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickID(ID)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickName_Window(self, name):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickName(name)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickClass_Window(self, cls):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickClass(cls)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickXpath_Window(self, xpath):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickXpath(xpath)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickTag_Window(self, tag):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickTag(tag)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickCss_Window(self, css):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickCss(css)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickLink_Window(self, link):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickLink(link)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 設(shè)置點(diǎn)擊事件,以及切換窗口的封裝 def ClickPart_Window(self, part):# 獲取當(dāng)前窗口 current_window = self.getCurrent_Window()# 進(jìn)行點(diǎn)擊 self.ClickPart(part)# 休眠五秒 self.TimeSleep(ENUMS.FIVE_TIME)# 切換窗口 self.switch_to_window(current_window)# 通過js定位當(dāng)前窗口 def switch_to_view_js_ID(self,ID):# 執(zhí)行 js arguments[0].scrollIntoView(); self.driver.execute_script("arguments[0].scrollIntoView();",self.FindID(ID))pass # 通過js定位當(dāng)前窗口 def switch_to_view_js_Name(self, name):# 執(zhí)行 js self.driver.execute_script("arguments[0].scrollIntoView();", self.FindName(name))pass # 通過js定位當(dāng)前窗口 def switch_to_view_js_Class(self, cls):# 執(zhí)行 js self.driver.execute_script("arguments[0].scrollIntoView();", self.FindClass(cls))pass # 通過js定位當(dāng)前窗口 def switch_to_view_js_Xpath(self, xpath):# 執(zhí)行 js self.driver.execute_script("arguments[0].scrollIntoView();", self.FindXpath(xpath))pass # 通過js定位當(dāng)前窗口 def switch_to_view_js_Tag(self, tag):# 執(zhí)行 js self.driver.execute_script("arguments[0].scrollIntoView();", self.FindTag(tag))pass # 通過js定位當(dāng)前窗口 def switch_to_view_js_css(self, css):# 執(zhí)行 js self.driver.execute_script("arguments[0].scrollIntoView();", self.FindCss(css))pass # 通過js定位當(dāng)前窗口 def switch_to_view_js_link(self, link):# 執(zhí)行 js self.driver.execute_script("arguments[0].scrollIntoView();", self.FindLink(link))pass # 通過js定位當(dāng)前窗口 def switch_to_view_js_part(self, part):# 執(zhí)行 js self.driver.execute_script("arguments[0].scrollIntoView();", self.FindPaty(part))pass # 切換到frame ID def seitch_to_id_frame(self,ID):# 切換到frame里面 self.driver.switch_to.frame(self.FindID(ID))# 注意 pass沒有任何意義,只是在寫代碼的時(shí)候怕報(bào)錯,用來占位的 pass # 切換到frame Name def seitch_to_name_frame(self, name):# 切換到frame里面 self.driver.switch_to.frame(self.FindName(name))# 注意 pass沒有任何意義,只是在寫代碼的時(shí)候怕報(bào)錯,用來占位的 pass # 切換到frame Class def seitch_to_class_frame(self, cls):# 切換到frame里面 self.driver.switch_to.frame(self.FindClass(cls))# 注意 pass沒有任何意義,只是在寫代碼的時(shí)候怕報(bào)錯,用來占位的 pass # 切換到frame xpath def seitch_to_xpath_frame(self, xpath):# 切換到frame里面 self.driver.switch_to.frame(self.FindXpath(xpath))# 注意 pass沒有任何意義,只是在寫代碼的時(shí)候怕報(bào)錯,用來占位的 pass # 切換到frame tag def seitch_to_tag_frame(self, tag):# 切換到frame里面 self.driver.switch_to.frame(self.FindTag(tag))# 注意 pass沒有任何意義,只是在寫代碼的時(shí)候怕報(bào)錯,用來占位的 pass # 切換到frame tag def seitch_to_css_frame(self, css):# 切換到frame里面 self.driver.switch_to.frame(self.FindCss(css))# 注意 pass沒有任何意義,只是在寫代碼的時(shí)候怕報(bào)錯,用來占位的 pass # 封裝斷言, 查找控件,獲取內(nèi)容,斷言前后是不是一致 def AssertEquilClass(self,self1,cls,expect):# 查找控件,獲取內(nèi)容 self.message = self.FindClass(cls).text# 進(jìn)行斷言 self1.assertEqual(self.message,expect)pass # 通過 title去斷言 def AssertEquilTitle(self,self1,expect):# 設(shè)置休眠,在這里使用強(qiáng)制等待 self.TimeSleep(ENUMS.FIVE_TIME)# 查找控件,獲取內(nèi)容 self.message = self.getTitle()# 進(jìn)行斷言 self1.assertEqual(self.message,expect)pass # 斷言數(shù)量 def AssertEquilCount(self,self1,cls,number):# 查詢一組控件,進(jìn)行斷言 clses = self.FindClasses(cls)# 進(jìn)行斷言 self1.assertEqual(len(clses), number)pass # 斷言控件是不是可見 def AssertTrueID(self,self1,ID):# 設(shè)置休眠 給網(wǎng)絡(luò)請求或者邏輯判斷的加載時(shí)間 self.TimeSleep(ENUMS.FIVE_TIME)# 進(jìn)行斷言 self1.assertTrue(self.FindID(ID).is_displayed())# 通過 class 查詢一組列表的元素 def FindClasses(self,cls):# 查詢cls clss = (By.CLASS_NAME,cls)# 設(shè)置休眠,同時(shí)檢查元素的存在 WebDriverWait(self.driver,ENUMS.TWENTY_TIME,ENUMS.ONE_HALF).until(EC.presence_of_element_located(clss))# 返回查找控件的數(shù)量 return self.driver.find_elements_by_class_name(cls)# 通過指定下標(biāo)進(jìn)行點(diǎn)擊的 def ClickClasses(self,cls,index):# 進(jìn)行點(diǎn)擊 self.FindClasses(cls)[index].click()# 休眠方式有三種 # 1: 強(qiáng)制休眠 強(qiáng)制休眠,當(dāng)代碼執(zhí)行到該句代碼的時(shí)候,進(jìn)行休眠,當(dāng)休眠結(jié)束執(zhí)行接寫來的代碼 # 2: 隱式休眠 隱式休眠,當(dāng)窗口打開,開始計(jì)算休眠時(shí)間,這里指定的是瀏覽器的總共休眠時(shí)間,如果這里用到1毛,就在總休眠時(shí)間里面減去1秒 # 3: 顯示休眠 顯式休眠,可以設(shè)置指定的休眠時(shí)間,同時(shí)可以設(shè)置每隔幾秒檢查一次元素右沒有加載,如果加載了,休眠時(shí)間就結(jié)束了 # 查詢一組切換窗口的方法 def ClickWindowClsses(self,cls,index):# 獲取當(dāng)前窗口 current = self.driver.current_window_handle# 查詢一組控件,進(jìn)行點(diǎn)擊 self.ClickClasses(cls,index)# 設(shè)置休眠 這里設(shè)置休眠的原因是 1: 有的電腦反應(yīng)慢,點(diǎn)擊完成以后,一會才跳轉(zhuǎn),而我們的代碼執(zhí)行的比較快,所以需要進(jìn)行休眠一會再獲取所有窗口,不然獲取的窗口只有一個(gè) # 2: 我們點(diǎn)擊完成以后,這里一般有邏輯判斷,需要請求網(wǎng)絡(luò)加載數(shù)據(jù)需要時(shí)間,所以需要休眠 # 使用強(qiáng)制休眠 設(shè)置休眠時(shí)間 self.TimeSleep(ENUMS.FIVE_TIME)# 獲取所有的窗口 all_window = self.switch_to_window(current)# 定義一個(gè)枚舉類 class ENUMS(Enum):# 二秒 TWO_TIME = 2 # 五秒 FIVE_TIME = 5 # 10 秒 TEN_TIME = 10 # 20 秒 TWENTY_TIME = 20 # 0.5 秒 ONE_HALF = 0.5 這些封裝只是一些基礎(chǔ),用到其他的自己封裝 我繼續(xù)了:為了方便我又封裝了京東的url urlutil.py #-*-coding:utf-8-*- # 測試環(huán)境分類 3種 # 1: 生產(chǎn)環(huán)境 2: 預(yù)生成環(huán)境 3: 測試環(huán)境 # 1: 生產(chǎn)環(huán)境 : 就是線上環(huán)境,給用戶使用的環(huán)境就叫做生產(chǎn)環(huán)境,一般在這里我們只允許做功能測試,包括手動點(diǎn)擊和跑自動化 # 不允許做性能測試,因?yàn)橛脩粼谑褂?性能測試會占用我們的帶寬,同時(shí)把服務(wù)器搞奔潰,所以堅(jiān)決不允許的,因?yàn)樯a(chǎn)環(huán)境就是企業(yè)的命脈 # 帶寬就是我們的網(wǎng)速 比如 1M 2M 20M 100M # 2: 預(yù)生產(chǎn)環(huán)境: 一般情況下預(yù)生產(chǎn)環(huán)境用來做性能測試使用,用來給生產(chǎn)環(huán)境進(jìn)行調(diào)優(yōu),最后把這些調(diào)優(yōu)的技術(shù)用到生產(chǎn)環(huán)境, # 3: 測試環(huán)境: 就是開發(fā)用來開發(fā)和測試用來測試的,也叫內(nèi)網(wǎng)環(huán)境, # http 請求組成 : 協(xié)議頭: http:// + IP(比如127.0.0.1一般這里被域名替代掉,在生產(chǎn)環(huán)境)+ 端口號(在正式的網(wǎng)絡(luò)環(huán)境里面 # 默認(rèn)端口好是80我們不用去寫他,但是在測試環(huán)境一般需要寫端口號比如 8080 ) + 路徑 # 路徑如果是get就拼接參數(shù),如果是post就在body里面請求參數(shù)就可以了 # 定義類 類關(guān)鍵字 class 函數(shù)關(guān)節(jié)字 def 類實(shí)例化的時(shí)候執(zhí)行的方法 __init__ class URL(object): #類實(shí)例化的時(shí)候執(zhí)行的方法 #這個(gè)就類似于Java里面的構(gòu)造函數(shù) def _init_(self): pass # 定義類變量 # 在類里面聲明的變量叫做類變量,在函數(shù)里面聲明的變量叫做局部變量 # 聲明生產(chǎn)環(huán)境的基本地址 JD_SERVELET="" # # 生命預(yù)生產(chǎn)環(huán)境 # JD_SERVELET = "" # # 聲明測試環(huán)境 # JD_SERVELET = "" # 京東登陸 JD_LOGIN="https://passport.jd.com/uc/login?ltype=logout" # 京東主頁 JD_MAIN = "https://www.jd.com"
我們自己定義單元測試類
比如說我們做的是購物的流程,我定義的就是shop.py
shop.py
到這里差不多就可以運(yùn)行了,賬號密碼用自己的,我就不寫了,shop里面我主要用的是css如果有自己的方法也是可以的僅供參考。
?
總結(jié)
以上是生活随笔為你收集整理的UI自动化+web测试基础3-2,京东流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实习日记——Day12
- 下一篇: lonza原代细胞、培养基目录