前面陆陆续续写了很多文章,有基本的前端知识,有Python文章,有各种元素定位方法,我觉得是时候开始为一个项目编写自动化测试了。
上来就介绍一个较成熟的框架应该会比较难理解。我们从最基本的开始,然后慢慢优化,到最后,形成我们自己的测试框架。这应该是个不错的选择。
好,今天就“从零单排之19杀风暴之灵”,额,从零开始自动化之编写测试用例
自动化测试对象:我们本地部署的web 系统,Redmine
1、我们来写两个用例,第一条是登录,第二条是创建一个项目,代码如下:
from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.implicitly_wait(20) driver.maximize_window() driver.get("http://localhost:81/redmine/login") #第一条用例:用户登录 #输入框先做清除,再输入内容 driver.find_element_by_id('username').clear() driver.find_element_by_id('username').send_keys('admin') driver.find_element_by_id('password').clear() driver.find_element_by_id('password').send_keys('test1234') driver.find_element_by_id('login-submit').click() #如何判断是否登录成功呢?登录成功后右上角有用户名 ele = driver.find_element_by_xpath('//*[@id="loggedas"]/a') if ele.text == 'admin': print('第一条用例执行成功') else: print("第一条用例执行失败") #第二条用例,创建项目 driver.find_element_by_xpath('//*[@id="top-menu"]/ul/li[3]/a').click() #点击左上角“项目” driver.find_element_by_xpath('//*[@id="content"]/div[1]/a').click() #点击新建项目 driver.find_element_by_id('project_name').send_keys('项目1') #输入项目名称 driver.find_element_by_id('project_identifier').send_keys('xm112') #输入项目标识 js1 = "window.scrollTo(0,document.body.scrollHeight)" driver.execute_script(js1) #创建按钮不在当前屏幕内,需要先滑动滚动条 driver.find_element_by_name('commit').click() #点击创建按钮 sleep(2) ele1 = driver.find_element_by_id('flash_notice') if ele1.text == '创建成功': print("第二条用例执行成功") else: print("第二条用例执行失败") driver.quit()运行结果:
第一条用例执行成功
第二条用例执行成功
诶呦,成功,自动化这么简单,来来来,显摆一下,让同事看看
第二次执行:
web页面停留在下图:
pycharm报错:
C:\Python36\python.exe E:/python/test1/first/test0.py
第一条用例执行成功
Traceback (most recent call last):
File "E:/python/test1/first/test0.py", line 32, in <module>
ele1 = driver.find_element_by_id('flash_notice')
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 289, in find_element_by_id
return self.find_element(by=By.ID, value=id_)
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 791, in find_element
'value': value})['value']
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 256, in execute
self.error_handler.check_response(response)
File "C:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"flash_notice"}
(Session info: chrome=61.0.3163.100)
(Driver info: chromedriver=2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41),platform=Windows NT 10.0.14393 x86_64)
Process finished with exit code 1
阿欧,恭喜你装逼失败,redmine 业务逻辑:创建的项目名称可以重复,但是标识不能重复,标识是一个项目的唯一id,所以你再次用同一个标识去创建项目的时候,会创建失败,提示“标识已被占用”。而我们的代码仍然要去找创建成功这个元素,对不起,找不到,所以报错 “no such element: Unable to locate element”
好第一个问题出现:自动化的意义就是重复执行工作,我们写的脚本不能只执行一次吧,怎么办?
两个解决方法:
1、新建项目A,验证创建成功,就将其删除,下次再执行仍然可以新建项目A;
如果不想自动化测试数据显示在项目中,这是个不错的选择;不过劣势也很明显,有的项目是不提供删除功能的,怎么办?(可以删数据库表数据)暂时不讨论这种方法;
2、每次新建项目,名称和标识都用一个唯一值。程序中标识唯一值,常用时间戳;
代码改动如下:
from selenium import webdriver import time from time import sleep driver = webdriver.Chrome() driver.implicitly_wait(20) driver.maximize_window() driver.get("http://localhost:81/redmine/login") #第一条用例:用户登录 #输入框先做清除,再输入内容 driver.find_element_by_id('username').clear() driver.find_element_by_id('username').send_keys('admin') driver.find_element_by_id('password').clear() driver.find_element_by_id('password').send_keys('test1234') driver.find_element_by_id('login-submit').click() #如何判断是否登录成功呢?登录成功后右上角有用户名 ele = driver.find_element_by_xpath('//*[@id="loggedas"]/a') if ele.text == 'admin': print('第一条用例执行成功') else: print("第一条用例执行失败") #第二条用例,创建项目 project_name = time.strftime("%Y%m%d%H%M%S",time.localtime(time.time())) project_id = "bs" + project_name #标识要求以字母开头 driver.find_element_by_xpath('//*[@id="top-menu"]/ul/li[3]/a').click() #点击左上角“项目” driver.find_element_by_xpath('//*[@id="content"]/div[1]/a').click() #点击新建项目 driver.find_element_by_id('project_name').send_keys(project_name) #输入项目名称 driver.find_element_by_id('project_identifier').send_keys(project_id) #输入项目标识 js1 = "window.scrollTo(0,document.body.scrollHeight)" driver.execute_script(js1) #创建按钮不在当前屏幕内,需要先滑动滚动条 driver.find_element_by_name('commit').click() #点击创建按钮 sleep(2) ele1 = driver.find_element_by_id('flash_notice') if ele1.text == '创建成功': print("第二条用例执行成功") else: print("第二条用例执行失败") # //*[@id="errorExplanation"]/ul/li #创建失败 driver.quit()运行结果: