关键字驱动框架

ProjVar.py:

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/3 22:55'

import os

#工程路径

proj_path = os.path.dirname(os.path.dirname(__file__))

#测试用例名称

test_file_path = os.path.join(proj_path, "TestData", "测试用例.xlsx")

#测试case的sheet名称

test_case_sheet_name = "测试用例"

#测试用例是否执行所在的列

is_execute_col = 4

#测试步骤sheet中,动作,定位方法,定位表达式和操作值所在的列号

action_col = 2

locate_method_col =3

locate_expression_col = 4

oprate_value_col = 5

log_file_path = os.path.join(proj_path, "Log")

conf_path = os.path.join(proj_path, "Config", "Logger.conf")

ie_driver = "f:\\IEDriverServer"

chrome_driver = "f:\\chromedriver"

firefox_driver = "f:\\geckodriver"

if __name__=="__main__":

    print(proj_path)

    print(test_file_path)

    print(log_file_path)

Test.py:

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/4 23:01'

from Utils.Excel import *

from Config.ProjVar import *

from Utils.Log import *

from Action.WebElementAction import *

successful_case_num = 0

#获取测试用例的excel文件对象

test_file_wb = ParseExcel(test_file_path)

#根据test_case_sheet_name切换到要操作的sheet

test_file_wb.set_sheet_by_name(test_case_sheet_name)

#获取测试用例是否需要执行的列

case_cols = test_file_wb.get_col(is_execute_col)

# print(case_cols)

for row_no, cell in enumerate(case_cols[1:],start=2):#去掉标题行

    #如果是y的话说明需要执行

    if cell.value.strip().lower() =="y":

        #找到测试用例sheet的名称

        test_step_sheet = test_file_wb.get_cell_value(row_no,is_execute_col-1)

        #切换到test_step_sheet

        test_file_wb.set_sheet_by_name(test_step_sheet)

        #遍历测试步骤中所有的行,从2开始,忽略标题行

        for i in range(2,test_file_wb.get_max_row()+1):

            #获取动作

            action = test_file_wb.get_cell_value(i, action_col)

            #获取定位方法

            locate_method = test_file_wb.get_cell_value(i, locate_method_col)

            #获取定位表达式

            locate_expression = test_file_wb.get_cell_value(i, locate_expression_col)

            #获取操作值

            value = test_file_wb.get_cell_value(i, oprate_value_col)

            # print(action, locate_method, locate_expression, value)

            #将动作,定位方法,

            #没有参数

            if action is not None and locate_method is None and locate_expression \

                is None and value is None:

                command = "%s()"%action

            #只有操作值

            elif action is not None and locate_method is None and locate_expression \

                is None and value is not None:

                command = "%s('%s')"%(action,value)

            # 有定位方法和定位表达式

            elif action is not None and locate_method is not None and locate_expression \

                    is not None and value is None:

                command = "%s('%s','%s')" % (action, locate_method, locate_expression)

            # 有定位方法、定位表达式和操作值

            elif action is not None and locate_method is not None and locate_expression \

                    is not None and value is not None:

                command = "%s('%s','%s','%s')" % (action, locate_method, locate_expression, value)

            # print(command)

            #执行拼接好的命令

            try:

                eval(command)

            except Exception as e:

                info("测试用例:%s执行失败,错误信息为:%s"%(action, str(traceback.format_exc())))

                #写入执行时间

                test_file_wb.write_cell_time(i,oprate_value_col+1)

                # 写入执行结果

                test_file_wb.write_cell(i, oprate_value_col + 2, "fail")

                test_file_wb.set_cell_style(i, oprate_value_col + 2, font=Font(color=colors.RED))

                #写入异常信息

                test_file_wb.write_cell(i, oprate_value_col + 3, str(traceback.format_exc()))

            else:

                info("测试用例:%s执行成功" %action)

                # 写入执行时间

                test_file_wb.write_cell_time(i, oprate_value_col + 1)

                # 写入执行结果

                test_file_wb.write_cell(i, oprate_value_col + 2, "pass")

                test_file_wb.set_cell_style(i, oprate_value_col + 2, font=Font(color=colors.GREEN))

                # 写入异常信息

                successful_case_num += 1

        #切换到test_case_sheet_name中,写入整体的测试结果

        result = "pass"

        if successful_case_num != test_file_wb.get_max_row()-1:

            result = "fail"

        test_file_wb.set_sheet_by_name(test_case_sheet_name)

        # 写入执行日期和时间

        test_file_wb.write_cell_datetime(row_no, is_execute_col + 1)

        # 写入测试执行结果

        test_file_wb.write_cell(row_no, is_execute_col + 2, result)

