首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >selenium在爬虫和自动化测试中的妙用

selenium在爬虫和自动化测试中的妙用

原创
作者头像
叫我阿柒啊
发布2024-11-01 01:38:16
发布2024-11-01 01:38:16
84300
代码可运行
举报
运行总次数:0
代码可运行

前言

初识selenium,还是当时热衷于爬虫开发的时候。当时老是遇到一些js加密、动态加载的反爬措施,因为在浏览器上看到的页面,是经过浏览器内核对js执行过后数据渲染的结果。而爬虫程序获取的是原始网页,是没有经过js渲染的。

所以如果想要获取js渲染后的数据,简单的就是动态加载,在控制台找到对应的数据请求接口,然后构造参数请求接口就可以了。对于复杂的,例如之前写过的js混淆、js加密等,需要从很多js文件中推导出参数的构造过程和数据的请求过程。

在推导的过程中,主要借助浏览器控制台的Debugger,在一层层调用链中寻找蛛丝马迹。不过这种方式的确是挺耗费时间。后来就想着python是否有些包,操作类似于浏览器一样的工具,可以执行js并渲染数据后将网页内容返回给爬虫。

你还别说,你还真别说,后来就让我找到了selenium和Scrapy的splash,都可以实现上面的需求。Splash是部署在docker的一个类似于代理的api服务,在请求目标网站时,splash会渲染数据后返回给程序,通常与Scrapy爬虫框架一起使用。

而selenium是让python具备打开浏览器加载网页的一个功能,让浏览器渲染数据。但是需要下载一个浏览器的驱动,也就是说你的程序中有一个浏览器。所以我在爬虫开发时尽量避免使用selenium,但是这并不妨碍selenium对浏览器强大操作能力,以及在自动化测试中的重要地位。

selenium

selenium 是一个开源的自动化测试框架,主要用于自动化Web应用程序的测试。它能够与各种浏览器(如Chrome、Firefox、Safari等)进行交互,使得开发者和测试人员能够快速、准确地验证Web应用的功能和性能。接下来就看看selenium的主要功能:

元素定位

Selenium 提供了多种方式来定位页面元素,例如:

  1. find_element_by_id():根据id属性定位元素
  2. find_element_by_name():根据name定位元素
  3. find_element_by_class_name():根据类名寻定位元素
  4. find_element_by_xpath():根据xpath选择器定位元素
  5. find_element_by_css_selector():根据css选择器定位元素

用户操作模拟

Selenium 能够模拟用户的各种操作,包括:

  1. 点击按钮
  2. 输入文本
  3. 选择下拉框
  4. 提交表单
  5. 切换选项卡或窗口
代码语言:python
代码运行次数:0
运行
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
import time

# 配置 ChromeDriver 的路径
service = Service(r'D:\workspace\PythonDemo\chromedriver.exe')
options = Options()
driver = webdriver.Chrome(service=service, options=options)

try:
    # 打开网页
    driver.get('https://www.example.com')  # 替换为你要访问的网页

    # 1. 点击按钮
    button = driver.find_element(By.ID, 'button_id')  # 替换为按钮的 ID
    button.click()

    # 2. 输入文本
    input_field = driver.find_element(By.NAME, 'input_name')  # 替换为输入框的 name
    input_field.send_keys('Hello, Selenium!')

    # 3. 选择下拉框
    select_element = driver.find_element(By.ID, 'select_id')  # 替换为下拉框的 ID
    select = Select(select_element)
    select.select_by_visible_text('Option 1')  # 替换为你要选择的选项文本

    # 4. 提交表单
    form = driver.find_element(By.ID, 'form_id')  # 替换为表单的 ID
    form.submit()

    # 5. 切换选项卡或窗口
    original_window = driver.current_window_handle
    driver.execute_script("window.open('https://www.another-example.com');")  # 打开新窗口
    time.sleep(2)  # 等待新窗口加载
    new_window = [window for window in driver.window_handles if window != original_window][0]
    driver.switch_to.window(new_window)  # 切换到新窗口

    # 在新窗口中执行操作
    driver.get('https://www.another-example.com')  # 替换为新窗口中的网址

    # 关闭新窗口并切换回原窗口
    driver.close()
    driver.switch_to.window(original_window)

finally:
    # 关闭浏览器
    driver.quit()

等待机制

为了提高测试的稳定性,Selenium 提供了:

  1. 隐式等待:在查找元素时设置一个全局等待时间。
  2. 显式等待:在特定条件下等待某个元素变得可用或可点击。

截图功能

可以对当前浏览器窗口进行截图,方便记录测试过程中的状态和结果,帮助调试和分析问题。

代码语言:python
代码运行次数:0
运行
复制
driver.get('https://www.example.com')  # 替换为你要访问的网页

# 等待网页加载
time.sleep(2)

# 截图并保存为文件
driver.get_screenshot_as_file('screenshot.png')  # 将截图保存为 screenshot.png
screenshot = driver.get_screenshot_as_png()
with open('screenshot_binary.png', 'wb') as f:
    f.write(screenshot)

处理弹出窗口和对话框

Selenium 可以轻松处理浏览器弹出窗口、模态框和 JavaScript 对话框(如 alert、confirm、prompt)。

数据驱动测试

可以与数据源(如 CSV、Excel 或数据库)结合使用,支持数据驱动测试,方便在不同数据集下重复执行测试用例。

集成测试框架

Selenium 可以与多种测试框架(如 JUnit、TestNG、pytest)结合使用,实现更强大的测试管理和报告功能。

API 测试

除了 UI 自动化测试,Selenium 也可以用于 API 测试,验证 Web 应用后端服务的功能和性能。

结语

在Scrapy的middleware中间件中,同样可以集成selenium用作一些js加密的网站爬取。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • selenium
    • 元素定位
    • 用户操作模拟
    • 等待机制
    • 截图功能
    • 处理弹出窗口和对话框
    • 数据驱动测试
    • 集成测试框架
    • API 测试
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档