zoukankan      html  css  js  c++  java
  • 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文件中查找元素然后再进行修改.

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

  • 相关阅读:
    win10环境下 jdk8安装点击下一步没反应解决办法
    selenium 常见鼠标 键盘事件
    selenium 输入框有默认值,用键盘事件解决
    selenium 键盘事件
    selenium 鼠标事件
    sql length
    ecshop Uncaught transport.js/parseResult() error: can't parse to JSON 错误解决
    j2EE基础知识
    mybatis入门知识
    JVM入门
  • 原文地址:https://www.cnblogs.com/yushengaqingzhijiao/p/15770679.html
Copyright © 2011-2022 走看看