Python 网页抓取使用 Scrapers 进行测试

  • 简述

    本章介绍如何在 Python 中使用网络爬虫进行测试。
  • 介绍

    在大型 Web 项目中,会定期执行网站后端的自动化测试,但经常会跳过前端测试。这背后的主要原因是网站的编程就像各种标记和编程语言的网络。我们可以为一种语言编写单元测试,但如果交互是用另一种语言完成的,就会变得很有挑战性。这就是为什么我们必须有一套测试来确保我们的代码按照我们的预期执行。
  • 使用 Python 进行测试

    当我们谈论测试时,它意味着单元测试。在深入使用 Python 进行测试之前,我们必须了解单元测试。以下是单元测试的一些特征 -
    • 组件功能的至少一个方面将在每个单元测试中进行测试。
    • 每个单元测试都是独立的,也可以独立运行。
    • 单元测试不会干扰任何其他测试的成功或失败。
    • 单元测试可以按任何顺序运行,并且必须至少包含一个断言。
  • Unittest - Python 模块

    用于单元测试的名为 Unittest 的 Python 模块随所有标准 Python 安装一起提供。我们只需要导入它,剩下的就是 unittest.TestCase 类的任务,它将执行以下操作 -
    • SetUp 和 tearDown 函数由 unittest.TestCase 类提供。这些函数可以在每个单元测试之前和之后运行。
    • 它还提供断言语句以允许测试通过或失败。
    • 它将以 test_ 开头的所有函数作为单元测试运行。

    例子

    在这个例子中,我们将网络抓取与unittest. 我们将测试 Wikipedia 页面以搜索字符串“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)
    
  • 使用硒进行测试

    让我们讨论如何使用 Python Selenium 进行测试。它也称为硒测试。两者都 PythonunittestSelenium没有太多共同点。我们知道 Selenium 将标准 Python 命令发送到不同的浏览器,尽管它们的浏览器设计有所不同。回想一下,我们在前面的章节中已经安装并使用了 Selenium。在这里,我们将在 Selenium 中创建测试脚本并将其用于自动化。

    例子

    在下一个 Python 脚本的帮助下,我们正在为 Facebook 登录页面的自动化创建测试脚本。您可以修改示例以自动化您选择的其他表单和登录,但是概念是相同的。
    首先要连接到 Web 浏览器,我们将从 selenium 模块导入 webdriver -
    
    from selenium import webdriver
    
    现在,我们需要从 selenium 模块导入 Keys。
    
    from selenium.webdriver.common.keys import Keys
    
    接下来,我们需要提供用户名和密码以登录我们的 facebook 帐户
    
    user = "gauravleekha@gmail.com"
    pwd = ""
    
    接下来,提供 Chrome 的 Web 驱动程序的路径。
    
    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 网络浏览器,您可以看到正在插入电子邮件和密码并单击登录按钮。
    Facebook登入
  • 比较:unittest 或 Selenium

    unittest 和 selenium 的比较是困难的,因为如果您想使用大型测试套件,则需要 unites 的语法刚性。另一方面,如果您要测试网站的灵活性,那么 Selenium 测试将是我们的首选。但是,如果我们可以将两者结合起来会怎样。我们可以将 selenium 导入 Python unittest 并充分利用两者。Selenium 可用于获取有关网站的信息,而 unittest 可以评估该信息是否符合通过测试的标准。
    例如,我们正在重写上述用于 Facebook 登录自动化的 Python 脚本,方法是将它们组合如下 -
    
    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()