【Selenium05篇】python+selenium實現Web自動化:讀取ini配置文件,元素封裝,程式碼封裝,異常處理,兼容多瀏覽器執行
一、前言
最近問我自動化的人確實有點多,個人突發奇想:想從0開始講解python+selenium實現Web自動化測試,請關注部落格持續更新!
這是python+selenium實現Web自動化第五篇博文
二、Selenium前四篇博文地址:
【Selenium01篇】python+selenium實現Web自動化:搭建環境,Selenium原理,定位元素以及瀏覽器常規操作!
【Selenium02篇】python+selenium實現Web自動化:滑鼠操作和鍵盤操作!
【Selenium03篇】python+selenium實現Web自動化:元素三類等待,多窗口切換,警告框處理,下拉框選擇
【Selenium04篇】python+selenium實現Web自動化:文件上傳,Cookie操作,調用 JavaScript,窗口截圖
三、Selenium之-讀取元素配置文件
經過前面的學習,我們已經可以寫一些簡單的自動化測試用例,但是你們有沒有感覺到我們寫了大量的重複程式碼。例如:頁面中關鍵元素的查找與傳值。對於一個自動化測試頁面來說頁面的元素是相對於比較穩定的,那麼我們就可以把這些重複性的程式碼封裝起來,直接去讀取頁面中相對於穩定的元素就可以了,這些元素資訊我們可以寫在配置文件中,當頁面元素髮生變動時,只需要修改相應的頁面元素資訊即可,不用每次去修改程式碼,從而儘可能的避免引入bug。
1.創建配置文件
讀取配置文件前,按頁面元素的特點寫進配置文件中。
[RegisterElement] register_email = id>register_email register_nickname = id>register_nickname register_password = id>register_password getcode_num = id>getcode_num captcha_code = id>captcha_code
2.讀取配置文件
#!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Time : 2020/4/17 @Author : 公眾號:軟測之家 更多技術乾貨,軟測影片,面試資料請關注! @Contact : 軟體測試技術群:695458161 @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """ import configparser class ReadIni(object): # 初始化配置文件路徑及節點載入 def __init__(self, file_name=None, node=None): if file_name is None: self.file_name = '../data/RegisterElement.ini' if node is None: self.node = 'RegisterElement' else: self.node = node self.cf = self.load_ini() # 載入配置文件 def load_ini(self): cf = configparser.ConfigParser() cf.read(self.file_name) return cf # 獲取各個配置項的值 def get_value(self, key): data = self.cf.get(self.node, key) return data if __name__ == "__main__": ri = ReadIni() print(ri.get_value('register_nickname'))
四、Selenium之-元素封裝
查找頁面元素程式碼封裝。
#!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Time : 2020/4/17 @Author : 公眾號:軟測之家 更多技術乾貨,軟測影片,面試資料請關注! @Contact : 軟體測試技術群:695458161 @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """ from util.read_ini import ReadIni class FindElement(object): def __init__(self, driver): self.driver = driver def get_element(self, key): ri = ReadIni() data = ri.get_value(key=key) by = data.split('>')[0] value = data.split('>')[1] try: if by == 'id': return self.driver.find_element_by_id(value) elif by == 'name': return self.driver.find_element_by_name(value) elif by == 'className': return self.driver.find_element_by_className(value) else: return self.driver.find_element_by_xpath(value) except: file_path = '../image/no_element.png' self.driver.save_screenshot(file_path) if __name__ == "__main__": fe = FindElement() fe.get_element('register_nickname')
五、Selenium之-程式碼封裝
寫到這裡是不是感覺程式碼雖然寫出來了,但是很沒有條理性。是的,現在就把程式碼模組化,讓其每個模組做一部分事情。
#!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Time : 2020/4/17 @Author : 公眾號:軟測之家 更多技術乾貨,軟測影片,面試資料請關注! @Contact : 軟體測試技術群:695458161 @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """ from selenium import webdriver from time import sleep from util.read_ini import ReadIni from basic.find_element import FindElement import random from PIL import Image from api import ShowapiRequest class Register(object): def __init__(self, url): self.driver = self.get_driver(url=url) # 啟動瀏覽器,打開目標測試頁面url def get_driver(self, url): driver = webdriver.Chrome('../tools/chromedriver.exe') driver.get(url=url) driver.maximize_window() return driver # 定位用戶資訊,獲取元素element def get_user_element(self, key): find_element = FindElement(self.driver) user_element = find_element.get_element(key=key) return user_element # 輸入用戶資訊 def send_user_info(self, key, data): self.get_user_element(key=key).send_keys(data) # 獲取隨機數 def get_range(self): number = ''.join(random.sample('abcdefg123456', 8)) return number # 獲取驗證碼圖片 def get_captcha_image(self, file_name): self.driver.save_screenshot(filename=file_name) captcha_element = self.get_user_element('getcode_num') left = captcha_element.location['x'] top = captcha_element.location['y'] right = captcha_element.size['width'] + left height = captcha_element.size['height'] + top image = Image.open(file_name) img = image.crop((left, top, right, height)) img.save(file_name) # 識別圖片驗證碼 def discern_captcha_image(self, file_name): self.get_captcha_image(file_name=file_name) # 解析驗證碼圖片中的文字(用第三方的圖片驗證碼識別介面 ShowApiRequest) r = ShowapiRequest("//route.showapi.com/184-4", "48120", "12c017278c0845c2bcda177212d2d2ac") r.addBodyPara("img_base64", "") r.addBodyPara("typeId", "35") r.addBodyPara("convert_to_jpg", "0") r.addBodyPara("needMorePrecise", "0") r.addFilePara("image", file_name) # 文件上傳時設置 res = r.post() text = res.json()["showapi_res_body"]["Result"] return text # 主函數 def main(self): register_nickname = self.get_range() register_email = self.get_range() + '@163.com' register_password = self.get_range() + '@123' file_name = '../image/code_image.png' captcha_code = self.discern_captcha_image(file_name=file_name) self.send_user_info('register_nickname', register_nickname) self.send_user_info('register_email', register_email) self.send_user_info('register_password', register_password) self.send_user_info('captcha_code', captcha_code) self.get_user_element('register-btn').click() sleep(5) self.driver.close() if __name__ == "__main__": register_url = '//www.5itest.cn/register' r = Register(register_url) r.main()
六、Selenium之-異常處理
測試中我們要讓程式暢通運行的同時,也要注意對程式的異常進行處理。例如:由於調用的第三方介面來是被驗證碼圖片,難免會出現識別不了的情況,為了不阻塞程式的正常運行,當識別出錯的時候,可以對錯誤識別進行異常的處理。
# 在 [RegisterElement.ini] 文件添加驗證碼錯誤的元素id captcha_code_error = id>captcha_code-error
# 在 package.py 程式碼的基礎上加上異常處理 # 異常處理:註冊失敗進行截圖,方便問題排查 captcha_code_error = self.get_user_element('captcha_code_error') if captcha_code_error is None: print("......恭喜你註冊成功了......") else: self.driver.save_screenshot('../image/captcha_code_error.png') sleep(5)
七、Selenium之-兼容多瀏覽器執行
在實際的測試中,由於不同瀏覽器的技術標準的差異,導致同一份程式碼在不同瀏覽器中的表現形式不一致,所以避免不了多瀏覽器執行測試用例。
注意:FireFox 驅動與 Chrome 的驅動配置不同
下載地址://github.com/mozilla/geckodriver/releases
下載後(根據系統版本選擇):
(1)解壓取出geckodriver.exe(以64x為例);
(2)將geckodriver.exe放到Firefox的安裝目錄下,如:(D:\火狐\Mozilla Firefox);
(3)將火狐安裝目錄(D:\火狐\Mozilla Firefox)添加到環境變數path中;
(4)重啟 IDEA,記得一定要
# 兼容多瀏覽器執行測試 def get_more_driver(self, url, browser): if browser == 'chrome': # 版本 76.0.3809.100(64位)對應的驅動 driver = webdriver.Chrome('../tools/chromedriver.exe') elif browser == 'firefox': # FireFox 68.0.2(64位) 對應的驅動,和 chrome 驅動使用有差異 driver = webdriver.Firefox() driver.get(url=url) driver.maximize_window() return driver
八、持續更新中請關注
如果你覺得此文對你有幫助,如果你對軟體測試、介面測試、自動化測試、面試經驗交流感興趣歡迎加入:
軟體測試技術群:695458161,群里發放的免費資料都是筆者十多年測試生涯的精華。還有同行大神一起交流技術哦。
作者:諸葛
出處://www.cnblogs.com/csmashang/p/12719064.html
原創不易,歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接