1. 概述
在软件测试当中,自动化测试是一种经常使用的技术手段,Python 作为一种脚本语言,被广泛应用于自动化测试的实现中。无头浏览器作为 Python 环境下实现自动化测试的重要组成部分,可以模拟用户在不同的操作系统、设备和浏览器环境下的行为,来测试网站或应用程序功能是否正确、稳定性是否良好。因此,本文主要介绍使用 Python 实现无头浏览器采集应用实现网页自动化测试的方法及案例分享。
2. 环境搭建
2.1 安装 Python
首先,需要安装 Python。在各个操作系统中都提供了官方的 Python 下载链接。以 Windows 操作系统为例,可以从官方网站下载对应版本的 Python。下载完成后,按照默认设置安装即可。
安装 Python 过程中要注意进行环境变量配置,以便后续在命令行中能够调用 Python 命令。
2.2 安装必要的库
接下来,需要安装必要的 Python 库。在无头浏览器采集应用实现网页自动化测试中,主要需要安装的库有:
requests:用于发送 HTTP 请求。
selenium:用于操作无头浏览器。
beautifulsoup4:用于解析 HTML 文档,提取所需的信息。
可以使用以下命令在命令行中安装这些库:
pip install requests selenium beautifulsoup4
在安装以上三个库之前,需要确保已经安装了 pip 工具。
3. 无头浏览器采集应用实现网页自动化测试的方法
3.1 远程访问无头浏览器
使用 Python 进行无头浏览器操作,需要先启动无头浏览器。可以在命令行中执行以下命令,启动 Chrome 无头浏览器:
google-chrome --headless --remote-debugging-port=9222
注意:在使用无头浏览器时,要确保所使用的浏览器版本和 chromedriver 版本匹配,否则会出现兼容性问题。可在官方网站下载对应版本的 chromedriver。
启动浏览器后,使用 Python 的 webdriver
模块中的 Remote
类,远程连接到无头浏览器,实现无头浏览器的自动化操作。
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
driver = Chrome(
options=chrome_options,
remote_url='http://127.0.0.1:9222'
)
上述代码中,--headless
和 --disable-gpu
参数分别表示启动无头模式和禁用 GPU,--no-sandbox 参数可以使 Chrome 在 Docker 容器等“隔离”的环境下正常工作。
使用 Chrome
类创建浏览器对象,指定 remote_url
参数时会连接到之前启动的无头浏览器。
3.2 模拟用户操作
连接到浏览器后,便可以进行自动化操作。以模拟输入用户名和密码的方式登录 GitHub 为例,代码如下:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
url = 'https://github.com/login'
driver.get(url)
login_field = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.NAME, 'login'))
)
login_field.send_keys('your_username')
passwd_field = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.NAME, 'password'))
)
passwd_field.send_keys('your_password' + Keys.ENTER)
在代码中,首先通过 get
方法打开登录页面,用 presence_of_element_located
方法等待页面元素加载,并使用 send_keys
方法输入用户名和密码并提交。
其他的操作,比如模拟鼠标点击、滚动、截屏等,也可以通过类似的方式实现。自动化测试不仅可以节省人力,还能节省时间,提高测试效率。
4. 案例分享
下面是一个简单的案例,实现从知乎热榜上获取当前热门话题的标题、链接、摘要等信息,并将结果保存到本地文件中。
import requests
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
url = 'https://www.zhihu.com/billboard'
def get_top_question():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.content, 'html.parser')
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
driver = Chrome(
options=chrome_options,
remote_url='http://127.0.0.1:9222'
)
items = []
for item in soup.select('div.FeedItem'):
title = item.select_one('h2.ContentItem-title a')
summary = item.select_one('div.ContentItem-summary')
if title and summary:
title_url = 'https://www.zhihu.com' + title['href']
item_driver = driver
item_driver.get(title_url)
content_section = BeautifulSoup(item_driver.page_source, 'html.parser').select_one('.RichContent-inner')
item_driver.quit()
items.append({
'title': title.text.strip(),
'url': title_url,
'summary': summary.text.strip(),
'content': str(content_section),
})
driver.quit()
return items
def save_to_file(data):
with open('top_question.txt', 'w') as f:
for item in data:
f.write(item['title'] + '\n')
f.write(item['url'] + '\n')
f.write(item['summary'] + '\n')
f.write('\n-------------------------\n')
if __name__ == '__main__':
top_question = get_top_question()
save_to_file(top_question)
在代码中,get_top_question
函数使用 requests 库访问知乎热榜页面,使用 BeautifulSoup 解析 HTML 页面,获取热门话题的标题、链接、摘要等信息。然后使用 Chrome
类连接到无头浏览器,依次访问每个话题的链接,获取对应的内容,并将全部结果保存到本地文件中。
5. 总结
本文主要介绍了使用 Python 实现无头浏览器采集应用实现网页自动化测试的方法及案例分享。无头浏览器作为 Python 实现自动化测试的重要组成部分,可以模拟用户在不同的操作系统、设备和浏览器环境下的行为,来测试网站或应用程序功能是否正确、稳定性是否良好。Python 在自动化测试中的开发效率和简单易用性得到了越来越多的认可,值得深入学习和探究。