ClipboardUtil.py:

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/4 13:59'

import win32clipboard as w

import win32con

class Clipboard(object):

    '''模拟windows设置和读取剪贴板'''

    @staticmethod

    def setText(content):

        '''设置剪贴板'''

        #打开剪贴板

        w.OpenClipboard()

        #清空剪贴板

        w.EmptyClipboard()

        #设置指定的内容

        w.SetClipboardData(win32con.CF_UNICODETEXT, content)

        #关闭剪贴板

        w.CloseClipboard()

    def getText():

        '''获取剪贴板中指定的内容'''

        #打开剪贴板

        w.OpenClipboard()

        #读取剪贴板中的内容

        content = w.GetClipboardData(win32con.CF_TEXT)

        #关闭剪贴板

        w.CloseClipboard()

        #返回从剪贴板获取的数据

        return content

Dir.py

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/4 11:31'

import time

import os

from Utils.GenTime import *

from Config.ProjVar import *

def make_date_dir(dir_path=log_file_path):

    '''在dir_path下创建日期目录'''

    if os.path.exists(dir_path):

        path = os.path.join(dir_path, get_current_date())

        if not os.path.exists(path):

            os.mkdir(path)

    else:

        raise Exception("make_date_dir创建目录失败!")

def make_time_dir(dir_path=log_file_path):

    '''在dir_path下创建时间目录'''

    if os.path.exists(dir_path):

        path = os.path.join(dir_path, get_current_time())

        if not os.path.exists(path):

            os.mkdir(path)

    else:

        raise Exception("make_time_dir创建目录失败!")

if __name__=="__main__":

    make_date_dir()

    make_time_dir()

Excel.py:

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/3 22:37'

import os

import time

import traceback

from openpyxl import load_workbook

from openpyxl.styles import Font, Border, Side, PatternFill, Alignment, colors

