zoukankan      html  css  js  c++  java
  • PO设计模式-实现移动端自动化测试

    开发环境:python 3.6.5 + selenium 2.48.0 + pytest框架 + Android 5.1

    工具:pycharm + Appium + Genymotion

    测试机型:Samsung Galaxy S6

    #需求:设计3个测试用例
    #1.实现点击设置->显示->放大镜(查找)->输入内容->点击返回按钮
    #2.实现点击设置->更多->移动网络->首选网络类型->2G
    #3.实现点击设置->更多->移动网络->首选网络类型->3G

    以下是PO模式设计文件目录

    加入我们,群,642830685,领取最新软件测试资料大厂面试和Python自动化、接口、框架搭建学习资料!

    实现设计模式前:

    ```

    import time
    from appium import webdriver
    
    
    class TestSetting:
    
        def setup(self):
            # server 启动参数
            desired_caps = {}
            # 设备信息
            desired_caps['platformName'] = 'Android'
            desired_caps['platformVersion'] = '5.1'
            desired_caps['deviceName'] = '192.168.56.101:5555'
            # app的信息
            desired_caps['appPackage'] = 'com.android.settings'
            desired_caps['appActivity'] = '.Settings'
            # 解决输入中文
            desired_caps['unicodeKeyboard'] = True
            desired_caps['resetKeyboard'] = True
    
            # 声明我们的driver对象
            self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
        def test_mobile_network_2g(self):
            self.driver.find_element_by_xpath("//*[contains(@text,'更多')]").click()
            self.driver.find_element_by_xpath("//*[contains(@text,'移动网络')]").click()
            self.driver.find_element_by_xpath("//*[contains(@text,'首选网络类型')]").click()
            self.driver.find_element_by_xpath("//*[contains(@text,'2G')]").click()
    
        def test_mobile_network_3g(self):
            self.driver.find_element_by_xpath("//*[contains(@text,'更多')]").click()
            self.driver.find_element_by_xpath("//*[contains(@text,'移动网络')]").click()
            self.driver.find_element_by_xpath("//*[contains(@text,'首选网络类型')]").click()
            self.driver.find_element_by_xpath("//*[contains(@text,'3G')]").click()
    
        def test_mobile_display_input(self):
            self.driver.find_element_by_xpath("//*[contains(@text,'显示')]").click()
            self.driver.find_element_by_id("com.android.settings:id/search").click()
            self.driver.find_element_by_id("android:id/search_src_text").send_keys("hello")
            self.driver.find_element_by_class_name("android.widget.ImageButton").click()
    
        def teardown(self):
            self.driver.quit()
    ···
    
    

    实现设计模式后:

    
    

    公共部分抽取在base文件夹

    
    

    抽取前置配置:

    
    

    base_driver.py

    ```

    from appium import webdriver
    
    def Testbase():
        # server 启动参数
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '5.1'
        desired_caps['deviceName'] = '192.168.56.101:5555'
        desired_caps['appPackage'] = 'com.android.settings'
        desired_caps['appActivity'] = '.Settings'
        desired_caps['unicodeKeyboard'] = True
        desired_caps['resetKeyboard'] = True
        # 解决输入中文问题
        desired_caps['unicodeKeyboard'] = True
        desired_caps['resetKeyboard'] = True
    
        # 声明driver对象
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        return driver
    ```

    抽取公共方法:

    base_action.py

    ```

    from selenium.webdriver.support.wait import WebDriverWait
    
    
    class BaseAction:
        def __init__(self, driver):
            self.driver = driver
        # 显示等待
        def find_elements(self, loc, time=10, poll=1):
            return WebDriverWait(self.driver, time, poll).until(lambda x: x.find_element(loc[0], loc[1]))
    
        # 定义一个函数,取按钮的元素
        def act_click(self,loc):
            return self.act_title(loc).click()
        # 定义一个函数,取输入框的元素
        def act_text(self,loc,text):
            return self.act_title(loc).send_keys(text)
        def act_title(self, loc):
            by = loc[0]
            value = loc[1]
            return self.driver.find_element(by, value)
    ```

    页面主体部分:

    page

    测试用例1:

    display_page.py

    ```
    from base.base_action import BaseAction
    from selenium.webdriver.common.by import By
    
    class DisplayPage(BaseAction):
        # 初始化方法
        # 显示按钮
        see_button = By.XPATH, "//*[contains(@text,'显示')]"
        # 放大镜按钮
        search_button = By.ID, "com.android.settings:id/search"
        # 放大镜旁边的输入文本
        search_edit_text = By.ID, "android:id/search_src_text"
        # 返回按钮
        back_button = By.CLASS_NAME, "android.widget.ImageButton"
        #
        # # 定义一个函数,取按钮的元素
        # def act_click(self,loc):
        #     return self.driver.find_element(loc[0],loc[1]).click()
        # # 定义一个函数,取输入框的元素
        # def act_text(self,loc,text):
        #     return self.driver.find_element(loc[0],loc[1]).send_keys(text)
    
        # def __init__(self, driver):
        #     self.driver = driver
    
    
        # 点击显示
        def click_see(self):
            # self.driver.find_element_by_xpath("//*[contains(@text,'显示')]").click()
            # self.driver.find_element(self.see_button).click()
            self.act_click(self.see_button)
    
        # 点击放大镜
        def click_search(self):
            # self.driver.find_element_by_id("com.android.settings:id/search").click()
            # self.driver.find_element(self.search_button).click()
            self.act_click(self.search_button)
    
    
        # 输入文本
        def input_text(self, text):
            # self.driver.find_element_by_id("android:id/search_src_text").send_keys(text)
            # self.driver.find_element(self.search_edit_text).send_keys(text)
            self.act_text(self.search_edit_text,text)
    
        # 点击返回
        def click_back(self):
            # self.driver.find_element_by_class_name("android.widget.ImageButton").click()
            # self.driver.find_element(self.back_button).click()
            self.act_click(self.back_button)
    ```
    
    

    测试用例2/3:

    network_page.py

    from selenium.webdriver.common.by import By
    from base.base_action import BaseAction
    
    class NetworkPage(BaseAction):
    
    # 抽离元素
        # 更多按钮
        more_button = By.XPATH, "//*[contains(@text,'更多')]"
        # 网络移动按钮
        network_button = By.XPATH, "//*[contains(@text,'移动网络')]"
        #首选网络类型按钮
        first_network_button = By.XPATH, "//*[contains(@text,'首选网络类型')]"
        # 2G选择按钮
        button_2g = By.XPATH, "//*[contains(@text,'2G')]"
        # 3G选择按钮
        button_3g = By.XPATH, "//*[contains(@text,'3G')]"
    
    # 代码精简方式,提取公共元素
        def click_more(self):
            # self.driver.find_element_by_xpath("//*[contains(@text,'更多')]").click()
            # self.driver.find_element(By.XPATH, "//*[contains(@text,'更多')]").click()
            self.act_click(self.more_button)
    
    
        def click_network(self):
            # self.driver.find_element_by_xpath("//*[contains(@text,'移动网络')]").click()
            # self.driver.find_element(By.XPATH, "//*[contains(@text,'移动网络')]").click()
            self.act_click(self.network_button)
    
    
        def click_first_network(self):
            # self.driver.find_element_by_xpath("//*[contains(@text,'首选网络类型')]").click()
            # self.driver.find_element(By.XPATH, "//*[contains(@text,'首选网络类型')]").click()
            self.act_click(self.first_network_button)
    
        def mobile_network_2g(self):
            # self.driver.find_element_by_xpath("//*[contains(@text,'2G')]").click()
            # self.driver.find_element(By.XPATH, "//*[contains(@text,'2G')]").click()
            self.act_click(self.button_2g)
    
    
        def mobile_network_3g(self):
            # self.driver.find_element_by_xpath("//*[contains(@text,'3G')]").click()
            # self.driver.find_element(By.XPATH, "//*[contains(@text,'2G')]").click()
            self.act_click(self.button_3g)

    测试用例1的脚本:

    test_display.py

    # 获取本地地址
    import sys, os
    sys.path.append(os.getcwd())
    
    from base.base_driver import Testbase
    from page.display_page import DisplayPage
    
    class TestDisplay:
        def setup(self):
            self.driver = Testbase()
            self.display_page = DisplayPage(self.driver)
    
        def test_mobile_display_input(self):
            # 点击显示
            self.display_page.click_see()
            # 点击放大镜
            self.display_page.click_search()
            # 文本输入
            self.display_page.input_text("hello")
            # 点击返回
            self.display_page.click_back()
    
        def teardown(self):
            self.driver.quit()
    
    

    测试用例2/3的脚本:

    
    

    test_network.py

    import os, sys
    sys.path.append(os.getcwd())
    from page.network_page import NetworkPage
    from base.base_driver import Testbase
    
    class TestNetwork:
        def setup(self):
            self.driver = Testbase()
            self.network_page = NetworkPage(self.driver)
            self.network_page.click_more()
            self.network_page.click_network()
            self.network_page.click_first_network()
    
        def test_mobile_network_2g(self):
    
            self.network_page.mobile_network_2g()
    
        def test_mobile_network_3g(self):
            # self.network_page.click_more()
            # self.network_page.click_network()
            # self.network_page.click_first_network()
            self.network_page.mobile_network_3g()
    
        def teardown(self):
            self.driver.quit()
    
    

    pytest框架的执行文件:

    
    

    pytest.ini

    
    

    注意:因为文件为ini格式,#不被识别为注释标识,请删掉注释部分

    
    
    [pytest]
    #文件路径,和生成报告
    addopts = -s --html=./report/report.html
    testpaths = ./scripts
    #执行的文件名
    python_files = test_*.py
    #执行文件里面的类
    python_classes = Test*
    #执行类中的那些方法
    python_functions = test_*

    如果您觉得对您有帮助,请点赞,收藏,分享三连!您的支持是笔者最大的动力!

    加入我们,群,642830685,领取最新软件测试资料大厂面试和Python自动化、接口、框架搭建学习资料!

     
     
  • 相关阅读:
    使用asp.net调用谷歌地图api
    JAVASCRIPT+DHTML实现表格拖动
    strcpy & memcpy区别
    python解析邮件的时候编码问题
    snprintf不能使用"字符串指针"赋值,可以使用字符数组
    二级结构体的赋值和访问方法
    C lstat major MAJOR 获得设备号
    C解析config
    C语言中的DEBUG
    opencv实例二:缩放一张图片
  • 原文地址:https://www.cnblogs.com/www642830685/p/13279210.html
Copyright © 2011-2022 走看看