Scraping web Python - Thử nghiệm với Scrapers

Chương này giải thích cách thực hiện kiểm tra bằng cách sử dụng công cụ quét web trong Python.

Giới thiệu

Trong các dự án web lớn, kiểm tra tự động phần phụ trợ của trang web được thực hiện thường xuyên nhưng kiểm tra giao diện người dùng thường bị bỏ qua. Lý do chính đằng sau điều này là việc lập trình các trang web giống như một mạng lưới các ngôn ngữ lập trình và đánh dấu khác nhau. Chúng ta có thể viết bài kiểm tra đơn vị cho một ngôn ngữ nhưng sẽ trở nên khó khăn nếu tương tác được thực hiện bằng ngôn ngữ khác. Đó là lý do tại sao chúng tôi phải có bộ kiểm tra để đảm bảo rằng mã của chúng tôi đang hoạt động như mong đợi của chúng tôi.

Thử nghiệm bằng Python

Khi chúng ta đang nói về thử nghiệm, nó có nghĩa là thử nghiệm đơn vị. Trước khi đi sâu vào thử nghiệm với Python, chúng ta phải biết về kiểm thử đơn vị. Sau đây là một số đặc điểm của kiểm thử đơn vị -

  • Ít nhất một khía cạnh của chức năng của một thành phần sẽ được kiểm tra trong mỗi bài kiểm tra đơn vị.

  • Mỗi bài kiểm tra đơn vị là độc lập và cũng có thể chạy độc lập.

  • Bài kiểm tra đơn vị không ảnh hưởng đến sự thành công hay thất bại của bất kỳ bài kiểm tra nào khác.

  • Các bài kiểm tra đơn vị có thể chạy theo bất kỳ thứ tự nào và phải chứa ít nhất một khẳng định.

Unittest - Mô-đun Python

Mô-đun Python có tên Unittest để kiểm tra đơn vị đi kèm với tất cả cài đặt Python tiêu chuẩn. Chúng ta chỉ cần nhập nó và phần còn lại là nhiệm vụ của lớp unittest.TestCase sẽ thực hiện những việc sau:

  • Các hàm SetUp và drawDown được cung cấp bởi lớp unittest.TestCase. Các chức năng này có thể chạy trước và sau mỗi bài kiểm tra đơn vị.

  • Nó cũng cung cấp các câu lệnh khẳng định để cho phép các bài kiểm tra đạt hoặc không đạt.

  • Nó chạy tất cả các chức năng bắt đầu bằng test_ dưới dạng bài kiểm tra đơn vị.

Thí dụ

Trong ví dụ này, chúng tôi sẽ kết hợp việc tìm kiếm trên web với unittest. Chúng tôi sẽ kiểm tra trang Wikipedia để tìm kiếm chuỗi 'Python'. Về cơ bản, nó sẽ thực hiện hai bài kiểm tra, lần đầu tiên xem trang tiêu đề có giống với chuỗi tìm kiếm tức là 'Python' hay không và bài kiểm tra thứ hai đảm bảo rằng trang đó có div nội dung.

Đầu tiên, chúng tôi sẽ nhập các mô-đun Python được yêu cầu. Chúng tôi đang sử dụng BeautifulSoup để tìm kiếm web và tất nhiên là phiên bản mới nhất để thử nghiệm.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest

Bây giờ chúng ta cần xác định một lớp sẽ mở rộng một lớp Unittest.TestCase. Đối tượng toàn cầu bs sẽ được chia sẻ giữa tất cả các xét nghiệm. Một hàm setUpClass được chỉ định độc nhất sẽ hoàn thành nó. Ở đây chúng tôi sẽ xác định hai chức năng, một để kiểm tra trang tiêu đề và một để kiểm tra nội dung trang.

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()

Sau khi chạy tập lệnh trên, chúng ta sẽ nhận được kết quả sau:

----------------------------------------------------------------------
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)

Thử nghiệm với Selenium