class ParseExcel(object):

    '''excel操作类'''

    def __init__(self,file_path):

        if not os.path.exists(file_path):

            self.wb = None

        self.file_path = file_path

        self.wb = load_workbook(file_path)

        self.sheet = self.wb[self.wb.sheetnames[0]]

    def get_excel_file_path(self):

        '''获取excel文件命名'''

        return self.file_path

    def set_sheet_by_name(self, name):

        '''切换到name指定的sheet'''

        self.sheet = None

        if name in self.wb.sheetnames:

            self.sheet = self.wb[name]

        return self.sheet

    def get_current_sheet_name(self):

        '''获取当前sheet的名称'''

        if self.sheet:

            return self.sheet.title

    def get_min_row(self):

        '''获取最小行号,从1开始'''

        try:

            return self.sheet.min_row

        except:

            traceback.print_exc()

            return None

    def get_max_row(self):

        '''获取最大行号'''

        try:

            return self.sheet.max_row

        except:

            traceback.print_exc()

            return None

    def get_min_col(self):

        '''获取最小列号,从1开始'''

        try:

            return self.sheet.min_column

        except:

            traceback.print_exc()

            return None

    def get_max_col(self):

        '''获取最大列号'''

        try:

            return self.sheet.max_column

        except:

            traceback.print_exc()

            return None

    def get_row(self, row_no):

        '''按索引获取指定的行'''

        if not isinstance(row_no, int):

            return None

        try:

            return list(self.sheet.rows)[row_no - 1]

        except:

            traceback.print_exc()

    def get_col(self, col_no):

        '''按索引获取指定的列'''

        if not isinstance(col_no, int):

            return None

        try:

            return list(self.sheet.columns)[col_no - 1]

        except:

            traceback.print_exc()

    def get_cell_value(self, row_no, col_no):

        '''获取指定单元格的内容'''

        if isinstance(row_no, int) and isinstance(col_no, int):

            try:

                return self.sheet.cell(row=row_no, column=col_no).value

            except:

                traceback.print_exc()

    def write_cell(self, row_no, col_no, value):

        '''设置指定单元格的内容'''

        if isinstance(row_no, int) and isinstance(col_no, int):

            try:

                self.sheet.cell(row=row_no, column=col_no).value = value

                self.save()

            except:

                traceback.print_exc()

    def write_cell_date(self, row_no, col_no):

        '''向指定单元格写入日期字符串'''

        timeTup = time.localtime()

        currentDate = str(timeTup.tm_year)+'年'+str(timeTup.tm_mon)+'月'+ \

                      str(timeTup.tm_mday) + '日'

        self.write_cell(row_no, col_no, currentDate)

    def write_cell_time(self, row_no, col_no):

        '''向指定单元格写入时间字符串'''

        timeTup = time.localtime()

        currentTime = str(timeTup.tm_hour) + "时" + \

                      str(timeTup.tm_min) + "分" + str(timeTup.tm_sec) + "秒"

        self.write_cell(row_no, col_no, currentTime)

    def write_cell_datetime(self, row_no, col_no):

        '''向指定单元格写入日期和时间字符串'''

        timeTup = time.localtime()

        currentDate = str(timeTup.tm_year) + "年" + \

                      str(timeTup.tm_mon) + "月" + str(timeTup.tm_mday) + "日"

        currentTime = str(timeTup.tm_hour) + "时" + \

                      str(timeTup.tm_min) + "分" + str(timeTup.tm_sec) + "秒"

        self.write_cell(row_no, col_no, currentDate+" "+currentTime)

    def merge_cells(self, range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):

        '''合并单元格'''

        try:

            self.sheet.merge_cells(range_string, start_row, start_column, end_row, end_column)

        except:

            traceback.print_exc()

        else:

            self.save()

    def set_cell_style(self, row_no, col_no, border=None, fill=None,

                      font=None, alignment=None):

        '''设定单元格的字体,颜色,边框,大小和边框背景色'''

        try:

            cell = self.sheet.cell(row=row_no, column=col_no)

            if border:

                cell.border = border

            if font:

                cell.font = font

            if fill:

                cell.fill = fill

            if alignment:

                cell.alignment = alignment

        except:

            traceback.print_exc()

        else:

            self.save()

    def save(self):

        '''保存单元格'''

        self.wb.save(self.file_path)

if __name__=="__main__":

    ws = ParseExcel("126邮箱联系人.xlsx")

    print(ws.get_current_sheet_name())

    print(ws.get_excel_file_path())

    print(ws.get_min_row())

    print(ws.get_max_row())

    print(ws.get_min_col())

    print(ws.get_max_col())

    print(ws.get_row(3))

    print(ws.get_col(4))

    ws.write_cell_date(1, 1)

    ws.write_cell_time(1, 2)

    ws.write_cell_datetime(1, 3)

    ws.merge_cells("A1:A3")

    ws.set_cell_style(3, 3, font=Font(color=colors.RED))

GenTime.py:

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/4 11:36'

import time

def get_current_date():

    '''生成日期字符串,格式为xxxx年xx月xx日'''

    timeTup = time.localtime()

    currentDate = str(timeTup.tm_year) + "年" + \

                  str(timeTup.tm_mon) + "月" + str(timeTup.tm_mday) + "日"

    return currentDate

def get_current_time():

    '''生成时间字符串,格式为xx时xx分xx秒'''

    timeTup = time.localtime()

    currentTime = str(timeTup.tm_hour) + "时" + \

                  str(timeTup.tm_min) + "分" + str(timeTup.tm_sec) + "秒"

    return currentTime

def get_current_datetime():

    '''生成日期+日期字符串,格式为xxxx年xx月xx日 xx时xx分xx秒'''

    return get_current_date() + " " + get_current_time()

if __name__ == "__main__":

    print(get_current_date())

    print(get_current_datetime())

    print(get_current_time())

KeyboardUtil.py:

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/4 14:06'

import win32api

import win32con

