接上篇文章~
一、注意做大型项目的时候,用例是非常多的,所以.py文件的名字一定要根据模块来命名,否则就分不清了。
根据功能的复杂与简单,来决定要不要分成2个页面,例如1个页面只是个显示的功能,没有别的东西了,那就没有必要浪费时间再去整一个。如果初学者分不清,就按着自己的看法来。
一个测试用例=多个页面的多个功能串起来
调用多个页面类=同一个浏览器会话上面,串行执行完成的
立即学习“Python免费学习笔记(深入)”;
用例中没必要一定要写个assert,它就是个非常明显的断言。
实际上,我们可以用其它的方式来代替它。
PO模式的目的就是把页面的元素定位和元素操作跟测试用例分开。
分离彻底的目的就是各自维护各自的,各不相干。不至于元素定位一发生变化,就在测试用例中到处去找。
例如这种错误的方式:
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;"> def test_login_success(self): #步骤 输入用户名:XXx 密码XXX 点击登陆 self.lg.login('18684720553','python') #断言 首页当中-能否找到 退出 这个元素 #等待10秒 元素有没有出现 //a[@href="/Index/logout.html"] WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[@href="/Index/logout.html"]')))
有些用例中的断言肯定是不止一条的,可能涉及的元素定位有1个以上。每一个测试用例都有元素的断言,也就意味着每条用例中都可能有元素定位方式。
如果某一个元素的定位方式发生变化,你能保证200个定位中没有重复的这种元素定位吗?
能保证某一个元素发生了变化,测试用例不需要同步修改吗?
所以这种做法是不可取的,后期维护的时候工作量非常的大。
做项目,写框架要看整体项目层面的,不能现在写的爽,以后苦。
从登陆页跳转过来,没有那么快出现,所以加上10秒时间缓冲。
步骤是一样的,断言的方式都是一样的,只是参数不一样而已,那你就可以用ddt。
二、代码来自文件index_page.py
Flash ActionScript3 高级教程 pdf,书籍部分目录: 第一章 高级 碰撞检测 不规则图形的检测碰撞 BitmapData.hitTest用于非位图 大量对象的碰撞检测 实现基于网格的碰撞检测 编写网格代码 测试并调整网格 使用此类 检测不只是为了碰撞 第二章 转向 行为 2D向量(Vector2D)类 机车(Vehicle)类 转向机车(SteeredVehicle)类 寻找行为 避开行为 到达行为
0
<pre class="brush:php;toolbar:false;">from selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byclass 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代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byclass 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() #获取错误提示信息-登录区域 def get_errorMsg_from_loginArea(self): WebDriverWait(self.driver,20).until(EC.visibility_of_all_elements_located((By.XPATH,'//div[@class="form-error-info"]'))) return self.driver.find_element_by_xpath('//div[@class="form-error-info"]').text #忘记密码来自文件test_login.py
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">import unittestfrom selenium import webdriverfrom PageObjects.login_page import LoginPagefrom PageObjects.index_page import IndexPagefrom TestDatas import Common_Datas as CDfrom TestDatas import login_datas as LDimport ddt@ddt.ddtclass TestLogin(unittest.TestCase): # def setUpClass(cls): # #通过excel读取本功能当中需要的所有测试数据 # pass def setUp(self): # 前置 访问登陆页面 self.driver=webdriver.Chrome() self.driver.get(CD.web_login_url) self.lg=LoginPage(self.driver) def tearDown(self): #后置 self.driver.quit() # 正常用例-登陆成功 def test_login_success(self): #步骤 输入用户名:XXx 密码XXX 点击登陆 self.lg.login(LD.success_data["user"],LD.success_data["passwd"]) #断言 首页当中-能否找到 退出 这个元素 self.assertTrue(IndexPage(self.driver).isExist_logout_ele()) # #异常用例 -手机号格式不正确(大于11位、小于11位、为空、不在号码段) ddt\ @ddt.data(*LD.phone_data) def test_login_user_wrongFormat(self,data): # 步骤 输入用户名:XXx 密码XXX 点击登陆 self.lg.login(data["user"],data["passwd"]) # 断言 登陆页面 提示:请输入正确的手机号 #登录页面中 -获取提示框的文本内容 #比对文本内容与期望的值是否相等 self.assertEqual(self.lg.get_errorMsg_from_loginArea(),data["check"]) # def test_login_wrongData # #异常用例 - 用户名为空 # def test_login_noUser(self): # self.lg.login('', 'python') # # 步骤 输入用户名:XXx 密码XXX 点击登陆 # # 断言 登陆页面 提示:请输入手机号 # pass#异常用例-未注册手机号#异常用例-错误的密码#异常用例-不输入密码来自文件Common_Datas.py
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">#全局-系统访问地址-登录链接web_login_url="http://120.78.128.25:8765/Index/login.html"
来自文件login_datas.py
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">#正常场景-测试数据success_data={"user":"18684720553","passwd":"python"}#异常用例-手机号格式不正确(大于11位、小于11位、为空、不在号码段)phone_data=[{"user":"18684720","passwd":"python","check":"请输入正确的手机号"},{"user":"18684720553123","passwd":"python","check":"请输入正确的手机号"},{"user":"","passwd":"python","check":"请输入手机号"},{"user":"11684720553","passwd":"python","check":"请输入正确的手机号"}]#异常用例# layui-layer-content 此账号没有经过授权,请联系管理员! //div[@class="layui-layer-content"]文件结构目录如图:

1.像这样的测试用例,运行一次是不够的,在实际工作过程中调试这样的用例,连续运行3-5次不会出错,都是在我的预期当中,那就ok,暂时可以放下去写别的测试用例了。
如果运行3-5次运行不成功,那就先把它调试成功,再去做其它的测试用例。
要求稳定性。 这种用例需要在很多地方都要调试的。不同的电脑运行起来的效果不同,可能本机是成功的,但是放到别的电脑上就挂了。这是Web自动化比较常见的现象。
考验系统的稳定性,有时候系统的性能不好、网速比较慢或者系统有bug等等,很多环境因素会影响结果。所以要想办法提升自己代码的健壮性。
所以元素之前该写等待的地方还是要等。主要提高自己代码的稳定性。
测试用例=测试对象调用+测试数据
2.同一套代码在Mac和Windows上运行有差异吗?
跨平台,如果都是谷歌浏览器,本质上都是一样的,但是电脑的环境不一样可能会导致某些地方运行失败。大部分东西都是一样的,不需要去改,只要先去运行一下,有没有失败的,失败的原因是什么,分析下原因就行了。
跨平台:Linux、Mac、Windows都支持。驱动程序换下就好了,其它都一样。
3.怎么定位界面这个3秒就闪过的提示呢?


实在搞不定,就去抱开发哥哥大腿,哈哈。
未完待续~
以上就是20行代码,用Python实现异常测试用例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号