1:先看看整個項目結構web
2:commom(公共類封裝)api
2.1 路徑處理封裝dom
import os base_path=os.path.dirname(os.path.dirname(__file__)) #日誌路徑 logger_path=os.path.join(base_path,"out_put_log","System_of_Docter.log") #測試域名選擇路徑 switch_path=os.path.join(base_path,"config","url_config","switch.cfg") #線上域名路徑 online_path=os.path.join(base_path,"config","url_config","online.cfg") #測試域名路徑 test_path=os.path.join(base_path,"config","url_config","test.cfg")
2.2 配置文件讀取封裝測試
from configparser import ConfigParser from common.all_of_path import switch_path class Config: def __init__(self,file_path): self.conf=ConfigParser() self.conf.read(filenames=file_path,encoding="utf-8") def get_boolen_value(self,section,option): return self.conf.getboolean(section,option) def get_string_value(self,section,option): return self.conf.get(section,option) if __name__ == '__main__': c=Config(switch_path) print(c.get_boolen_value("switch","switch"))
2.3 日誌處理封裝url
import logging from common.all_of_path import logger_path class Logger: def __init__(self,name="System_of_Docter"): self.logger = logging.getLogger(name) self.logger.setLevel(logging.DEBUG) #添加文件日誌和控制檯日誌 self.filehandler=logging.FileHandler(filename=logger_path,mode="w+",encoding="utf-8") self.consolehandler=logging.StreamHandler() #爲文件日誌和控制檯日誌添加日誌級別 self.filehandler.setLevel("INFO") self.consolehandler.setLevel("DEBUG") #文件日誌處理器和控制檯日誌處理器添加日誌輸出格式 formatt = logging.Formatter("%(asctime)s____%(name)s___%(levelname)s___%(message)s")#___[%(filename)s:%(lineno)d] self.filehandler.setFormatter(formatt) self.consolehandler.setFormatter(formatt) self.logger.addHandler(self.filehandler) self.logger.addHandler(self.consolehandler) self.filehandler.close() self.consolehandler.close() def get_logger(self): return self.logger def remove_handle(self): self.logger.removeHandler(self.consolehandler) self.logger.removeHandler(self.filehandler) if __name__ == '__main__': l=Logger() t=l.get_logger() t.info("我是info1信息") t.info("我是info2信息") # t.exception("超時異常") # l.remove_handle()
2.4 basepage(重用元素操做封裝)spa
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from common.logger import Logger from selenium.webdriver.support.select import Select import win32clipboard as w import win32con import win32api import time import os from PIL import Image import math import operator from functools import reduce from test_data.add_new_patient_data.clinical_setings_photo.get_screenshot_path import ele_screenshot_path logger=Logger().get_logger() class BasePage: def __init__(self,driver): self.driver=driver def wait_presence_element(self,loc,timeout=30,frequency=1): """等待元素被加載到dom樹並不必定可見""" logger.info("正在準備等待元素{}被加載到dom樹中".format(loc)) try: WebDriverWait(self.driver,timeout,frequency).until(EC.presence_of_element_located(loc)) logger.info("{}元素被成功加載到dom樹".format(loc)) except: logger.exception("{}元素不存在dom樹中") def wait_element_visible(self,loc,timeout=30,frequency=1): """等待元素可見""" logger.info("正在準備等待{}元素可見".format(loc)) try: WebDriverWait(self.driver,timeout,frequency).until(EC.visibility_of_element_located(loc)) logger.info("{}元素可見成功".format(loc)) except: logger.exception("等待{}元素可見失敗".format(loc)) def find_element(self,loc): logger.info("正在準備查找{}元素".format(loc)) try: web_object=self.driver.find_element(*loc) logger.info("{}元素查找成功".format(loc)) return web_object except: logger.exception("{}元素查找失敗") def find_elements_back_length(self,loc): logger.info("正在準備查找一些{}元素".format(loc)) try: ele_list=self.driver.find_elements(*loc) logger.info("一些{}元素查找成功".format(loc)) return len(ele_list) except: logger.exception("一些{}元素查找失敗".format()) def find_elements(self,loc,index): logger.info("正在準備查找一些{}元素".format(loc)) try: web_eles=self.driver.find_elements(*loc) logger.info("一些{}元素查找成功".format(loc)) return web_eles[index] except: logger.exception("一些{}元素查找失敗".format(loc)) def find_elements_back_all(self,loc): logger.info("正在準備查找一些{}元素".format(loc)) try: web_eles=self.driver.find_elements(*loc) logger.info("一些{}元素查找成功".format(loc)) return web_eles except: logger.exception("一些{}元素查找失敗".format(loc)) def clear_text(self,loc): logger.info("正在準備清除{}元素輸入框內容".format(loc)) try: self.find_element(loc).clear() logger.info("{}元素輸入框內容清除成功".format(loc)) except: logger.exception("{}元素輸入框內容清除失敗".format(loc)) def send_value(self,loc,value): logger.info("正在準備在{}元素輸入框輸入內容".format(loc,value)) try: self.find_element(loc).send_keys(value) logger.info("{}元素輸入框輸入{}內容成功".format(loc,value)) except: logger.exception("{}元素輸入框輸入{}內容失敗".format(loc,value)) def click_element(self,loc): logger.info("正在準備點擊{}元素".format(loc)) try: self.find_element(loc).click() logger.info("{}元素點擊成功".format(loc)) except: logger.exception("{}元素點擊失敗".format(loc)) def click_element_by_ele(self, ele): logger.info("正在準備點擊{}對象".format(ele)) try: ele.click() logger.info("{}對象點擊成功".format(ele)) except: logger.exception("{}對象點擊失敗".format(ele)) def click_elements(self,loc,index): logger.info("正在準備點擊{}元素下標爲{}的元素".format(loc,index)) try: self.find_elements(loc,index).click() logger.info("{}元素下標爲{}的元素點擊成功".format(loc,index)) except: logger.exception("{}元素下標爲{}元素點擊失敗".format(loc,index)) def get_element_text(self,loc): logger.info("正在準備獲取{}元素的文本值".format(loc)) try: text_value=self.find_element(loc).text logger.info("獲取{}元素文本值成功".format(loc)) return text_value except: logger.exception("獲取{}元素文本值失敗".format(loc)) def is_selected(self,loc): logger.info("正在準備判斷{}元素是否可被選中".format(loc)) try: is_selected_value=self.find_element(loc).is_selected() if is_selected_value: logger.info("{}元素已經被選中".format(loc)) return is_selected_value else: logger.info("{}元素沒有被選中".format(loc)) return is_selected_value except: logger.exception("判斷{}元素是否被選中失敗".format(loc)) def is_selected_by_ele(self, ele): logger.info("正在準備判斷{}對象是否可被選中".format(ele)) try: is_selected_value = ele.is_selected() if is_selected_value: logger.info("{}對象已經被選中".format(ele)) return is_selected_value else: logger.info("{}對象沒有被選中".format(ele)) return is_selected_value except: logger.exception("判斷{}對象是否被選中失敗".format(ele)) def scroll_mouse(self,loc): logger.info("正在準備滾動屏幕到目標元素{}".format(loc)) try: self.driver.execute_script("arguments[0].scrollIntoView();",self.find_element(loc)) logger.info("滾動到目標元素{}成功".format(loc)) except: logger.exception("滾動到目標元素{}失敗".format(loc)) def select_down_element(self,loc,select_value): logger.info("正在準備選中下拉列表的value值爲{}的元素".format(select_value)) try: select=Select(self.find_element(loc)) select.select_by_value(select_value) logger.info("下拉列表value值爲{}的元素被選中".format(select_value)) return select.first_selected_option.text except: logger.exception("下拉列表value值爲{}的元素選中失敗".format()) return select.first_selected_option.text def cutting(self,file_path): logger.info("正在準備剪切本地路徑爲:{}的圖片".format(file_path)) try: w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_UNICODETEXT,file_path) w.CloseClipboard() time.sleep(2) logger.info("剪切本地路徑{}圖片成功".format(file_path)) except: logger.exception("本地路徑爲:{}的圖片上傳失敗".format(file_path)) def upload_image(self): logger.info("正在準備打開圖片") try: VK_CODE = { "ctrl": 0x11, "v": 0x56, "enter": 0x0D, } win32api.keybd_event(VK_CODE["ctrl"],0,0,0) win32api.keybd_event(VK_CODE["v"], 0, 0, 0) win32api.keybd_event(VK_CODE["ctrl"], 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(VK_CODE["v"], 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(VK_CODE["enter"], 0, 0, 0) win32api.keybd_event(VK_CODE["enter"], 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(2) logger.info("圖片打開成功") except: logger.exception("圖片打開失敗") def alter_is_present(self,timeout=30,frequency=1): logger.info("正在準備判斷alter是否出現") try: WebDriverWait(self.driver,timeout,frequency).until(EC.alert_is_present()) logger.info("alter 彈框已經出現") except: logger.exception("alter 彈框沒有出現") def deal_alter(self,value="1"):#driver.switch_to.alert.accept() logger.info("正在準備處理alter彈框") try: if value=="1": text=self.driver.switch_to.alert.text self.driver.switch_to.alert.accept() logger.info("alter接受成功") return text else: self.driver.switch_to.alert.dismiss() logger.info("alter 取消接收") except: logger.exception("alter彈框處理失敗") def refresh(self): logger.info("正在準備刷新頁面") try: self.driver.refresh() logger.info("頁面刷新成功") except: logger.exception("頁面刷新失敗") def get_ele_sreenshot(self,loc,file_path,filename): logger.info("正在準備對{}元素對象進行截屏操做") try: self.find_element(loc).screenshot(os.path.join(file_path,filename)) logger.info("{}元素對象截屏成功,並命名爲{}".format(loc,filename)) except: logger.exception("{}元素對象截屏失敗".format(loc)) def get_ele_sreenshot_by_ele(self,ele,file_path,filename): logger.info("正在準備對{}元素對象進行截屏操做") try: ele.screenshot(os.path.join(file_path,filename)) logger.info("{}元素對象截屏成功,並命名爲{}".format(ele,filename)) except: logger.exception("{}元素對象截屏失敗".format(ele)) def query_photo(self,filename_one,filename_other): logger.info("正在準備判斷這張圖片{}和這張圖片{}是否同樣".format(filename_one,filename_other)) try: image1=Image.open(os.path.join(ele_screenshot_path,filename_one)) image2=Image.open(os.path.join(ele_screenshot_path,filename_other)) histogram1=image1.histogram() histogram2=image2.histogram() result= math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2,histogram1, histogram2)))/len(histogram1)) if result ==0.0: logger.info("兩張圖片同樣") return True else: logger.info("兩張圖片不同") return False except: logger.exception("判斷兩張圖片是否同樣失敗")