前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎么用Python初步实现页面对象和测试用例的分离?举个登录的栗子

怎么用Python初步实现页面对象和测试用例的分离?举个登录的栗子

作者头像
清菡
发布2020-12-02 15:06:13
7590
发布2020-12-02 15:06:13
举报
文章被收录于专栏:清菡软件测试

一、代码

来自文件index_page.py

代码语言:javascript
复制
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class IndexPage:

    def __init__(self,driver):
        self.driver=driver

    def isExist_logout_ele(self):
        # 等待10秒 元素有没有出现 //a[@href="/Index/logout.html"]
        #如果存在就返回True,不存在就返回False
        try:
            WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//a[@href="/Index/logout.html"]')))
            return True
        except:
            return False

来自文件login_page.py

代码语言:javascript
复制

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


class LoginPage:

    def __init__(self,driver):
        self.driver=driver

    #登陆
    def login(self,username,passwd,remember_user=True):
        #输入用户名
        #输入密码
        #点击登陆
        name_text='//input[@name="phone"]'
        pwd_text='//input[@name="password"]'
        login_but='//button[text()="登录"]'
        WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,name_text)))
        self.driver.find_element_by_xpath(name_text).send_keys(username)
        self.driver.find_element_by_xpath(pwd_text).send_keys(passwd)
       #判断一下rember_user的值,来决定是否勾选
        self.driver.find_element_by_xpath(login_but).click()

    #注册
    def register_enter(self):
        WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,"")))
        self.driver.find_element_by_xpath("").click()


    #忘记密码

来自文件test_login.py

代码语言:javascript
复制
import  unittest
from selenium import webdriver
from PageObjects.login_page import LoginPage
from PageObjects.index_page import IndexPage



class TestLogin(unittest.TestCase):

    def setUp(self):
        # 前置  访问登陆页面
        self.driver=webdriver.Chrome()
        self.driver.get('http://120.78.128.25:8765/Index/login.html')
        self.lg=LoginPage(self.driver)

    def tearDown(self):
        #后置
        self.driver.quit()

    # 正常用例-登陆成功
    def test_login_success(self):
        #步骤  输入用户名:XXx 密码XXX 点击登陆
        self.lg.login('18684720553','python')
        #断言  首页当中-能否找到  退出  这个元素
        self.assertTrue(IndexPage(self.driver).isExist_logout_ele())



    #
    # #异常用例 -手机号格式不正确  ddt
    # def test_login_user_wrongFormat(self):
    #     self.lg.login('1868472', 'python')
    #     # 步骤  输入用户名:XXx 密码XXX 点击登陆
    #     # 断言  登陆页面 提示:请输入正确的手机号
    #     pass
    #
    # #异常用例 - 用户名为空
    # def test_login_noUser(self):
    #     self.lg.login('', 'python')
    # # 步骤  输入用户名:XXx 密码XXX 点击登陆
    # # 断言  登陆页面 提示:请输入手机号
    #     pass

#异常用例-未注册手机号
#异常用例-错误的密码
#异常用例-不输入密码

运行结果:

二、问题整理

1.不是只能看到窗口内的?

运行代码的时候能看到浏览器窗口外的,自动化打开的窗口,显示的时候并不是全屏的。

有的情况下需要滚动滚动条,有的情况下不需要滚动也可以操作。现在只是判断能不能找得到它,存不存在,并不是判断我要进行点击等各种操作。只是看它存不存在,有没有,可不可见。浏览器自己去操作了,你可能看不到是正常的。

没做点击等各种操作,只是判断有没有而已。

2.核心思想是:页面对象和测试用例的分离。

测试用例中一定要有前置,用例,断言。(页面类的函数调用、测试数据、断言)

测试用例=测试数据+页面方法调用

先写注释,再想想这个注释我该如何实现。

3.一个方法写完代码后加pass和不加pass有区别嘛?

没任何区别。pass就是个占位符。

刚开始写测试用例,没用任何步骤,没任何代码实现,如果不写任何东西是会报错的。就写个pass占个坑,就不会报错了。如果测试用例中的步骤都写了,写不写pass都可以。

self.assertTrue(IndexPage(self.driver).isExist_logout_ele())

不同的断言函数,它的参数是不一样的,这个断言函数只有一个参数。

4.每个断言还要再写成一个函数到相应页面,只要是页面的操作都要写一个函数。但是有的情况下可以不写,大部分情况下都要写的。

当你有几百个用例的时候,断言很多,如果不根据页面封装起来,那后面就抓瞎了。

5.断言结果不需要存在excel里。

web自动化中的断言,每个用例都不一样,不像接口非常固定,不需要准备个断言数据放那,可以自己页面获取数据动态比对。

6.怎么知道通过还是失败?

有测试报告。测试报告会显示通过or失败。

7.在首页当中会有很多的功能点,有的人封装的比较细,有的人封装的比较粗,这个是没有关系的。毕竟这个没有一个统一的标准,大家都是根据自己实际对页面的分析情况做的处理。

以及业务过程中的使用方式。比如这两个功能全部是放一起使用的,那你可以把它封装在一起。如果本身就是分开的,那就把它分开封装。

8.封装功能的时候要记住一个原则:它是一个函数,一个函数不宜太过于复杂,也不宜过于太多。写用例的时候,一个用例也不宜太过于复杂,复杂就意味着稳定性差,中间处理的逻辑非常多。第一个是运行的时间过长,第二个是逻辑运行的过于多,断言也会有很多种。

所以,面临一个测试用例非常复杂的情况下,那你可以把它分成多个。分成多个测试函数,按照步骤一个一个来就好了。

未完待续~


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、代码
  • 二、问题整理
    • 1.不是只能看到窗口内的?
      • 2.核心思想是:页面对象和测试用例的分离。
        • 3.一个方法写完代码后加pass和不加pass有区别嘛?
          • 4.每个断言还要再写成一个函数到相应页面,只要是页面的操作都要写一个函数。但是有的情况下可以不写,大部分情况下都要写的。
            • 5.断言结果不需要存在excel里。
              • 6.怎么知道通过还是失败?
                • 7.在首页当中会有很多的功能点,有的人封装的比较细,有的人封装的比较粗,这个是没有关系的。毕竟这个没有一个统一的标准,大家都是根据自己实际对页面的分析情况做的处理。
                  • 8.封装功能的时候要记住一个原则:它是一个函数,一个函数不宜太过于复杂,也不宜过于太多。写用例的时候,一个用例也不宜太过于复杂,复杂就意味着稳定性差,中间处理的逻辑非常多。第一个是运行的时间过长,第二个是逻辑运行的过于多,断言也会有很多种。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档