Python Web自动化测试学习-PO模型在自动化测试中的应用(1)

页面封装
用例生成
简单PO模型-项目结构

config-配置文件
data-测试数据
download-下载的数据
drivers-驱动文件
HTML-测试用的页面
log-日志文件
report-测试报告
test-测试文件
common-公共方法
pages-每个页面一个page class
case-测试用例
runner-对测试用例进行组织
utils-存放一些方法
HTMLTestRunner-测试报告使用
readConfig-读取配置文件

公共方法篇

config
base_data.json

{
  "base_url": "http://localhost:21248/#/",
  "email": "admin@tynam.com",
  "password": "tynam123"
}

utils
readConfig.py
对配置文件读取进行封装

# -*-coding:utf-8-*-
import json
class ReadConfig(object):
    """
    读取配置文件,Excel、json等文件的读取方法都可写在次类下
    """
    def __init__(self):
        pass
    def read_json(self, json_file):
        """读取json文件"""
        try:
            with open(json_file) as f:
                data = json.load(f)
                return data
        except:
            print("文件不存在或不是json文件")
if __name__ == '__main__':
    data = ReadConfig().read_json("../config/base_data.json")
    print(data)
    print(data['base_url'], data['email'], data['password'])

输出结果
在这里插入图片描述
test
common
elementIsExist.py
判断元素是否存在

# -*-coding:utf-8-*-
class ElementIsExist(object):
    def __init__(self, driver):
        self.driver = driver

    def is_exist(self, element):
        flag = True
        try:
            self.driver.find_element_by_css_selector(element)
            return flag
        except:
            flag = False
            return flag

test
common
tabOperation.py
tab切换

# -*-coding:utf-8-*-
from time import sleep
from test.common.elementIsExist import ElementIsExist
class TableOperation(object):
    """Tab操作"""
    def __init__(self, driver):
        self.driver = driver
    def get_all_tab(self):
        """获取所有的tab"""
        sleep(1)
        # 获取所有的tab父元素
        # 元素定位,我们默认取css定位
        fathers_tabs = [['.tabs1', 'a2'], ['.tabs', 'a'], ]
        # 获取页面显示父节点下的所有tab
        for father_tab in fathers_tabs:
            # 使用is_exist()方法判断父节点是否存在,如果父节点不存在,则查找的tab不匹配
            father_exist = ElementIsExist(self.driver).is_exist(father_tab[0])
            # 父节点存在,则进行操作
            if father_exist:
                father = self.driver.find_element_by_css_selector(father_tab[0])
                tabs = father.find_elements_by_css_selector(father_tab[1])
                return tabs
    def switch_tab(self, tab_text):
        """
        切换tab
        :param tab_text: 需要切换到的tab内容
        :return:
        """
        tabs = self.get_all_tab()
        for tab in tabs:
            if tab.text == tab_text:
                tab.click()
                return
"""
测试代码
if __name__ == '__main__':
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('http://localhost:63342/AutoTestExample-Heyb-Project/HTML/tab/index.html')
    sleep(2)
    tab = TabOperation(driver)
    tab.switch_tab('Tab2')
    sleep(2)
    tab.switch_tab('Tab3')
    sleep(3)
    driver.quit()
"""

test
common
multiMenuOperation.py
多级菜单

# -*-coding:utf-8-*-
from time import sleep
from test.common.elementIsExist import ElementIsExist
class MultiMenuOperation(object):
    """多级菜单操作"""
    def __init__(self, driver):
        self.driver = driver
    def get_all_menu(self):
        """获取所有菜单"""
        driver = self.driver
        sleep(1)
        # 获取所有的tab父元素
        fathers_menus = [['#nav', '#nav>ul>li>a', '#nav>ul>li ul>li>a'],
                         ['#nav1', 'a', 'div'],
                         ]
        # 获取页面显示父元素下的所有菜单
        menu_level = []
        for father_menu in fathers_menus:
            # 使用is_exist方法确定一级菜单的父元素在页面中出现
            father_exist = ElementIsExist(driver).is_exist(father_menu[0])
            if father_exist:
                # 将第一级菜单添加到list中的第一个元素
                if ElementIsExist(driver).is_exist(father_menu[1]):
                    menu_level_1 = driver.find_elements_by_css_selector(father_menu[1])
                    menu_level.append(menu_level_1)
                    # 将第二级菜单添加到list中的第二个元素
                    if ElementIsExist(driver).is_exist(father_menu[2]):
                        menu_level_2 = driver.find_elements_by_css_selector(father_menu[2])
                        menu_level.append(menu_level_2)
                        return menu_level
                    return menu_level
    def select_menu(self, menu_text=[]):
        """
        选择菜单
        :param menu_text: 必须是list
        :return:
        """
        menu_levels = self.get_all_menu()
        i = 0
        for menus in menu_levels:
            for menu in menus:
                if menu.text == menu_text[i]:
                    sleep(1)
                    menu.click()
                    i += 1
                    break
