python web自动化(关键字驱动与POM)

1.关键字驱动解析

        所谓的关键字驱动,本质就是函数封装的过程。

       ⾃动化当中的封装⽬的是:拆分重复的⾏为代码和测试数据,增加可维护性和复⽤性

                我们想要定义一个工具类        


# 定义工具类(基于基础的方法,进行的关键字封装)
class WebKeys:
    # 这个里面可以封装很多的web自动化的方法

    # 通过构造函数,来接受driver对象
    def __init__(self, driver):  # driver是为了后面再用的时候,传入浏览器的对象
        # 浏览器的初始化
        self.driver = driver

    # 打开项目地址
    def open(self, url):
        self.driver.get(url)

    """
    # 元素定位的方式一:
    driver.find_element(By.ID, "txtUName").send_keys("17798989898")
    
    # 元素定位的方式二:
    driver.find_element("id", "txtUName").send_keys("17798989898")
    
    """

    # 元素定位
    def locator(self, method, value):
        # 引用for循环,去循环判断是否定位元素成功
        # 获取原始的元素之后,再去获取他里面的动态熟悉
        el = self.driver.find_element(method, value)
        # 将定位的元素标记出来
        self.locator_station(el)
        return el

    # 把定位到的元素,标记颜色
    def locator_station(self, el):
        self.driver.execute_script(
            "arguments[0].setAttribute('style',arguments[1]);",
            el,
            "border: 2px solid red;"  # 边框、red红色、green绿色
        )

再之后,我们新建conftest文件,用来运行前置后后置对象

        

""""""
import pytest
from selenium import webdriver


@pytest.fixture
def browser():
    # 01 用例的前置操作
    driver = webdriver.Chrome()

    # 02 用例执行,返回driver
    yield driver

    # 03 用例的后置操作,关闭浏览器
    driver.quit()

然后我们就可以开始写测试用例

        

""""""
import time

"""
    关键字封装之前的测试用例写法
"""

# def test_login01(browser):  # 因为browser现在就是返回的driver对象
#     # 准备测试数据
#     username = "17798989898"
#     password = "123456"
#
#     # 打开项目地址
#     browser.get("http://novel.hctestedu.com/user/login.html")
#
#     # 进行登录操作
#     browser.find_element("id", "txtUName").send_keys(username)  # 输入账号
#     browser.find_element("id", "txtPassword").send_keys(password)  # 输入密码
#     browser.find_element("id", "btnLogin").click()  # 点击登录


"""
    关键字封装之后的测试用例写法
"""

from day9.p01_关键字驱动解析.key_word.key_cncap import WebKeys


def test_login02(browser):  # 因为browser现在就是返回的driver对象
    # 准备测试数据
    username = "17798989898"
    password = "123456"

    # 初始化工具类
    wk = WebKeys(browser)

    # 打开项目地址
    # browser.get("http://novel.hctestedu.com/user/login.html")
    wk.open("http://novel.hctestedu.com/user/login.html")

    # 进行登录操作
    # browser.find_element("id", "txtUName").send_keys(username)  # 输入账号
    # browser.find_element("id", "txtPassword").send_keys(password)  # 输入密码
    # browser.find_element("id", "btnLogin").click()  # 点击登录

    wk.locator("id", "txtUName").send_keys(username)  # 输入账号
    wk.locator("id", "txtPassword").send_keys(password)  # 输入密码
    time.sleep(3)
    wk.locator("id", "btnLogin").click()  # 点击登录

2.数据驱动与数据分离--yaml⽂件驱动

                数据驱动类型⽀持:

                将测试过程中所有测试数据,进⾏提取、保存以及管理,提升框架的可维护性⽀持:                    Excel、Yaml、JSON、Py.....

                yaml数据驱动
                        安装依赖包:pip install pyyaml -i https://mirrors.aliyun.com/pypi/simple/

                yaml⽂件写法: ' - ' 表示 list标签' : ' 表示dict标签

                     准备数据:        

# data.userData.yaml
-
username: 18894687777
passwd: 123456
-
username: 13995245568
passwd: 123456
-
username: 14713374348
passwd: 123456

        读取yaml数据

        

# data_driver.yaml_driver.py
import yaml
def load_yaml(path):
file = open(path, 'r', encoding='utf-8')
data = yaml.load(file, Loader=yaml.FullLoader)
return data

测试yaml⽂件读取

# data_driver.yamlReadTest.py
from data_driver.yaml_driver import load_yaml
content = load_yaml('../data/userData.yaml')
print(content)

动态化测试⽤例的⽣成与断⾔数据的⽣成:

        

""""""
import time

import pytest
from day9.p02_数据驱动与数据分离.data_driver.yaml_driver import load_yaml
from day9.p01_关键字驱动解析.key_word.key_cncap import WebKeys


