1、第一个python程序:百度访问
#=========baidu============0======
#作者:陆赛男
#时间:20180828
# coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
text = driver.find_element_by_id("cp").text
print(text)
driver.quit()
2、增加异常断言
# coding = utf-8
import time
from selenium import webdriver
browser = webdriver.Chrome()
try:
browser.get("http://www.baidu.com")
browser.find_element_by_xpath(".//*[@id='kw']").send_keys("selenium")
browser.find_element_by_xpath(".//*[@id='su']").click()
time.sleep(2)
browser.quit()
except Exception: # Exception,所有异常基类
print("异常了!")
else:
print("没有异常。")
3、baidu_unittest
.代表用例执行通过,两个点表示两个用例执行通过。F表示用例执行不通过。
# coding = utf-8
import time
import unittest
from selenium import webdriver
class BaiduTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(10)
def test_baidu_search(self):
self.driver.get("http://www.baidu.com")
self.driver.find_element_by_xpath(".//*[@id='kw']").send_keys("selenium")
self.driver.find_element_by_xpath(".//*[@id='su']").click()
def tearDown(self):
time.sleep(2)
self.driver.quit()
if __name__ == "__main__":
unittest.main()
4、baidu_unittest_断言_截取图片
# coding = utf-8
import time
import os
import unittest
from selenium import webdriver
class BaiduTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(10)
def test_baidu_search(self):
try:
self.driver.get("http://www.baidu.com")
self.driver.find_element_by_xpath(".//*[@id='kw']").send_keys("selenium")
self.driver.find_element_by_xpath(".//*[@id='su']").click()
time.sleep(1)
#截取当前界面,保存本地
self.driver.get_screenshot_as_file("C:\\Users\\Administrator\\PycharmProjects\\project1\\picture\\baidu5.png")
except Exception: # Exception,所有异常基类
print("异常了!")
else:
print("没有异常。")
def tearDown(self):
time.sleep(1)
self.driver.quit()
if __name__ == "__main__":
unittest.main()
5、生成HTML报告
HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展,它可以生成 HTML的 测试报告。
首先要下 HTMLTestRunner.py 文件,放入…\python\Lib目录下 。
# coding = utf-8
import time
import os
import unittest
from HTMLTestRunner import HTMLTestRunner
from selenium import webdriver
class BaiduTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(10)
def test_baidu_search(self):
try:
self.driver.get("http://www.baidu.com")
self.driver.find_element_by_xpath(".//*[@id='kw']").send_keys("selenium")
self.driver.find_element_by_xpath(".//*[@id='su']").click()
time.sleep(2)
#截取当前界面,保存本地
self.driver.get_screenshot_as_file("C:\\Users\\Administrator\\PycharmProjects\\project1\\picture\\baidu.png")
except Exception: # Exception,所有异常基类
print("异常了!")
else:
print("没有异常。")
def tearDown(self):
time.sleep(2)
self.driver.quit()
if __name__ == "__main__":
testunit = unittest.TestSuite()
testunit.addTest( BaiduTest('test_baidu_search'))
#定义测试报告
now = time.strftime("%Y-%m-%d %H_%M_%S",time.localtime())
filename="C:\\Users\\Administrator\\PycharmProjects\\project1\\report\\"+now+"baidu.html"
fp=open(filename,'wb')
runner=HTMLTestRunner(stream=fp,
title='登录功能测试报告',
description='用例执行情况:')
runner.run(testunit) #运行测试用例
#关闭报告文件
fp.close()
6、发送邮件
python发邮件需要掌握两个模块的用法,smtplib和email。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
将前面生成的最新HTML报告和截图以邮件形式发送:
#smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
#smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
#email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等
import smtplib
import unittest
import os
import time
import HTMLTestRunner
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText #正文
from email.mime.image import MIMEImage
from email.header import Header #标题
#=========带附件+正文(文本+超链接)=======================
smtpserver = 'smtp.exmail.qq.com'
user = '[email protected]'
password = 'XXXXX'
sender = '[email protected]'
receiver = '[email protected]'
acc= '[email protected]'
#带附件
msgRoot = MIMEMultipart('related') #设置邮件为多文本格式
msgRoot['Subject'] = 'Python 自动化测试报告'
#content = MIMEText('<html><h1>内容如下:</h1></html><p><a href="http://www.baidu.com">这是一个链接</a></p>','html','utf-8')
#content = MIMEText('<html><h1>内容如下:</h1></html><html><body><img src="cid:imageid" alt="imageid"></body></html>','html','utf-8')
content = MIMEText('<html><h1>内容如下:</h1></html><p>','html','utf-8')
msgRoot.attach(content)
#补充发件、收件人信息
msgRoot['from'] = sender
msgRoot['to'] = receiver
msgRoot['Cc'] = acc
#附件1(html报告)
sendfile1=open('C:\\Users\\Administrator\\PycharmProjects\\project1\\report\\2018-07-06 16_14_36_result.html','rb').read()
att1 = MIMEText(sendfile1, 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="result_report.html"'
msgRoot.attach(att1)
#附件2(截图)
sendfile2=open('C:\\Users\\Administrator\\PycharmProjects\\project1\\picture\\baidu.png','rb').read()
att2 = MIMEText(sendfile2, 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="result.png"'
msgRoot.attach(att2)
try:
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(user, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()
print ("邮件发送成功")
except smtplib.SMTPException as e:
print("Error, 发送失败")
7、run.py(run.py和baidu.py在同一级目录下)
run.py构造测试集,执行多个脚本:
# 说明:.代表用例执行通过,两个点表示两个用例执行通过。F表示用例执行不通过。
# ===生成报告====
import unittest
import time
import os
from HTMLTestRunner import HTMLTestRunner
import baidu1
import baidu2
import baidu3
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(baidu1.BaiduTest1('test_baidu_search1'))
suite.addTest(baidu2.BaiduTest2('test_baidu_search2'))
suite.addTest(baidu3.BaiduTest3('test_baidu_search3'))
if __name__ == '__main__':
# 执行测试
now = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime())
filename = "D:\\worksoftware\\PyCharm 2018.1.4\\project_demo\\xiangmu\\report\\" + now + "_all.html"
fp = open(filename, 'wb')
runner = HTMLTestRunner(stream=fp,
title='python功能测试报告',
description='用例执行情况:')
runner.run(suite)
# 关闭文件流,不关的话生成的报告是空的
fp.close()
baidu.py:
# coding = utf-8
import time
import os
import unittest
from selenium import webdriver
class BaiduTest1(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(10)
def test_baidu_search1(self):
try:
self.driver.get("http://www.baidu.com")
self.driver.find_element_by_xpath(".//*[@id='kw']").send_keys("selenium1")
self.driver.find_element_by_xpath(".//*[@id='su']").click()
except Exception: # Exception,所有异常基类
print("异常了!")
else:
print("没有异常。")
def tearDown(self):
self.driver.quit()
if __name__ == "__main__":
unittest.main()
8、discover.py(discover.py和baidu.py可以不在一个目录)
如下:
import unittest
import os
import time
from HTMLTestRunner import HTMLTestRunner
def discover_case(case_dir):
testcase = unittest.TestSuite()
discover = unittest.defaultTestLoader.discover(case_dir,pattern="baidu*.py",top_level_dir=None)
for test_suite in discover:
for test_case in test_suite:
testcase.addTests(test_case)
return(testcase)
case_path = os.path.join(os.getcwd(), "test_case")
case = discover_case(case_dir=case_path)
if __name__=='__main__':
#执行用例
#runner=unittest.TextTestRunner()
#runner.run(case)
now = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime())
filename = "D:\\worksoftware\\PyCharm 2018.1.4\\project_demo\\xiangmu\\report\\" + now + "_all.html"
fp = open(filename, 'wb')
runner = HTMLTestRunner(stream=fp,
title='python功能测试报告',
description='用例执行情况:')
runner.run(case)
# 关闭文件流,不关的话生成的报告是空的
fp.close()
9、url配置
有时候我们的测试环境会部署在不同服务器,IP会发生变化,手动改代码里访问地址比较麻烦,可以专门维护一个txt文档,从文档中读取访问地址。
#=========baidu============0======
#作者:陆赛男
#时间:20180828
# coding = utf-8
import time
import unittest
from selenium import webdriver
class BaiduTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
#self.driver = webdriver.Firefox()
#self.driver = webdriver.Ie()
self.driver.implicitly_wait(10)
def test_baidu_search(self):
#self.driver.get("http://www.baidu.com")
user_file=open('dizhi.txt','r')
line=user_file.readlines()[0] #读取第1行
user_file.close()
self.driver.get(line)
self.driver.find_element_by_xpath(".//*[@id='kw']").send_keys("selenium")
self.driver.find_element_by_xpath(".//*[@id='su']").click()
def tearDown(self):
time.sleep(2)
self.driver.quit()
if __name__ == "__main__":
unittest.main()
10、webdriver配置
selenium支持IE、firefox、chrome等主流webdriver,比如我要测试多平台下是否支持,如果写3个脚本分别执行,维护成本有点高,那么如何维护多平台驱动切换??