本章介绍如何使用Python中的Web抓取工具进行测试.
简介
在大型Web项目中,网站后端的自动化测试是定期进行,但经常跳过前端测试.这背后的主要原因是网站编程就像是各种标记和编程语言的网络.我们可以为一种语言编写单元测试,但如果用另一种语言进行交互则会变得具有挑战性.这就是为什么我们必须有一套测试来确保我们的代码按照我们的期望执行.
使用Python进行测试
当我们是谈论测试,它意味着单元测试.在深入研究Python之前,我们必须了解单元测试.以下是单元测试的一些特性 :
组件功能的至少一个方面是在每个单元测试中测试.
每个单元测试都是独立的,也可以独立运行.
单元测试不会影响任何其他测试的成功或失败.
单元测试可以按任何顺序运行,并且必须至少包含一个断言.
Unittest : Python模块
用于单元测试的名为Unittest的Python模块附带所有标准的Python安装.我们只需要导入它,休息是unittest.TestCase类的任务,它将执行以下操作;
SetUp和tearDown函数由unittest.TestCase类提供.这些函数可以在每个单元测试之前和之后运行.
它还提供断言语句以允许测试通过或失败.
它运行以test_开头的所有函数作为单元测试.
示例
在本例中,我们将网页抓取与 unittest 结合起来.我们将测试Wikipedia页面以搜索字符串'Python'.它基本上会做两个测试,第一个天气标题页与搜索字符串相同,即'Python',第二个测试确保页面有内容div.
首先,我们将导入所需的Python模块.我们使用BeautifulSoup进行网页抓取,当然还有单元测试用于测试.
from urllib.request import urlopenfrom bs4 import BeautifulSoupimport unittest
现在我们需要定义一个扩展unittest.TestCase的类.全局对象bs将在所有测试之间共享. unittest指定的函数setUpClass将完成它.这里我们将定义两个函数,一个用于测试标题页面,另一个用于测试页面内容.
class Test(unittest.TestCase): bs = None def setUpClass(): url = 'https://en.wikipedia.org/wiki/Python' 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.773sOKAn exception has occurred, use %tb to see the full traceback.SystemExit: FalseD:\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登录页面的自动化.您可以修改示例以自动选择其他表单和登录,但概念是相同的.
首先连接到Web浏览器,我们将从selenium模块中导入webdriver :
from selenium import webdriver
现在,我们需要从以下位置导入密钥selenium模块.
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)
使用下一行代码在电子邮件和密码字段中插入值后按Enter/login.
element.send_keys(Keys.RETURN)
现在我们将关闭浏览器.
driver.close()
运行上述脚本后,将打开Chrome网络浏览器,您可以看到插入的电子邮件和密码,并点击登录按钮.
比较:unittest或Selenium
比较unittest和selenium很难,因为如果你想使用大型测试套件,那就是合成器需要单位的强制性.另一方面,如果您要测试网站灵活性,那么Selenium测试将是我们的首选.但是,如果我们能将两者结合起来呢.我们可以将selenium导入Python unittest并充分利用它们. Selenium可用于获取有关网站的信息,unittest可以评估该信息是否符合通过测试的标准.
例如,我们正在重写上述Python脚本以实现自动化通过将两者结合起来进行Facebook登录:<
import unittestfrom selenium import webdriverclass 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()