@pytest.mark.parametrize("data", load_yaml(r"./data/userData.yaml"))
def test_login02(browser, data):  # 因为browser现在就是返回的driver对象
    # 准备测试数据
    print("data: ", data)
    username = data['username']
    password = data['password']

    # 初始化工具类
    wk = WebKeys(browser)

    # 打开项目地址
    wk.open("http://novel.hctestedu.com/user/login.html")

    # 进行登录操作

    wk.locator("id", "txtUName").send_keys(username)  # 输入账号
    wk.locator("id", "txtPassword").send_keys(password)  # 输入密码
    time.sleep(3)
    wk.locator("id", "btnLogin").click()  # 点击登录

 我们在data中放入三三个数据,通过这种方式,我们可以一口气执行将三个账户都执行测试用例

3.POM封装思想解析

含义:POM(Page Object Model)的主要⽬标是将测试代码和⻚⾯对象的实现代码分离,以提⾼测试代码的可维护性和可读性
       PO设计模式具有以下优点:

        PO就是,以每个⽹⻚或者⽹⻚中的组件为单位,进⾏⾃动化代码的维护,可以和关键字驱动结合起来,进⼀步提⾼代码的 可维护性复⽤性

                封装业务流程模块

                        

""""""
import time

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

from day9.p04_POM优化元素定位分离.key_word.key_cncap import WebKeys

"""
    封装登录的方法(因为很多用例都需要登录)
    实际的项目中,这个板块(page模块)是要结合项目的实际情况的
"""


class LoginPage(WebKeys):
    # 登录方法
    def login(self, url, username, password):
        # 打开项目地址
        self.open(url)

        # 进行登录操作
        self.locator("id", "txtUName").send_keys(username)  # 输入账号
        self.locator("id", "txtPassword").send_keys(password)  # 输入密码
        time.sleep(3)
        self.locator("id", "btnLogin").click()  # 点击登录

        # 判断是否登录成功
        wait = WebDriverWait(self.driver, 5)
        # 根据首页是否会出现username作为判断条件
        wait.until(ec.text_to_be_present_in_element(("xpath", '//*[@id="headerUserInfo"]/span/a[1]'), str(username)))

隔离测试数据(VRA)

        

""""""

"""
    把那些全局的变量,都可以写在这里(通过大小写区分是全局的,还是局部的)
"""
LOGIN_URL = "http://novel.hctestedu.com/user/login.html"
HOME_URL = "http://novel.hctestedu.com/?m=2"

4.POM优化:元素定位分离

                问题:⻓流程复杂业务,⻚⾯元素封装界定不清

                ⽅案:将⻚⾯元素抽离出来,集中管理,加编号加前缀,⽅便搜索查找,避免重复

                封装元素定位属性模块(locate):

                

""""""

"""
    元素定位的方法和值
"""

"""
    登录页面的元素
"""
username_el = ["id", "txtUName"]  # 输入账号
password_el = ["id", "txtPassword"]  # 输入密码
login_el = ["id", "btnLogin"]  # 点击登录

"""
    首页的元素
"""
home_login_el = ["xpath", '//*[@id="headerUserInfo"]/span/a[1]']

"""
    作家专区的元素
"""

元素定位属性封装后的登录模块封装示例:

        

""""""
import time

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from day9.p04_POM优化元素定位分离.locate.allPages import *
from day9.p04_POM优化元素定位分离.key_word.key_cncap import WebKeys

"""
    封装登录的方法(因为很多用例都需要登录)
    实际的项目中,这个板块(page模块)是要结合项目的实际情况的
"""


class LoginPage(WebKeys):
    # 登录方法
    def login(self, url, username, password):
        # 打开项目地址
        self.open(url)

        # 进行登录操作
        self.locator(username_el[0], username_el[1]).send_keys(username)  # 输入账号
        self.locator(password_el[0], password_el[1]).send_keys(password)  # 输入密码
        time.sleep(3)
        self.locator(login_el[0], login_el[1]).click()  # 点击登录

        # 判断是否登录成功
        wait = WebDriverWait(self.driver, 5)
        # 根据首页是否会出现username作为判断条件
        wait.until(ec.text_to_be_present_in_element((home_login_el[0], home_login_el[1]), str(username)))

5.知识补充(eval函数的使⽤):

        官⽅解释:将字符串str当做有效的表达式来求值并返回计算结果

        

a = "[[1, 2], [3, 4], [5, 6]]"
# print(type(a))
# print(type(eval(a)))
# print(eval(a))
# print(eval(a)[0])

b = "{'a': 1, 'b': 2}"
print(type(b))
print(type(eval(b)))
print(eval(b))
print(eval(b)['a'])

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值