Python+selenium 【第十一章】自动化分层原理-iweb项目实战

题记

今天主要跟大家讲述一下自动化分层的原理,讲述一下为什么需要做数据分离

在自动化测试过程中,把测试数据从测试代码中分离出来,可以大大降低维护脚本的成本。

例如:使用代码与测试数据分离,当测试数据发生变化时,只需要修改数据即可,不会对主干代码产生影响。

示例代码

# -*- coding: utf-8 -*-
# @Time : 2022/1/6 10:49
# @Author : Limusen
# @File : demo_baidu_26

import time
from selenium import webdriver

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys("测试一下不分离")
driver.find_element_by_id("su").click()

time.sleep(2)
driver.quit()

优化代码

这种方式实际上就是将单个元素封装成一个属性,然后通过调用属性来试下数据分离,但是一个页面上有很多元素,都写在一个类里面就会显得代码很臃肿,所以我们采用封装成三层来进行元素读取和调用

# -*- coding: utf-8 -*-
# @Time : 2022/1/6 10:49
# @Author : Limusen
# @File : demo_baidu_26

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from common.element_excel_utils import ElementExcelUtils

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
# driver.find_element_by_id("kw").send_keys("测试一下不分离")
# driver.find_element_by_id("su").click()


"====================================="

# 换一种方式 发现这种方法也可行
kw = (By.ID, "kw")
su = (By.ID, "su")

# 这种呢 是采用解包的方式实现的与元素分离,将单个元素封装并调用
driver.find_element(*kw).send_keys("测试一下")
driver.find_element(*su).click()

采用excel中的数据

现在发现我们只需要调用我们之前封装好的底层base_page再去调用我们要操作的,比如click()
只需要传入元素对象即可,不用写太多繁琐的代码

# -*- coding: utf-8 -*-
# @Time : 2022/1/6 10:49
# @Author : Limusen
# @File : demo_baidu_26

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from common.element_excel_utils import ElementExcelUtils
from common.base_page import BasePage


# 使用excel中的数据做成关键字进行脚本

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")

# 假设我们使用excel里面的数据
element = ElementExcelUtils("baidu", "baidu_page").get_element_info()

kw = element["input_kw"]
su = element["click_su"]
base = BasePage(driver)
base.input(kw, "测试一下")
base.click(su)

"====================================="

小结

  • 在我们没有将元素分离之前我们是这样
1 driver.find_element_by_id("kw").send_keys("测试一下不分离")
2 driver.find_element_by_id("su").click()
  • 封装好之后的代码是这样的
1 # 假设我们使用excel里面的数据
2 element = ElementExcelUtils("baidu", "baidu_page").get_element_info()
3 
4 kw = element["input_kw"]
5 su = element["click_su"]

封装元素类

接下来进行数据优化,分层实现读取数据

1.新建login数据

  • 新建一个login_page.xls
  • 新建login_page.xls文件中填写数据如下
    在这里插入图片描述

2.元素基类编写

  • 在element_infos新建login包,包下新建login_page.py
    在这里插入图片描述

  • 在login_page.py文件中编写代码

  • 文件 element_infos/login/login_page.py

# -*- coding: utf-8 -*-
# @Time : 2022/1/6 10:19
# @Author : Limusen
# @File : login_page


from selenium import webdriver
from common.base_page import BasePage
from common.element_excel_utils import ElementExcelUtils


class LoginPage(BasePage):

    def __init__(self, driver):
        # 继承BasePage的方法,在此类中可以直接调用
        super().__init__(driver)
        # 将excel中的数据读取到elements中方便调用
        elements = ElementExcelUtils('login', 'login_page').get_element_info()
        self.login_button = elements["login_button"]
        self.user_name_input = elements["user_name_input"]
        self.password_input = elements["password_input"]
        self.switch_login_button = elements["switch_login_button"]

    def login_action(self, name, psw):
        # 方法一 直接整合
        self.click(self.login_button)
        self.input(self.user_name_input, name)
        self.input(self.password_input, psw)
        self.click(self.switch_login_button)

    # 方法二 分散写
    def click_main_login(self):
        self.click(self.login_button)

    def input_username(self, name):
        self.input(self.user_name_input, name)

    def input_password(self, pwd):
        self.input(self.password_input, pwd)

    def click_login(self):
        self.click(self.switch_login_button)


if __name__ == '__main__':
    driver = webdriver.Chrome()
    base = BasePage(driver)
    login = LoginPage(driver)

    base.open_url("http://shop.aircheng.com/")
    base.implicitly_wait(10)
    login.login_action("nswe", "111111")

3.元素操作组装类

  • 在根目录新建action
  • action下面新建login_action包。新建login.py

在这里插入图片描述

  • action/login_action/login.py
# -*- coding: utf-8 -*-
# @Time : 2022/1/6 10:25
# @Author : Limusen
# @File : login

from selenium import webdriver
from common.base_page import BasePage
from element_infos.login.login_page import LoginPage


class Login:

    def __init__(self, driver):
        self.login = LoginPage(driver)

    def login_action(self, name, psw):
        # 直接调用login_page中的方法一
        self.login.login_action(name, psw)
        return self.login.get_page_source()

    def logins(self, name, psw):
        # 自己组装login_page中的方法
        self.login.click_main_login()
        self.login.input_username(name)
        self.login.input_password(psw)
        self.login.click_login()
        return self.login.get_page_source()


if __name__ == '__main__':
    driver = webdriver.Chrome()
    base = BasePage(driver)
    login = Login(driver)
    base.open_url("http://shop.aircheng.com/")
    base.implicitly_wait(10)
    # login.login_action("nswe", "111111") # 方式一

    login.logins("nswe", "111111")  # 方式二

4.编写测试用例类

  • 5.在test_case当中编写测试用例
# -*- coding: utf-8 -*-
# @Time : 2022/1/6 10:33
# @Author : Limusen
# @File : test_login


import unittest
from action.login_action.login import Login
from common.base_page import BasePage
from common.browser_utils import BrowserUtils
from common.config_utils import local_config


class TestLogin(unittest.TestCase):

    def setUp(self) -> None:
        driver = BrowserUtils().get_driver()
        self.base = BasePage(driver)
        self.login = Login(driver)
        self.base.open_url(local_config.get_host)
        self.base.implicitly_wait(10)
        self.base.set_window_max()

    def test_login_success(self):
        result = self.login.logins("nswe", "111111")
        # 检查nswe是否包含在源码当中 如果有则通过测试
        self.assertIn("nswe", result, "测试通过")


if __name__ == '__main__':
    unittest.main()

5.运行脚本

  • 运行脚本
    在这里插入图片描述

自此脚本元素读取封装完毕。可以实现元素分层,只需要修改测试数据,不用修改测试代码.

总结

本章主要讲述的是如何将元素分离,首先我们需要创建一个读取excel数据当中的类,取出数据进行操作组装,也就是我们最基础的 element_infos/login/login_page.py ,然后通过action组装我们页面上的操作,比如登录操作,需要我先去点击登录然后再输入账号、密码操作,进行大操作的封装,最后我们通过测试用例去继承我们的action类,进行测试用用例编写。从而达到页面元素分离并实现关键字框架的实用

ui自动化代码分层其实就是为了让我们更好地编写测试用例,能够复用代码,对原始代码的修改小一点,这样做的目的就是为了更好的维护代码.更好的维护测试脚本

代码

地址 : https://gitee.com/todayisgoodday/PythonSelenium

博客园地址

https://www.cnblogs.com/yushengaqingzhijiao/category/2000515.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罐装七喜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值