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