selenium3+python:baidu_demo

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个脚本分别执行,维护成本有点高,那么如何维护多平台驱动切换??

猜你喜欢

转载自blog.csdn.net/lusainan_testgirl/article/details/82145873