class Keyboard(object):

    '''模拟键盘操作类'''

    VK_CODE = {

        'enter':0x0D,

        "ctrl": 0x11,

        'a':0x41,

        'v': 0x56,

        'x': 0x58,

        'z': 0x5A,

        'tab': 0x09

    }

    @staticmethod

    def keyDown(keyName):

        '''按下'''

        win32api.keybd_event(Keyboard.VK_CODE[keyName], 0, 0, 0)

    @staticmethod

    def keyUp(keyName):

        '''抬起'''

        win32api.keybd_event(Keyboard.VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0)

    @staticmethod

    def oneKey(keyName):

        '''单个按键的按下和抬起'''

        Keyboard.keyDown(keyName)

        Keyboard.keyUp(keyName)

    @staticmethod

    def twoKey(keyName1, keyName2):

        '''两个按键的按下和抬起'''

        Keyboard.keyDown(keyName1)

        Keyboard.keyDown(keyName2)

        Keyboard.keyUp(keyName2)

        Keyboard.keyUp(keyName1)

WaitUtil.py:

# -*-coding:utf-8 -*-

_author_ = 'kongsh'

__date__ = '2019/3/4 14:47'

import traceback

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.common.exceptions import TimeoutException

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

class WaitUtil(object):

    def __init__(self, driver):

        self.driver = driver

        self.wait = WebDriverWait(self.driver, 10)

        self.locate_method = {

            'id':By.ID,

            'name':By.NAME,

            'xpath':By.XPATH,

            'link_text':By.LINK_TEXT,

            'partial_link_text':By.PARTIAL_LINK_TEXT

        }

    def presenceOfElement(self, locateMethod, locateExpression):

        '''显示等待判断元素是否存在'''

        try:

            return self.wait.until\

                (lambda x:x.find_element(self.locate_method[locateMethod],

                                        locateExpression))

        except TimeoutException:

            traceback.print_exc()

            raise TimeoutException

    def visibleOfElement(self, locateMethod, locateExpression):

        '''显示等待判断元素是否可见'''

        try:

            return self.wait.until\

                (EC.visibility_of_element_located((self.locate_method[locateMethod],

                                        locateExpression)))

        except TimeoutException:

            traceback.print_exc()

            raise TimeoutException

    def clickbleOfElement(self, locateMethod, locateExpression):

        '''显示等待判断元素是否点击'''

        try:

            return self.wait.until\

                (EC.element_to_be_clickable((self.locate_method[locateMethod],

                                        locateExpression)))

        except TimeoutException:

            traceback.print_exc()

            raise TimeoutException

    def switchToFrame(self, locateMethod, locateExpression):

        '''切换到指定的frame'''

        try:

            return self.wait.until\

                (EC.frame_to_be_available_and_switch_to_it((self.locate_method[locateMethod],

                                        locateExpression)))

        except Exception as e:

            traceback.print_exc()

            raise e

    def beSelectedOfElement(self, locateMethod, locateExpression):

        '''显示等待判断元素是否被选中'''

        try:

            return self.wait.until \

                (EC.element_located_to_be_selected((self.locate_method[locateMethod],

                                            locateExpression)))

        except TimeoutException:

            traceback.print_exc()

            raise TimeoutException

if __name__ == "__main__":

    driver = webdriver.Chrome(executable_path="f:\\chromedriver")

    wait_object = WaitUtil(driver)

    driver.get("http://mail.126.com")

    try:

        element = wait_object.switchToFrame("xpath", "//iframe[contains(@id,'x-URS-iframe')]")

        import time

        time.sleep(3)

    except TimeoutException:

        print("元素未定位!")




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,440评论 0 13
  • 最近在准备上岸,备考中需做大量的练习,手机APP让练习无处不在,但有个缺点,就是每次只能练习10-20道题目,不能...
    hrcl2015阅读 11,374评论 0 3
  • ParseExcel类 #encoding=utf-8 import openpyxl from openpyxl...
    公子小白123阅读 576评论 0 0
  • 读书好比串门儿——“隐身”的串门儿。要参见钦佩的老师或拜谒有名的学者,不必事前打招呼求见,也不怕搅扰主人。——杨绛...
    小碗月牙阅读 194评论 0 4
  • 二哥昨天默默的去广东了,我们都没人知道,大嫂今天也要出去,一年到头期盼的热热闹闹的新年就这么淡了,明天也要走了,这...
    煮酒说故事阅读 153评论 0 0