前面陆陆续续写了很多文章,有基本的前端知识,有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页面停留在下图:

29、Selenium + Python 实现 UI 自动化测试-正片1

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()
运行结果:

29、Selenium + Python 实现 UI 自动化测试-正片1




相关文章: