Selenium基于Python web自动化测试框架 —— PO模型

1、前言:

关于selenium测试框架首先想到的就是PO模型,简单说下PO模型

2、PO模型的概念和理解:

PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息、相关操作都放到一个类中,从而使具体的测试用例变成了简单的调用和验证操作。

优点:进行了拆分和分层

缺点:对于复杂的业务page层变了,case也需要去改动

3、PO模型的目录结构:

其中,base_page是login_page、search_page的基础。test_login调用login_page,login_page调用base_page,同理test_search。

4、PO代码示例:

base_page.py


from selenium.webdriver.support.wait import WebDriverWait


'''

这个类主要是完成所有页面的一些公共方法的封装

'''

class Action(object):

#初始化

def __init__(self,se_driver):

self.driver = se_driver


#定义open方法

def open(self,url):

self.driver.get(url)

self.driver.maximize_window()


#重写元素定位的方法

def find_element(self,*loc):

try:

WebDriverWait(self.driver,20).until(lambda driver:driver.find_element(*loc).is_displayed())

return self.driver.find_element(*loc)

except Exception as e:

print("未找到%s"%(self,loc))


#定义script方法,用于执行js脚本

def script(self,src):

self.driver.execute_script(src)


#重写send_keys方法

def send_keys(self,loc,value,clear_first=True,clik_first=True):

try:

if clik_first:

self.find_element(*loc).click()

if clear_first:

self.find_element(*loc).clear()

self.find_element(*loc).send_keys(value)

except AttributeError:

print("未找到%s"%(self,loc))

  login_page.py


from selenium.webdriver.common.by import By

from seleniumframework.PO import base_page

import time


class LoginPage(base_page.Action):

link_loc = (By.LINK_TEXT,"登录")

name_loc = (By.ID,"TANGRAM__PSP_8__userName")

password_loc = (By.ID,"TANGRAM__PSP_8__password")

submit_loc = (By.ID,"TANGRAM__PSP_8__submit")


username_top = (By.LINK_TEXT,"hanxiaobei")



def click_link(self):

self.find_element(*self.link_loc).click()

time.sleep(3) #等待3秒,等待登录弹窗加载完成


def run_case(self,value1,value2):

self.find_element(*self.name_loc).send_keys(value1)

self.find_element(*self.password_loc).send_keys(value2)

time.sleep(20) #手动输入验证码

self.find_element(*self.submit_loc).click()

time.sleep(5) #等待5秒,登录后的页面加载完成


def get_username(self):

return self.find_element(*self.username_top).text

test_login.py


import unittest

from selenium import webdriver

from seleniumframework.PO.login_page import LoginPage

import time


class TestBaiduLogin(unittest.TestCase):

"""UI自动化登录"""

def setUp(self):

self.url = "http://www.baidu.com"

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(20)

# self.verificationErrors = []


def tearDown(self):

time.sleep(5)

self.driver.quit()

# self.assertEqual([],self.verificationErrors)


def test_login(self):

"""百度登录"""

sp = LoginPage(self.driver)

sp.open(self.url)

sp.click_link()

sp.run_case("hanxiaobei","xxxxxxx")

self.assertEqual(sp.get_username(),"hanxiaobei",msg="验证失败!")

main.py 运行的主入口


import unittest

import HTMLTestRunner


#相对路径

testcase_path = ".\\testcase"

report_path = ".\\report\\report.html"

def creat_suite():

uit = unittest.TestSuite()

discover = unittest.defaultTestLoader.discover(testcase_path,pattern="test_*.py")

for test_suite in discover:

# print(test_suite)

for test_case in test_suite:

uit.addTest(test_case)

return uit


suite = creat_suite()

fp = open(report_path,"wb")

runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="测试结果",description="测试搜索结果")

runner.run(suite)

fp.close()

解决报告命名的问题:


1 now = time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))

2 print(now)

3 report_path = ".\\report\\"+now+"report.html"

测试报告截图:

search_page.py


from selenium.webdriver.common.by import By

from seleniumframework.PO import base_page


#继承base后既可以调用base的方法也可自己添加新的方法

class SearchPage(base_page.Action):


#通过id进行定位元素

search_loc = (By.ID,"kw")


def run_case(self,value):

#第一种利用原生的send_keys方法

self.find_element(*self.search_loc).send_keys(value)


#第二种利用二次封装的send_keys方法

# self.send_keys(self.search_loc,value)

test_search.py


import unittest

from selenium import webdriver

from seleniumframework.PO.search_page import SearchPage

import time


class TestBaiduSearch(unittest.TestCase):

"""UI自动化搜索"""

def setUp(self):

self.url = "http://www.baidu.com"

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(20)

self.verificationErrors = []


def tearDown(self):

time.sleep(5)

self.driver.quit()

self.assertEqual([],self.verificationErrors)


def test_search(self):

"""搜索测试关键字"""

sp = SearchPage(self.driver)

sp.open(self.url)

sp.run_case("测试")

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值