Python+selenium 【第十三章】自动化分层原理,iweb项目实战
题记:
今天主要跟大家讲述一下自动化分层的原理,讲述一下为什么需要做数据分离
在自动化测试过程中,把测试数据从测试代码中分离出来,可以大大降低维护的成本。
例如:使用代码与测试数据分离,当测试数据发生变化时,只需要修改数据即可,不会对主干代码产生影响。
当前demo就只是简单的搜索一下就已经有这么多行代码了
- demo_baidu_26.py
1 # -*- coding: utf-8 -*- 2 # @Time : 2022/1/6 10:49 3 # @Author : Limusen 4 # @File : demo_baidu_26 5 6 import time 7 from selenium import webdriver 8 9 driver = webdriver.Chrome() 10 11 driver.get("https://www.baidu.com") 12 driver.implicitly_wait(10) 13 driver.find_element_by_id("kw").send_keys("测试一下不分离") 14 driver.find_element_by_id("su").click() 15 16 time.sleep(2) 17 driver.quit()
- 优化 并尝试使用新的方法
1 # -*- coding: utf-8 -*- 2 # @Time : 2022/1/6 10:49 3 # @Author : Limusen 4 # @File : demo_baidu_26 5 6 import time 7 from selenium import webdriver 8 from selenium.webdriver.common.by import By 9 from common.element_excel_utils import ElementExcelUtils 10 11 driver = webdriver.Chrome() 12 13 driver.get("https://www.baidu.com") 14 driver.implicitly_wait(10) 15 # driver.find_element_by_id("kw").send_keys("测试一下不分离") 16 # driver.find_element_by_id("su").click() 17 18 19 "=====================================" 20 21 # 换一种方式 发现这种方法也可行 22 kw = (By.ID, "kw") 23 su = (By.ID, "su") 24 25 driver.find_element(*kw).send_keys("测试一下") 26 driver.find_element(*su).click()
- 使用excel中的数据来测试
# -*- 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 "=====================================" # driver = webdriver.Chrome() # driver.implicitly_wait(10) # driver.get("https://www.baidu.com") # driver.find_element_by_id("kw").send_keys("测试一下不分离") # driver.find_element_by_id("su").click() # time.sleep(2) # driver.quit() "=====================================" # driver = webdriver.Chrome() # driver.implicitly_wait(10) # driver.get("https://www.baidu.com") # # 换一种方式 发现这种方法也可行 # kw = (By.ID, "kw") # su = (By.ID, "su") # # driver.find_element(*kw).send_keys("测试一下") # driver.find_element(*su).click() # time.sleep(2) # driver.quit() "=====================================" # 使用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_page.xls
1.1 新建login_page.xls文件中填写数据如下
2.在element_infos新建login包,包下新建login_page.py
2.1 在login_page.py文件中编写代码
- element_infos/login/login_page.py
1 # -*- coding: utf-8 -*- 2 # @Time : 2022/1/6 10:19 3 # @Author : Limusen 4 # @File : login_page 5 6 7 from selenium import webdriver 8 from common.base_page import BasePage 9 from common.element_excel_utils import ElementExcelUtils 10 11 12 class LoginPage(BasePage): 13 14 def __init__(self, driver): 15 # 继承BasePage的方法,在此类中可以直接调用 16 super().__init__(driver) 17 # 将excel中的数据读取到elements中方便调用 18 elements = ElementExcelUtils('login', 'login_page').get_element_info() 19 self.login_button = elements["login_button"] 20 self.user_name_input = elements["user_name_input"] 21 self.password_input = elements["password_input"] 22 self.switch_login_button = elements["switch_login_button"] 23 24 def login_action(self, name, psw): 25 # 方法一 直接整合 26 self.click(self.login_button) 27 self.input(self.user_name_input, name) 28 self.input(self.password_input, psw) 29 self.click(self.switch_login_button) 30 31 # 方法二 分散写 32 def click_main_login(self): 33 self.click(self.login_button) 34 35 def input_username(self, name): 36 self.input(self.user_name_input, name) 37 38 def input_password(self, pwd): 39 self.input(self.password_input, pwd) 40 41 def click_login(self): 42 self.click(self.switch_login_button) 43 44 45 if __name__ == '__main__': 46 driver = webdriver.Chrome() 47 base = BasePage(driver) 48 login = LoginPage(driver) 49 50 base.open_url("http://shop.aircheng.com/") 51 base.implicitly_wait(10) 52 login.login_action("nswe", "111111")
3.在根目录新建action
4.action下面新建login_action包。新建login.py
- action/login_action/login.py
1 # -*- coding: utf-8 -*- 2 # @Time : 2022/1/6 10:25 3 # @Author : Limusen 4 # @File : login 5 6 from selenium import webdriver 7 from common.base_page import BasePage 8 from element_infos.login.login_page import LoginPage 9 10 11 class Login: 12 13 def __init__(self, driver): 14 self.login = LoginPage(driver) 15 16 def login_action(self, name, psw): 17 # 直接调用login_page中的方法一 18 self.login.login_action(name, psw) 19 return self.login.get_page_source() 20 21 def logins(self, name, psw): 22 # 自己组装login_page中的方法 23 self.login.click_main_login() 24 self.login.input_username(name) 25 self.login.input_password(psw) 26 self.login.click_login() 27 return self.login.get_page_source() 28 29 30 if __name__ == '__main__': 31 driver = webdriver.Chrome() 32 base = BasePage(driver) 33 login = Login(driver) 34 base.open_url("http://shop.aircheng.com/") 35 base.implicitly_wait(10) 36 # login.login_action("nswe", "111111") # 方式一 37 38 login.logins("nswe", "111111") # 方式二
5.在test_case当中编写测试用例
- testcases/login_sutie/test_login.py
# -*- 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()
- 运行脚本
自此脚本元素读取封装完毕。可以实现元素分层,只需要修改测试数据,不用修改测试代码.
ui自动化代码分层其实就是为了让我们更好地编写测试用例,能够复用代码,对原始代码的修改小一点,如果需要修改元素则直接去excel中直接修改,而不是在py文件中查找元素然后再进行修改.
这样做的目的就是为了更好的维护代码.更好的维护测试脚本