Python网络数据采集7-单元测试与Selenium自动化测试

时间:2022-08-28 09:00:41

Python网络数据采集7-单元测试与Selenium自动化测试

单元测试

Python中使用内置库unittest可完成单元测试。只要继承unittest.TestCase类,就可以实现下面的功能。

  • 为每个单元测试的开始和结束提供setUptearDown函数。
  • 提供不同类型的断言让测试成功或者失败
  • 所有以test_打头的函数,都会当成单元测试来运行,他们彼此独立,互不影响。

下面来看一个简单的例子

import unittest

class TestSimple(unittest.TestCase):
    def setUp(self):
        print('set up')

    def test_simple(self):
        a = 2
        l = [2, 3, 43]
        self.assertIn(a, l)

    def tearDown(self):
        print('teardown')

if __name__ == '__main__':
    unittest.main(argv=['ignored', '-v'], exit=False)
test_simple (__main__.TestSimple) ... 

set up
teardown

ok

----------------------------------------------------------------------
Ran 1 test in 0.006s

OK

在Jupyter中,main()需要填入以上参数才能运行,参数列表中第一个参数会被忽略,而exit=False则不会kill掉kernel。详见*

但是在Pycharm中运行则不会任何参数。

测试*

将Python的单元测试和网络爬虫结合起来,就可以实现简单的网站前端功能测试。

import requests
from bs4 import BeautifulSoup
import unittest

class TestWiki(unittest.TestCase):
    soup = None

    def setUp(self):
        global soup
        r = requests.get('https://en.wikipedia.org/wiki/Monty_Python')
        soup = BeautifulSoup(r.text, 'lxml')

    def test_title(self):
        global soup
        title = soup.h1.string
        self.assertEqual(title, 'Monty Python')

    def test_content_exists(self):
        global soup
        content = soup.find('div', id='mw-content-text')
        self.assertIsNotNone(content)

if __name__ == '__main__':
    unittest.main(argv=['ignored', '-v'], exit=False)
test_simple (__main__.TestSimple) ... ok
test_content_exists (__main__.TestWiki) ... 

set up
teardown

D:\Anaconda3\lib\site-packages\bs4\builder\_lxml.py:250: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() or inspect.getfullargspec()
  self.parser.feed(markup)
ok
test_title (__main__.TestWiki) ... ok

----------------------------------------------------------------------
Ran 3 tests in 3.651s

OK

Selenium单元测试

如果使用selenium进行网站测试呢?(它的初衷就是用来干这个的)

from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'C:\Program Files (x86)\phantomjs\bin\phantomjs.exe')
driver.get('https://en.wikipedia.org/wiki/Monty_Python')

print(driver.title)

assert 'Monty Python' in driver.title
Monty Python - Wikipedia
from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'C:\Program Files (x86)\phantomjs\bin\phantomjs.exe')

driver.get('http://pythonscraping.com/pages/files/form.html')
# 找到输入框和提交按钮
first_name = driver.find_element_by_name('firstname')
last_name = driver.find_element_by_name('lastname')
submit = driver.find_element_by_id('submit')
# 输入
first_name.send_keys('admin')
last_name.send_keys('Sun')
# 提交
submit.click()
print(driver.find_element_by_tag_name('body').text)
driver.close()
Hello there, admin Sun!

或者使用动作链。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains

driver = webdriver.PhantomJS(executable_path=r'C:\Program Files (x86)\phantomjs\bin\phantomjs.exe')

driver.get('http://pythonscraping.com/pages/files/form.html')
# 找到输入框和提交按钮
first_name = driver.find_element_by_name('firstname')
last_name = driver.find_element_by_name('lastname')
submit = driver.find_element_by_id('submit')

actions = ActionChains(driver).send_keys_to_element(first_name, 'admin') \
    .send_keys_to_element(last_name, 'Sun') \
    .send_keys(Keys.ENTER)
# 执行动作链
actions.perform()
print(driver.find_element_by_tag_name('body').text)
driver.close()
Hello there, admin Sun!

除了简单的单击双击,发送文本到输入框,还能实现复杂的动作。比如拖放。

