前文说要
这里是清安,本章讲述如何将上一章的脚本改写为框架,当然,框架有优质框架也有劣质框架,本章我们讲述比较通俗易懂,且基本上都在使用的一种。对于新手也是比较的友好。
本章只是改进脚本,如需继续深入学习可以联系博主,或下方留言。这一讲只是框架的一小部分,存在很多完善的地方,但仍有要学习的地方。V:qing_an_an。内设微信群聊,比较卷,想学习的都可以联系博主。
如果你看完本篇,觉得合适,可以,那么请留言或添加好友告知我,看情况而定,如果人数多就带着各位写一遍POM思想的框架全过程!
学习本篇之前,需要了解如下两篇文章:
selenium系列–手把手写测试脚本_清欢无别事-CSDN博客
开学了同学们快来–selenium之unittest框架–浅显易懂_清欢无别事-CSDN博客
正文说要
我们先将unittest的大体部分写出来。
# -->>>清安<<<---
import unittest
class Logintest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("开始执行")
@classmethod
def tearDownClass(cls) -> None:
print("执行完毕")
def test_login(self):
print("执行中")
if __name__ == '__main__':
unittest.main()
接下来我们执行一遍看看效果:
============================= test session starts =============================
collecting ... collected 1 item
un_login.py::Logintest::test_login 开始执行
PASSED [100%]执行中
执行完毕
POM
到这里,大体的框架就是这样,但是又想了想,如果就这样,把昨天的内容搬进来岂不是显的有些多余了。那我们就结合POM思想。那么什么是POM思想呢。
Page Object Model (POM) 直译为“页面对象模型”,将那些繁琐的定位操作封装到这个页面
为什么要用POM?
少数的自动化测试用例维护起来看起来是很容易的。但随着时间的迁移,测试套件将持续的增长。
脚本也将变得越来越臃肿庞大。如果变成我们需要维护10个页面,100个页面,甚至1000个呢?
而且页面元素很多是公用的。那页面元素的任何改变都会让我们的脚本维护变得繁琐复杂,而且
变得耗时易出错。
有哪些好处?
让UI自动化更早介入项目中,可项目开发完再进行元素定位的适配与调试
POM 将页面元素定位和业务操作流程分开,分离了测试对象和测试脚本.
可多人共同维护开发脚本,利于团队协作
如何设计
POM可以使代码看起来更整洁,那么我们先另外创建一个py文件。这里面主要放一些方法之类的东西,比如:定位、输入内容,点击等
# -->>>清安<<<---
from time import sleep
from selenium import webdriver
def supdriver():
driver = webdriver.Firefox()
driver.maximize_window()
return driver
class Login_f:
def __init__(self):
self.driver = supdriver()
def get_url(self, url):
self.driver.get(url)
def get_click(self, ele, tager):
self.driver.find_element(ele, tager).click()
sleep(1)
def get_send_keys(self, ele, tager, value):
self.driver.find_element(ele, tager).send_keys(value)
sleep(1)
def eles_text(self, ele, tager, number):
eles = self.driver.find_elements(ele, tager)[number]
sleep(1)
return eles
def ele_text(self, ele, tager):
ele = self.driver.find_element(ele, tager).text
return ele
方法暂时性就写这么几个,因为在本章还算够用,能解决当前的一些问题。自己练习也可以加一些显示等待鼠标操作等方法进来。
温馨提示:这的url其实可以优化的,放在文本中去,本章暂时不讲。其次就是等待时间,我们可以写显示等待来写,这里自己可以尝试优化一下。不会就下方留言吧。
好了,这个py文件就到这里了,我们进入写用例环节:#测试一下#
# -->>>清安<<<---
import unittest
from index.web_fun import Login_f
from selenium.webdriver.common.by import By
class Logintest(unittest.TestCase):
logf = Login_f()
@classmethod
def setUpClass(cls) -> None:
cls.logf.driver.get('http://39.98.138.157/shopxo/public/index.php?s=/index/user/logininfo.html')
cls.logf.driver.implicitly_wait(10)
print("开始执行")
@classmethod
def tearDownClass(cls) -> None:
cls.logf.driver.quit()
print("执行完毕")
def test_login(self):
print("执行中")
self.logf.get_click(By.XPATH,'/html/body/div[4]/div/div[2]/div[1]/a')
if __name__ == '__main__':
unittest.main()
这里我用了实例化的方式来写,各位也可以用其他的方法来来写,比如说继承的方法。不做限制,只要你有想法,不会的可以私信我来一起交流交流。
简单的测试就到这里了,接下来我们把脚本的用例写完,上述代码有不明白的可以去看看之前的unittest文。
注意:这里加了显示等待,有可能出现页面加载需要很长的时间,为什么呢?因为网址的服务器响应慢了,然后我们加上全局隐士等待,等待页面 元素加载,如果网络不好可能等到花都要谢掉。
好了,我们看看用例的源码:
# -->>>清安<<<---
import unittest
from index.web_fun import Login_f
from selenium.webdriver.common.by import By
class Logintest(unittest.TestCase):
logf = Login_f()
@classmethod
def setUpClass(cls) -> None:
cls.logf.driver.get('http://39.98.138.157/shopxo/public/index.php?s=/index/user/logininfo.html')
# cls.logf.driver.implicitly_wait(10)
print("开始执行")
@classmethod
def tearDownClass(cls) -> None:
cls.logf.driver.quit()
print("执行完毕")
def test_login_01(self):
print("执行中")
# self.logf.get_url('http://39.98.138.157/shopxo/public/index.php?s=/index/user/logininfo.html')
self.logf.get_click(By.XPATH, '/html/body/div[4]/div/div[2]/div[1]/a')
self.logf.get_click(By.XPATH, '//label[contains(text(),"用户名")]')
self.logf.get_send_keys(By.NAME, 'accounts', 'qingan')
self.logf.get_send_keys(By.NAME, 'pwd', 'qingan')
self.logf.get_click(By.CLASS_NAME, 'am-icon-checked')
self.logf.eles_text(By.XPATH, '//button[contains(text(),"注册")]', 0).click()
ele = self.logf.ele_text(By.XPATH, '//*[@id="common-prompt"]/p')
self.assertEqual(ele,'账号已存在')
if ele == '账号已存在':
print('账号已存在')
self.logf.get_click(By.XPATH,'/html/body/div[4]/div/div/div/div[1]/a')
self.logf.get_send_keys(By.NAME,'accounts','qinganan')
self.logf.get_send_keys(By.NAME,'pwd','qingan')
self.logf.get_click(By.XPATH,'/html/body/div[4]/div/div[2]/div[2]/form/div[3]/button')
else:
self.logf.get_click(By.CLASS_NAME, 'am-icon-checked')
self.logf.get_send_keys(By.NAME, 'accounts', 'qinganan')
self.logf.get_send_keys(By.NAME, 'pwd', 'qingan')
self.logf.get_click(By.CLASS_NAME,'am-icon-checked')
self.logf.eles_text(By.XPATH,'//button[contains(text(),"注册")',0).click()
if __name__ == '__main__':
unittest.main()
解析点一:看了源码用例是不是发现也不过如此,这里需要说明的是这是一条用例,你发现代码量跟脚本没啥区别,但是你要是写多条用例呢。脚本很多东西你需要重复写,这里你只需要调用。
解析点二:这里呢只用到了部分的POM,这里面是有很多需要完善的地方的。比如说断言,我这写了一个断言,我们可以用显示等待来写,就不用每次都写断言了,也不用写什么if else了。
解析点三:这里的账号我们是可以提取出来的用数据驱动就可以,再往后定位也是可以提取出来的,也就是关键字驱动了。
解析点四:参照前面写的unittest文章,这里的执行用例我们可以写的更加的明确点。
本篇就到这里,欢迎留言交流。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36382.html