"""
测试代码
if __name__ == '__main__':
    from selenium import webdriver

    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('http://localhost:63342/AutoTestExample-Heyb-Project/HTML/multiMenu/index.html')
    sleep(1)
    menu = MultiMenuOperation(driver)
    menu.select_menu(["链接", "必应"])
    sleep(3)
    driver.quit()
"""

test
common
tableOperation.py
表格结构

# -*-coding:utf-8-*-
from time import sleep
from test.common.elementIsExist import ElementIsExist
class TableOperation(object):
    """表格操作"""
    def __init__(self, driver):
        self.driver = driver
    def get_table(self):
        """获取table
            返回table的headers、body_rows和body_rows_column
        """
        sleep(1)
        # 列表顺序:table、header、body_rows和body_rows_column
        tables_header_body = [['table #dataArea>table',
                               'table #dataArea>table>.header>td',
                               "table #dataArea>table>tr:not(.header)",
                               "table #dataArea>table>tr:not(.header)>td"],
                              ]
        # 获取画面显示的table
        for table_header_body in tables_header_body:
            # 如果找到的父节点为空,则父节点不存在,则查找的table不匹配,页面中不存在
            if ElementIsExist(self.driver).is_exist(table_header_body[0]):
                table = self.driver.find_element_by_css_selector(table_header_body[0])
                headers = table.find_elements_by_css_selector(table_header_body[1])
                body_rows = table.find_elements_by_css_selector(table_header_body[2])
                rows = []
                for body_row in body_rows:
                    body_row_column = body_row.find_elements_by_css_selector(table_header_body[3])
                    rows.append(body_row_column)
                return headers, rows
            else:
                print("table定位失败")
    def select_row(self, header_text, row_text):
        """
        根据header中的列获取对应的body中的行
        :param header_text: header中列内容
        :param row_text: leader列对应的body列内容
        :return: 返回body中的行
        """
        headers, rows = self.get_table()
        # 获取传入的header的index
        idx = int()
        for header in headers:
            if header.text == header_text:
                idx = headers.index(header)
        # 通过index在body中寻找相应的index的内容
        for row in rows:
            if row[idx].text == row_text:
                return row
    def row_click(self, header_text, row_text):
        """选择表格中行并且单击"""
        row = self.select_row(header_text, row_text)
        # 返回的row是一个list,driver不能进行单击操作,所以需要给具体的值
        # 如果返回的row中有button,可以给出button的index实现row中button单击
        return row[0].click()

test
common
pagingOperation.py
分页

# -*-coding:utf-8-*-
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep
class PagingOperation(object):
    """Tab操作"""
    def __init__(self, driver):
        self.driver = driver
        # 对分页中每个操作元素进行定位
        # 分页
        self.paging = self.driver.find_element(By.CLASS_NAME, 'pagination')
        # 首页
        self.first = self.driver.find_element(By.CLASS_NAME, 'first')
        # 上一页
        self.previous = self.driver.find_element(By.CLASS_NAME, 'previous')
        # 下一页
        self.next = self.driver.find_element(By.CLASS_NAME, 'next')
        # 末页
        self.last = self.driver.find_element(By.CLASS_NAME, 'last')
        # 输入页数
        self.input = self.driver.find_element(By.CSS_SELECTOR, 'input')
    def paging_operation(self, text=None):
        """分页操作"""
        sleep(1)
        if text == "首页" or text == "第一页":
            return self.first.click()
        elif text == "上一页":
            return self.previous.click()
        elif text == "下一页":
            return self.next.click()
        elif text == "末页" or text == "最后一页":
            return self.last.click()
        elif type(text) == int:
            self.input.click()
            self.input.send_keys(text)
            self.input.send_keys(Keys.ENTER)
        else:
            error = "只接受首页、第一页、上一页、下一页、末页、最后一页和整型数字"
            print(error)
            return
"""
测试代码
if __name__ == '__main__':
    from selenium import webdriver

    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('http://localhost:63342/AutoTestExample-Heyb-Project/HTML/paging/index.html')
    sleep(3)
    paging = PagingOperation(driver)
    paging.paging_operation(5)
    paging.paging_operation("上一页")
    paging.paging_operation("下一页")
    paging.paging_operation("首页")
    paging.paging_operation("末页")
    sleep(3)
    driver.quit()
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值