from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Firefox()

driver.get('http://pythonscraping.com/pages/javascript/draggableDemo.html')
print(driver.find_element_by_id('message').text)

element = driver.find_element_by_id('draggable')
target = driver.find_element_by_id('div2')
actions = ActionChains(driver).drag_and_drop(element, target)
actions.perform()
print(driver.find_element_by_id('message').text)
driver.close()
Prove you are not a bot, by dragging the square from the blue area to the red area!
You are definitely not a bot!

上面的代码用FireFox可以成功,Chrome和PhantomJs不成功,不知道为什么。先是打印了未拖拽方块时候显示的文字,当将方块拖到下面的div区域之后,页面上的文字变化了。

Selenium还有个有意思的功能--截屏。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains

driver = webdriver.PhantomJS(executable_path=r'C:\Program Files (x86)\phantomjs\bin\phantomjs.exe')
driver.get('https://www.pythonscraping.com/')

driver.get_screenshot_as_file('screenshot.png')
True

保存成功就会返回打印True。

Selenium与单元测试结合

还是面拖拽的例子,加入了Python单元测试与Selenium结合使用。

from selenium import webdriver
from selenium.webdriver import ActionChains
import unittest

class TestSelenium(unittest.TestCase):
    driver = None

    def setUp(self):
        global driver
        driver = webdriver.Firefox()
        driver.get('http://pythonscraping.com/pages/javascript/draggableDemo.html')

    def test_drag(self):
        global driver
        element = driver.find_element_by_id('draggable')
        target = driver.find_element_by_id('div2')
        actions = ActionChains(driver).drag_and_drop(element, target)
        actions.perform()

        self.assertEqual('You are definitely not a bot!', driver.find_element_by_id('message').text)

if __name__ == '__main__':
    unittest.main(argv=['ignored', '-v'], exit=False)
test_drag (__main__.TestSelenium) ... ok
test_simple (__main__.TestSimple) ... ok
test_content_exists (__main__.TestWiki) ... 

set up
teardown

D:\Anaconda3\lib\site-packages\bs4\builder\_lxml.py:250: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() or inspect.getfullargspec()
  self.parser.feed(markup)
ok
test_title (__main__.TestWiki) ... ok

----------------------------------------------------------------------
Ran 4 tests in 23.923s

OK

依然得使用FireFox, 以及main中加上参数argv=['ignored', '-v'], exit=False。看打印结果,上面的测试也执行了,好像在Jupyter中,虽然在一个Cell中执行单元测试,所有测试都会得到执行。普通Python代码就不是这样,每个Cell独立运行,还可以使用上面Cell定义过的变量和已经导入的库。


by @sunhaiyu

2017.7.19

