最近在学自动化测试,加粗样式为了检测自己学的知识,整理一下,这几天的学习内容。
我在这里也就不介绍自动化测试是来干嘛的了,大神很多,说的也很详细,我也是经常来学习……
废话不多说了,直接开始主题了。
第一步 配置环境 干啥都要环境,我搭的很简单的环境
需要的环境我就一起说了,省的再后面又要提起。
webdriver 浏览器驱动 专为自动化测试。
对应自己浏览器版本下载,我这里给个某站某大佬给的链接
各个浏览器驱动下载地址
下完之后。把webdriver.exe 放在 自己电脑浏览器的Application下,这里附一下我自己的驱动。 谷歌的默认安装路径基本上都在这
C:\Users\Administrator\AppData\Local\Google\Chrome\Application
然后再把这个路径添加到系统环境变量。 这样你就可以在pycharm中不需要写webdriver的启动位置了。
(另外说一个提醒吧,也是个人经历,毕竟是小白—— win10的webdriver在配置完环境之后在pycharm运行也会运行不了, 它也会提醒是selenium下的一个service中的start方法有错误,这个解决方法很简单修改源代码
将C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\selenium\webdriver\common\service.py里的start方法下的代码
self.process = subprocess.Popen(cmd, env=self.env,
close_fds=platform.system() != 'Windows',
stdout=self.log_file,
stderr=self.log_file,
stdin=PIPE)
改为:
self.process = subprocess.Popen(cmd, env=self.env,
close_fds=platform.system() != 'Windows',
#stdout=self.log_file,
#stderr=self.log_file,
stdin=PIPE)
————————————————
原文链接:https://blog.csdn.net/wjd1994/article/details/102320246 )实在不懂去这里仔细看看
再之 我用的IDE是pycharm 老老实实安装(pip)好需要的 selenium库 以及 HTMLTestRunner库 后者是需要在网上下载,下载地址在这呢!
由于unittest是python自带的库。就很方便
这是我先写的代码。 检测webdriver是否能正常运行
from selenium import webdriver
from time import sleep
# from selenium.webdriver.common.action_chains import ActionChains
# import unittest
driver = webdriver.Chrome()
# driver.implicitly_wait(5)
url="http://10.10.xxx.xxx"
driver.get(url)
sleep(2)
driver.find_element_by_link_text("登录").click()
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/input").send_keys("admin")
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[2]/td/input").send_keys("123456")
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[5]/td[2]/input").click()
sleep(3)
driver.quit()
其实就访问一个网页的登录页面,
如图, url是之前搭建的一个网址,后来我设成一个可供局域网访问的服务器,方便测试。
当时先测试这个web的会员登录模块,于是再学了点unittest框架之后,就把代码再提升了下,添加了unittest库,建立新的测试框架。
from selenium import webdriver
from time import sleep
import unittest
class TestLoginOut(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get("http://10.10.xxx.xxx/")
self.driver.implicitly_wait(10)
self.driver.maximize_window()
print("setup")
def test_login(self):
driver = self.driver
driver.find_element_by_link_text("登录").click()
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/input").send_keys("admin")
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[2]/td/input").send_keys("123456")
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[5]/td[2]/input").click()
sleep(3)
driver.find_element_by_css_selector(".reg").click()
def tearDown(self):
sleep(2)
self.driver.quit()
print("tearDown")
if __name__ == '__main__':
unittest.main()
代码很简单,我说一下这里面几个关键的点(我自己看法。。
一: 首先再导入unittest库之后,定义一个类用来继承unitttest的Testcase
class名根据个人喜好,但再后面添加测试到测试容器时,还是需要class名
二: 说一下unittest下的几个常用方法, setUp() 一般用来写环境配置,程序会在这里开始执行。
tearDown() 程序会在这里执行完结束,与它们在类中的位置无关。
unittest比较人性化的是,所有你定义的方法,只要是test_开头,它会默认为这是一条测试用例方法,程序就会当作测试用例来执行。 所以,在这里命名很重要。
三:在unittest里你可以任意定义方法,也可以添加多条test用例。若是想一次添加多条用例, 可以用excel表导入,也可以用discover 方法,它里面有三个参数:
-case_dir:这个是待执行用例的目录。
-pattern:这个是匹配脚本名称的规则,test_.py 意思是匹配 test 开头的所有脚本。
-top_level_dir:这个是顶层目录的名称,一般默认等于 None 就行了。
一般在与项目在用一个文件下 新建需要执行的测试用例再将其用discover方法将其批量添加,执行。
贴上我执行后的结果(由于之前这是还没考虑到对执行结果的判断,也就是unittest中最关键的一点 断言 assert方法)
常用断言方法:
self.assertEqual(a,b,msg=msg) #判断a与.b是否一致,msg类似备注,可以为空
self.assertNotEqual(a,b,msg=msg) #判断a与b是否不一致
self.assertTrue(a,msg=none) #判断a是否为True
self.assertFalse(b,msg=none) #判断b是否为false
self.assertSequenceEqual #有空在研究,源码很长
self.assertListEqual #有空研究
self.assertTupleEqual #有空在研究
self.assertSetEqual #有空在研究
self.assertIn(a,b) 判断a in b是否成立,正确则True,否则为False
该说的差不多都说了,以后想到什么再补充
""
version 1.5
打印测试报告(添加了断言,以及htmltestrunner)
editor wenanXu
"""
from selenium import webdriver
import myHTMLTestRunner as HTMLTestRunner
import unittest
import time
class TestCase(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
url = "http://10.10.xxx.xxx"
self.driver.get(url)
self.driver.implicitly_wait(10)
self.driver.maximize_window()
print("Testing~~~~~~~\n开始测试了!")
def tearDown(self):
time.sleep(2)
self.driver.quit()
print("Downing~~~~~~~~\n测试结束了!")
def test_1(self):
driver = self.driver
driver.find_element_by_link_text("登录").click()
driver.find_element_by_css_selector("input[alt*='邮箱']").send_keys("admin")
driver.find_element_by_css_selector("input[alt*='密码']").send_keys("123456")
driver.find_element_by_css_selector(".submit_login").click()
# 断言
# str = driver.find_element_by_xpath("/html/body/div[1]/div[1]/p/text()[1]").text
# self.assertNotAlmostEqual("admin您好,欢迎您来到iwebshop购物!]",str,msg="成功登陆!")
str = driver.find_element_by_xpath("/html/body/div[1]/div[5]/div[2]/div[1]/b").text
self.assertEqual("您好,admin 欢迎回来!",str,msg="登陆成功!")
time.sleep(3)
driver.find_element_by_css_selector(".reg").click()
now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
pic_path = '..\\result\\image\\' + now + '.png'
print(pic_path)
driver.save_screenshot(pic_path)
time.sleep(2)
def test_2(self):
driver = self.driver
driver.find_element_by_link_text("登录").click()
driver.find_element_by_css_selector("input[alt*='邮箱']").send_keys("test")
driver.find_element_by_css_selector("input[alt*='密码']").send_keys("test")
driver.find_element_by_css_selector(".submit_login").click()
# 断言
str_2 = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[2]/td/label").text
self.assertNotEqual("填写密码",str_2,msg="请填写正确密码!")
time.sleep(3)
driver.find_element_by_css_selector(".reg").click()
time.sleep(2)
if __name__ == "__main__":
# 定义一个单元测试容器
testsuite = unittest.TestSuite()
# 将测试用例加入到测试容器
testsuite.addTest(TestCase("test_1"))
testsuite.addTest(TestCase("test_2"))
# 获取当前时间,这样便于下面的使用。
now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time()))
htmlFile = '..\\result\\'+now+'HTMLtemplate.html'
print(htmlFile)
# 打开一个文件,将result写入此file中
filePath ="C://Users//Administrator//Desktop//test.html"
fp=open(filePath ,"wb")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='test result', description=u'result:')
#执行测试用例
runner.run(testsuite)
#关闭文件
fp.close()
我这里元素定位用的是css_selector方法,另外定位元素方法很多, 都是因人而异,用哪种习惯用哪种。
忘了说htmltestrunner了, 它的作用看名字就能知道,作为一个html显示测试report,
很直观的看到自己的测试情况。
用法很简单,调用它本身的HTMLTestRunner方法就可以。
它有三个参数,stream 文件存放位置, title 标题 , description 描述
根据自己实际情况来填写,filepath 注意转义字符
运行完之后,结果如下图所示, 很清楚发现 当我们用test用户登录时,发现无法正常登录。(另外我上面还写到了一个方法 就是将正确执行后的结果,通过save_screenshot()方法进行截图,保存位置依旧是根据自己来决定)