​Selenium基于Python web自动化测试框架 -- PO​

关于selenium测试框架首先想到的就是PO模型,简单说下PO模型,如果文章内容不太明白的话,可以看这个视频!!

在华为工作了10年的大佬出的Web自动化测试教程,华为现用技术教程!_哔哩哔哩_bilibili在华为工作了10年的大佬出的Web自动化测试教程,华为现用技术教程!共计16条视频,包括:1. 【web自动化】主流Web自动化测试技术对比、2. 【web自动化】Selenium自动化测试环境一键搭建、3. 【web自动化】Selenium八大定位策略详解等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1sM4y1d7tq/?spm_id_from=333.337.search-card.all.click

PO模型的概念和理解:

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

优点:进行了拆分和分层

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

PO模型的目录结构:

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

PO代码示例:

base_page.py

 1 from selenium.webdriver.support.wait import WebDriverWait
 2 
 3 '''
 4 这个类主要是完成所有页面的一些公共方法的封装
 5 '''
 6 class Action(object):
 7     #初始化
 8     def __init__(self,se_driver):
 9         self.driver = se_driver
10 
11     #定义open方法
12     def open(self,url):
13         self.driver.get(url)
14         self.driver.maximize_window()
15 
16     #重写元素定位的方法
17     def find_element(self,*loc):
18         try:
19             WebDriverWait(self.driver,20).until(lambda driver:driver.find_element(*loc).is_displayed())
20             return self.driver.find_element(*loc)
21         except Exception as e:
22             print("未找到%s"%(self,loc))
23 
24     #定义script方法,用于执行js脚本
25     def script(self,src):
26         self.driver.execute_script(src)
27 
28     #重写send_keys方法
29     def send_keys(self,loc,value,clear_first=True,clik_first=True):
30         try:
31             if clik_first:
32                 self.find_element(*loc).click()
33             if clear_first:
34                 self.find_element(*loc).clear()
35                 self.find_element(*loc).send_keys(value)
36         except AttributeError:
37             print("未找到%s"%(self,loc))

 login_page.py

 1 from selenium.webdriver.common.by import By
 2 from seleniumframework.PO import base_page
 3 import time
 4 
 5 class LoginPage(base_page.Action):
 6     link_loc = (By.LINK_TEXT,"登录")
 7     name_loc = (By.ID,"TANGRAM__PSP_8__userName")
 8     password_loc = (By.ID,"TANGRAM__PSP_8__password")
 9     submit_loc = (By.ID,"TANGRAM__PSP_8__submit")
10 
11     username_top = (By.LINK_TEXT,"hanxiaobei")
12 
13 
14     def click_link(self):
15         self.find_element(*self.link_loc).click()
16         time.sleep(3)           #等待3秒,等待登录弹窗加载完成
17 
18     def run_case(self,value1,value2):
19         self.find_element(*self.name_loc).send_keys(value1)
20         self.find_element(*self.password_loc).send_keys(value2)
21         time.sleep(20)          #手动输入验证码
22         self.find_element(*self.submit_loc).click()
23         time.sleep(5)           #等待5秒,登录后的页面加载完成
24 
25     def get_username(self):
26         return self.find_element(*self.username_top).text

test_login.py

 1 import unittest
 2 from selenium import webdriver
 3 from seleniumframework.PO.login_page import LoginPage
 4 import time
 5 
 6 class TestBaiduLogin(unittest.TestCase):
 7     """UI自动化登录"""
 8     def setUp(self):
 9         self.url = "http://www.baidu.com"
10         self.driver = webdriver.Firefox()
11         self.driver.implicitly_wait(20)
12         # self.verificationErrors = []
13 
14     def tearDown(self):
15         time.sleep(5)
16         self.driver.quit()
17         # self.assertEqual([],self.verificationErrors)
18 
19     def test_login(self):
20         """百度登录"""
21         sp = LoginPage(self.driver)
22         sp.open(self.url)
23         sp.click_link()
24         sp.run_case("hanxiaobei","xxxxxxx")
25         self.assertEqual(sp.get_username(),"hanxiaobei",msg="验证失败!")

 main.py 运行的主入口

 1 import unittest
 2 import HTMLTestRunner
 3 
 4 #相对路径
 5 testcase_path = ".\\testcase"
 6 report_path = ".\\report\\report.html"
 7 def creat_suite():
 8     uit = unittest.TestSuite()
 9     discover = unittest.defaultTestLoader.discover(testcase_path,pattern="test_*.py")
10     for test_suite in discover:
11         # print(test_suite)
12         for test_case in test_suite:
13             uit.addTest(test_case)
14     return uit
15 
16 suite = creat_suite()
17 fp = open(report_path,"wb")
18 runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="测试结果",description="测试搜索结果")
19 runner.run(suite)
20 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 

 1 from selenium.webdriver.common.by import By
 2 from seleniumframework.PO import base_page
 3 
 4 #继承base后既可以调用base的方法也可自己添加新的方法
 5 class SearchPage(base_page.Action):
 6 
 7     #通过id进行定位元素
 8     search_loc = (By.ID,"kw")
 9 
10     def run_case(self,value):
11         #第一种利用原生的send_keys方法
12         self.find_element(*self.search_loc).send_keys(value)
13 
14         #第二种利用二次封装的send_keys方法
15         # self.send_keys(self.search_loc,value)

test_search.py

 1 import unittest
 2 from selenium import webdriver
 3 from seleniumframework.PO.search_page import SearchPage
 4 import time
 5 
 6 class TestBaiduSearch(unittest.TestCase):
 7     """UI自动化搜索"""
 8     def setUp(self):
 9         self.url = "http://www.baidu.com"
10         self.driver = webdriver.Firefox()
11         self.driver.implicitly_wait(20)
12         self.verificationErrors = []
13 
14     def tearDown(self):
15         time.sleep(5)
16         self.driver.quit()
17         self.assertEqual([],self.verificationErrors)
18 
19     def test_search(self):
20         """搜索测试关键字"""
21         sp = SearchPage(self.driver)
22         sp.open(self.url)
23         sp.run_case("测试")

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值