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文件中查找元素然后再进行修改.

这样做的目的就是为了更好的维护代码.更好的维护测试脚本

原文地址:https://www.cnblogs.com/yushengaqingzhijiao/p/15770679.html