Python Web 爬取 使用爬虫器进行测试
本章解释了如何在Python中使用网络爬虫器进行测试。
简介
在大型网站项目中,网站后台的自动化测试是定期进行的,但前端的测试却经常被跳过。这背后的主要原因是,网站的编程就像一张由各种标记和编程语言组成的网。我们可以为一种语言编写单元测试,但如果用另一种语言进行交互,这就变得很有挑战性。这就是为什么我们必须有一套测试来确保我们的代码按照我们的期望执行。
使用Python进行测试
当我们在谈论测试时,它意味着单元测试。在深入研究Python的测试之前,我们必须了解单元测试。以下是单元测试的一些特点
- 在每个单元测试中,至少要测试一个组件的一个方面的功能。
-
每个单元测试都是独立的,也可以独立运行。
-
单元测试不干扰任何其他测试的成功或失败。
-
单元测试可以以任何顺序运行,并且必须至少包含一个断言。
Unittest – Python模块
用于单元测试的Python模块名为Unittest,在所有标准Python安装中都有。我们只需要导入它,剩下的就是 unittest.TestCase 类的任务了,它将完成以下工作
- unittest.TestCase 类提供了 SetUp 和 tearDown 函数。这些函数可以在每个单元测试之前和之后运行。
-
它还提供断言语句,允许测试通过或失败。
-
它运行所有以test_开头的函数作为单元测试。
例子
在这个例子中,我们将结合网络爬虫和 unittest 。 我们将测试维基百科上搜索 “Python “字符串的页面。它基本上会做两个测试,第一是标题页是否与搜索字符串相同,即’Python’,第二是确保该页面有一个内容div。
首先,我们将导入所需的Python模块。我们使用BeautifulSoup进行网络爬虫,当然也使用unittest进行测试。
from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest
现在我们需要定义一个类,它将扩展 unittest.TestCase。全局对象bs将在所有测试之间共享。一个unittest指定的函数setUpClass将完成这一任务。这里我们将定义两个函数,一个用于测试标题页,另一个用于测试页面内容。
class Test(unittest.TestCase):
bs = None
def setUpClass():
url = '<a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Python">https://en.wikipedia.org/wiki/Python'</a>
Test.bs = BeautifulSoup(urlopen(url), 'html.parser')
def test_titleText(self):
pageTitle = Test.bs.find('h1').get_text()
self.assertEqual('Python', pageTitle);
def test_contentExists(self):
content = Test.bs.find('div',{'id':'mw-content-text'})
self.assertIsNotNone(content)
if __name__ == '__main__':
unittest.main()
运行上述脚本后,我们将得到以下输出 –
----------------------------------------------------------------------
Ran 2 tests in 2.773s
OK
An exception has occurred, use %tb to see the full traceback.
SystemExit: False
D:\ProgramData\lib\site-packages\IPython\core\interactiveshell.py:2870:
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
用Selenium进行测试
让我们来讨论如何使用Python Selenium进行测试。它也被称为Selenium测试。 Python unittest 和 Selenium 都没有什么共同之处。我们知道Selenium向不同的浏览器发送标准的Python命令,尽管其浏览器的设计有差异。回顾一下,我们已经在前面的章节中安装并使用了Selenium。这里我们将在Selenium中创建测试脚本,并将其用于自动化。
例子
在下一个Python脚本的帮助下,我们将为Facebook登录页面的自动化创建测试脚本。你可以修改这个例子来实现你所选择的其他表格和登录的自动化,但概念是一样的。
首先,为了连接到网络浏览器,我们将从Selenium模块中导入webdriver —
from selenium import webdriver
现在,我们需要从Selenium模块导入Keys。
from selenium.webdriver.common.keys import Keys
接下来,我们需要提供用户名和密码来登录我们的Facebook账户
user = "gauravleekha@gmail.com"
pwd = ""
接下来,提供Chrome浏览器的网络驱动程序的路径。
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get("<http://www.facebook.com>")
现在我们将通过使用assert关键字来验证这些条件。
assert "Facebook" in driver.title
在下面这行代码的帮助下,我们正在向电子邮件部分发送数值。在这里,我们通过它的ID来搜索,但我们可以通过名称来搜索,如 driver.find_element_by_name(“email”) 。
element = driver.find_element_by_id("email")
element.send_keys(user)
在下面这行代码的帮助下,我们正在向密码部分发送数值。在这里,我们通过它的id来搜索,但我们可以通过名称来搜索,如 driver.find_element_by_name(“pass”) 。
element = driver.find_element_by_id("pass")
element.send_keys(pwd)
下一行代码用于在电子邮件和密码字段中插入数值后按回车/登录。
element.send_keys(Keys.RETURN)
现在我们将关闭浏览器。
driver.close()
运行上述脚本后,Chrome网络浏览器将被打开,你可以看到电子邮件和密码被插入并点击了登录按钮。
比较: unittest 或 Selenium
unittest和selenium的比较很困难,因为如果你想处理大型测试套件,就需要unites在语法上的刚性。另一方面,如果你要测试网站的灵活性,那么Selenium测试将是我们的第一选择。但是,如果我们能把这两者结合起来呢。我们可以把Selenium导入到Python unittest中,从而获得两者的优点。Selenium可以用来获取网站的信息,unittest可以评估这些信息是否符合通过测试的标准。
例如,我们要重写上面的Python脚本,以实现Facebook登录的自动化,将两者结合起来,如下所示
import unittest
from selenium import webdriver
class InputFormsCheck(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(r'C:\Users\gaurav\Desktop\chromedriver')
def test_singleInputField(self):
user = "gauravleekha@gmail.com"
pwd = ""
pageUrl = "http://www.facebook.com"
driver=self.driver
driver.maximize_window()
driver.get(pageUrl)
assert "Facebook" in driver.title
elem = driver.find_element_by_id("email")
elem.send_keys(user)
elem = driver.find_element_by_id("pass")
elem.send_keys(pwd)
elem.send_keys(Keys.RETURN)
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()