行为驱动behave结合PO设计模式

  用PO的思想去重构或者管理行为驱动测试能使测试更有效率。

   以携程网登录场景为例,项目中体现PO思想的是page目录下的两个文件分别为“base.py”和“loginPage.py”。            

   其中“base.py”文件代码抽取了一些基本的方法,如元素定位的方法;打开网站方法和得到当前网页标题等方法。其代码如下:

#学习有疑问请联系作者
#作者qq:2574674466
#作者邮箱2574674466@qq.com
#coding=utf-8
from selenium.webdriver.common.by import By
class Base:
    def __init__(self,driver):
        self.driver = driver

     #*loc 函数参数是指传入的是不定参数,这个知识点在前面章节已经提到过
     #意思是findele函数可以传入1个参数,也可以传入2个参数等等。
    def findele(self,*loc):
        return  self.driver.find_element(*loc)

    def get_url(self,url):
        self.driver.get(url)

    def get_title(self):
        return self.driver.title
  • page目录下的另外一个文件loginPage.py其目的是为了封装登录页面的操作,将这些操作以类成员方法的形式展现。注意类“loginPage”的构造函数的实现逻辑,具体内容已在以下的代码注释中写明
#学习有疑问请联系作者
#作者qq:2574674466
#作者邮箱2574674466@qq.com
#coding=utf-8
from features.com.page.base import  Base
from selenium.webdriver.common.by import  By
#loginPage继承了Base类
class loginPage(Base):
    #以下为类的初始化函数,其又调用了父类的初始化函数,这样做的目的是为了
    #将context.driver串起来,在调用PO类时,可以使用超级全局变量context下的driver对象
    def __init__(self,context):
        super(loginPage,self).__init__(context.driver)
    def login(self,username):
        self.findele(By.ID,"nloginname").send_keys(username)
  • 项目主目录下有文件environment.py,其主要目的是对行为驱动环境进行配置,可以被全局调用。其代码如下:
#学习有疑问请联系作者
#作者qq:2574674466
#作者邮箱2574674466@qq.com
#coding=utf-8
from selenium import  webdriver

def before_all(context):
    context.driver = webdriver.Chrome("chromedriver路径")

def after_tag(contex):
    context.driver.quit()

项目主目录下有文件example.feature,其定义了行为驱动要执行的场景描述细节

Feature: Login
  Scenario:open website
     When I open the login website "https://passport.ctrip.com/user/login?"
     Then I input username "tim"

在目录steps下有文件example.py,其定义了行为驱动场景的实现过程,注意代码中涉及到了正则表达式的使用,具体见如下代码细节

#coding=utf-8
from behave import *
from features.com.page.loginPage import loginPage

#以下re表示在step中定义正则表达式,要使用正则表达式
use_step_matcher('re')

#这里表示开始抓取正则表达式的匹配值,此次是为了抓取在场景文件example.feature中的url值,
#抓取到之后传值给url,然后进行下面的操作
@when('I open the login website "([^"]*)"')
def step_reg(context,url):
    loginPage(context).get_url(url)
@Then('I input username "([^"]*)"')
def step_r(context,code):
    loginPage(context).login(code)
  • 执行测试,测试结构如图12.8所示:

视频、学习笔记联系qq:2574674466
更多内容请关注公众号:“大牛测试

 

欢迎加入交流群:Selenium学习群: 628908894
原文地址:https://www.cnblogs.com/tim2016/p/15386313.html