Python网络数据采集7-单元测试与Selenium自动化测试的更多相关文章

  1. [python] 网络数据采集 操作清单 BeautifulSoup、Selenium、Tesseract、CSV等

    Python网络数据采集操作清单 BeautifulSoup.Selenium.Tesseract.CSV等 Python网络数据采集操作清单 BeautifulSoup.Selenium.Tesse ...

  2. 笔记之Python网络数据采集

    笔记之Python网络数据采集 非原创即采集 一念清净, 烈焰成池, 一念觉醒, 方登彼岸 网络数据采集, 无非就是写一个自动化程序向网络服务器请求数据, 再对数据进行解析, 提取需要的信息 通常, ...

  3. Python网络数据采集PDF高清完整版免费下载|百度云盘

    百度云盘:Python网络数据采集PDF高清完整版免费下载 提取码:1vc5   内容简介 本书采用简洁强大的Python语言,介绍了网络数据采集,并为采集新式网络中的各种数据类型提供了全面的指导.第 ...

  4. Python网络数据采集6-隐含输入字段

    Python网络数据采集6-隐含输入字段 selenium的get_cookies可以轻松获取所有cookie. from pprint import pprint from selenium imp ...

  5. Python网络数据采集4-POST提交与Cookie的处理

    Python网络数据采集4-POST提交与Cookie的处理 POST提交 之前访问页面都是用的get提交方式,有些网页需要登录才能访问,此时需要提交参数.虽然在一些网页,get方式也能提交参.比如h ...

  6. Python网络数据采集3-数据存到CSV以及MySql

    Python网络数据采集3-数据存到CSV以及MySql 先热热身,下载某个页面的所有图片. import requests from bs4 import BeautifulSoup headers ...

  7. Python网络数据采集2-wikipedia

    Python网络数据采集2-wikipedia 随机链接跳转 获取*的词条超链接,并随机跳转.可能侧边栏和低栏会有其他链接.这不是我们想要的,所以定位到正文.正文在id为bodyContent的 ...

  8. Python网络数据采集1-Beautifulsoup的使用

    Python网络数据采集1-Beautifulsoup的使用 来自此书: [美]Ryan Mitchell <Python网络数据采集>,例子是照搬的,觉得跟着敲一遍还是有作用的,所以记录 ...

  9. Python网络数据采集PDF

    Python网络数据采集(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/16c4GjoAL_uKzdGPjG47S4Q 提取码:febb 复制这段内容后打开百度网盘手 ...

随机推荐

  1. 小白解决CENTOS7错误&colon;Cannot find a valid baseurl for repo&colon; base&sol;7&sol;x86&lowbar;6

    刚入手的MacBook想着学点东西,本汪还是决定玩玩CentOS服务器,安装好了VirtualBox + CentOS. 打开一看,懵逼了!命令行! 行吧,先装个图形界面: $sudo yum gro ...

  2. 太牛X了!神奇的故事 你猜得到开头,却猜不到结尾

    他在北京发来消息:“我明天去看你,来接我,好么?” 她在南京,开心地回复:“恩啊” 第二天,她在车站搜寻过往人群中他的身影, 期待又焦急“你到底在哪儿?” “傻瓜,你不会真在车站吧,今天是愚人节哎,哈 ...

  3. struts标签&comma;&lt&semi;s&colon;textfield&gt&semi;嵌套&lt&semi;s&colon;property&gt&semi;的问题

    错误:org.apache.jasper.JasperException: /front/orderList.jsp(110,122) equal symbol expected   <s:te ...

  4. IIS7显示ASP的详细错误信息到浏览器

    服务端环境:Windows2008 + IIS7 客户端浏览器设置:取消“显示友好的HTTP错误信息” IIS7设置(GUI): 1. 网站->ASP->调试属性->将错误发送到浏览 ...

  5. SQL字符串分组聚合&lpar;分组后的数据查询后用逗号隔开&rpar;

    )) , 'aa') , 'bb') , 'aaa') , 'bbb') , 'ccc') go , , '') from tb group by id

  6. 高质量程序设计指南C&sol;C&plus;&plus;语言——C&plus;&plus;&sol;C程序设计入门(4)

    *switch结构的break语句只是一个“jmp”指令,其作用就是跳到switch结构的结尾处 *标准C++/C语言提供3种循环:do/while.while和for,它们都在条件表达式为TRUE( ...

  7. app电量测试

    一.测试前准备 样本A:商家端2.6.4版本为基准样本(即旧版本): 样本B:商家端2.6.5版本(未正式上线,可找RD协助打包): 推荐Android 5.0及以上手机2台或多台(根据RD本次测试需 ...

  8. &lbrack;Deep Learning&rsqb; mini-batch

    转自 http://hp.stuhome.net/index.php/2016/09/20/tensorflow_batch_minibatch/ 深度学习的优化算法,说白了就是梯度下降.每次的参数更 ...

  9. abp ef codefirst Value cannot be null&period; Parameter name&colon; connectionString

    错误原因是abp生成的项目是mvc类型的,但在使用时,选择了vue去开发,所以在abp上重新生成了一个vue项目,把原有的mvc项目给删掉了,没有将新生成的vue类型的项目的文件覆盖掉原有的mvc其他 ...

  10. &lbrack;转译&rsqb; AD RMS 安装最佳实践

    在安装活动目录权限管理服务(ADRMS)时,请牢记以下几点: 将 AD RMS服务单独安装在一台服务器上——将 AD RMS与域控制器.微软邮件服务器(Microsoft Exchange Serve ...