📅  最后修改于: 2020-11-07 08:06:24             🧑  作者: Mango
本章介绍如何使用Python的Web爬虫执行测试。
在大型Web项目中,会定期执行对网站后端的自动化测试,但经常会跳过前端测试。这背后的主要原因是网站的编程就像各种标记和编程语言的网络一样。我们可以为一种语言编写单元测试,但是如果以另一种语言进行交互则变得充满挑战。这就是为什么我们必须具有一组测试来确保我们的代码按预期执行的原因。
当我们谈论测试时,它意味着单元测试。在深入研究Python测试之前,我们必须了解单元测试。以下是单元测试的一些特征-
组件功能的至少一个方面将在每个单元测试中进行测试。
每个单元测试都是独立的,也可以独立运行。
单元测试不会干扰任何其他测试的成功或失败。
单元测试可以任何顺序运行,并且必须至少包含一个断言。
所有标准的Python安装都随附了名为Unittest的Python模块,用于单元测试。我们只需要导入它,剩下的就是unittest.TestCase类的任务,它将执行以下操作-
SetUp和tearDown函数由unittest.TestCase类提供。这些功能可以在每次单元测试之前和之后运行。
它还提供了assert语句,以允许测试通过或失败。
它运行以test_开头的所有功能作为单元测试。
在这个例子中,我们将结合使用web scraping和unittest 。我们将测试Wikipedia页面以搜索字符串’ Python’。它将基本上进行两个测试,第一个测试标题页是否与搜索字符串相同(即是否为“Python”),第二个测试确保标题页具有内容div。
首先,我们将导入所需的Python模块。我们使用BeautifulSoup进行网页抓取,当然也使用unittest进行测试。
from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest
现在,我们需要定义一个扩展unittest.TestCase的类。全局对象bs将在所有测试之间共享。指定单元测试的函数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.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)
让我们讨论如何使用Python Selenium进行测试。这也称为硒测试。 Python unittest和Selenium并没有太多共同点。我们知道Selenium会向不同的浏览器发送标准的Python命令,尽管它们的浏览器设计有所不同。回想一下,我们在先前的章节中已经安装并使用了Selenium。在这里,我们将在Selenium中创建测试脚本并将其用于自动化。
在下一个Python脚本的帮助下,我们正在创建用于Facebook登录页面自动化的测试脚本。您可以修改该示例以自动执行您选择的其他表单和登录,但是概念是相同的。
首先用于连接到Web浏览器,我们将从selenium模块导入webdriver-
from selenium import webdriver
现在,我们需要从硒模块导入密钥。
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 /登录。
element.send_keys(Keys.RETURN)
现在,我们将关闭浏览器。
driver.close()
运行上述脚本后,将打开Chrome网络浏览器,您会看到正在插入电子邮件和密码,然后单击登录按钮。
很难比较unittest和硒,因为如果您要使用大型测试套件,则需要unites的语法严格性。另一方面,如果您要测试网站的灵活性,那么硒测试将是我们的首选。但是,如果我们可以将两者结合在一起,该怎么办?我们可以将硒导入Python,并充分利用两者。 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()