Hãy để chúng tôi thảo luận về cách sử dụng Python Selenium để thử nghiệm. Nó còn được gọi là thử nghiệm Selenium. Cả PythonunittestSeleniumkhông có nhiều điểm chung. Chúng tôi biết rằng Selenium gửi các lệnh Python tiêu chuẩn đến các trình duyệt khác nhau, mặc dù có sự thay đổi trong thiết kế trình duyệt của chúng. Nhớ lại rằng chúng ta đã cài đặt và làm việc với Selenium trong các chương trước. Ở đây chúng tôi sẽ tạo các kịch bản thử nghiệm trong Selenium và sử dụng nó để tự động hóa.

Thí dụ

Với sự trợ giúp của tập lệnh Python tiếp theo, chúng tôi đang tạo tập lệnh thử nghiệm để tự động hóa trang Đăng nhập Facebook. Bạn có thể sửa đổi ví dụ để tự động hóa các biểu mẫu và thông tin đăng nhập khác mà bạn chọn, tuy nhiên khái niệm sẽ giống nhau.

Đầu tiên để kết nối với trình duyệt web, chúng tôi sẽ nhập webdriver từ mô-đun selen -

from selenium import webdriver

Bây giờ, chúng ta cần nhập các Khóa từ mô-đun selen.

from selenium.webdriver.common.keys import Keys

Tiếp theo, chúng ta cần cung cấp tên người dùng và mật khẩu để đăng nhập vào tài khoản facebook của mình

user = "[email protected]"
pwd = ""

Tiếp theo, cung cấp đường dẫn đến trình điều khiển web cho Chrome.

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get("http://www.facebook.com")

Bây giờ chúng tôi sẽ xác minh các điều kiện bằng cách sử dụng từ khóa khẳng định.

assert "Facebook" in driver.title

Với sự trợ giúp của dòng mã sau đây, chúng tôi đang gửi các giá trị đến phần email. Ở đây chúng tôi đang tìm kiếm nó theo id của nó nhưng chúng tôi có thể làm điều đó bằng cách tìm kiếm nó theo tên nhưdriver.find_element_by_name("email").

element = driver.find_element_by_id("email")
element.send_keys(user)

Với sự trợ giúp của dòng mã sau, chúng tôi đang gửi các giá trị đến phần mật khẩu. Ở đây chúng tôi đang tìm kiếm nó theo id của nó nhưng chúng tôi có thể làm điều đó bằng cách tìm kiếm nó theo tên nhưdriver.find_element_by_name("pass").

element = driver.find_element_by_id("pass")
element.send_keys(pwd)

Dòng mã tiếp theo được sử dụng để nhấn enter / đăng nhập sau khi chèn các giá trị trong trường email và mật khẩu.

element.send_keys(Keys.RETURN)

Bây giờ chúng ta sẽ đóng trình duyệt.

driver.close()

Sau khi chạy tập lệnh trên, trình duyệt web Chrome sẽ được mở ra và bạn có thể thấy email và mật khẩu đang được chèn và nhấp vào nút đăng nhập.

So sánh: đơn nhất hoặc Selenium

Việc so sánh giữa đơn nhất và selen là rất khó vì nếu bạn muốn làm việc với các bộ thử nghiệm lớn, thì cần phải có độ cứng cú pháp của các hợp nhất. Mặt khác, nếu bạn định kiểm tra tính linh hoạt của trang web thì thử nghiệm Selenium sẽ là lựa chọn đầu tiên của chúng tôi. Nhưng điều gì sẽ xảy ra nếu chúng ta có thể kết hợp cả hai. Chúng tôi có thể nhập selen vào Python mới nhất và tận dụng tốt nhất cả hai. Selenium có thể được sử dụng để lấy thông tin về một trang web và đơn nhất có thể đánh giá xem thông tin đó có đáp ứng các tiêu chí để vượt qua bài kiểm tra hay không.

Ví dụ: chúng tôi đang viết lại tập lệnh Python ở trên để tự động hóa đăng nhập Facebook bằng cách kết hợp cả hai như sau:

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 = "[email protected]"
      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()