杰瑞科技汇

Python Selenium模块如何入门使用?

Selenium 是一个用于 Web 应用程序测试的工具,它可以直接在浏览器中运行,就像真实用户一样,Selenium 可以模拟用户的各种操作,比如点击按钮、填写表单、导航到不同的页面等,通过 Python 的 Selenium 绑定,我们可以用 Python 脚本来控制浏览器,实现自动化测试、数据爬取等任务。

Python Selenium模块如何入门使用?-图1
(图片来源网络,侵删)

Selenium 的核心概念

在学习使用之前,先理解几个核心组件:

  • WebDriver: 这是 Selenium 的核心,它是一个浏览器自动化框架,可以让你用代码控制浏览器,你可以把它想象成一个“机器人手臂”,它接管了你的浏览器,并根据你的指令执行操作。
  • 浏览器驱动 (Browser Drivers): 不同的浏览器(如 Chrome, Firefox, Edge)需要不同的驱动程序,驱动程序是 WebDriver 和浏览器之间的“翻译官”,它将你的 Python 代码转换成浏览器能够理解的指令。
    • Chrome -> chromedriver
    • Firefox -> geckodriver
    • Edge -> msedgedriver
  • 元素定位: 要与页面上的元素(如按钮、输入框、链接)交互,首先需要找到它们,Selenium 提供了多种定位方式,最常用的有:
    • find_element(By.ID, "value"): 通过元素的 ID 定位(最推荐,因为 ID 通常是唯一的)。
    • find_element(By.CLASS_NAME, "value"): 通过元素的 class 名称定位。
    • find_element(By.TAG_NAME, "value"): 通过 HTML 标签名定位(如 div, a, input)。
    • find_element(By.NAME, "value"): 通过元素的 name 属性定位。
    • find_element(By.XPATH, "value"): 通过 XPath 路径定位(非常强大和灵活)。
    • find_element(By.CSS_SELECTOR, "value"): 通过 CSS 选择器定位(同样非常强大)。
    • find_elements(...): 用于查找所有匹配的元素,返回一个列表。

安装与环境配置

1 安装 Selenium 库

使用 pip 安装:

pip install selenium

2 下载浏览器驱动

这是最关键的一步,你需要下载与你浏览器版本相匹配的驱动程序。

以 Chrome 为例:

Python Selenium模块如何入门使用?-图2
(图片来源网络,侵删)
  1. 查看 Chrome 版本:打开 Chrome 浏览器,进入 设置 -> Chrome,记下版本号(0.6312.86)。
  2. 下载驱动
    • 访问 Chrome for Testing availability (https://googlechromelabs.github.io/chrome-for-testing/)。
    • 找到与你 Chrome 版本最匹配的 chromedriver
    • 下载对应你操作系统(Windows, macOS, Linux)和系统架构(64-bit)的 zip 压缩包。
    • 解压压缩包,你会得到一个 chromedriver.exe (Windows) 或 chromedriver (macOS/Linux) 文件。
  3. 配置驱动路径
    • 方法一(推荐):chromedriver.exe 文件放到你的 Python 脚本所在的同一个目录下,这样 Selenium 会自动找到它。
    • chromedriver.exe 所在的目录添加到系统的环境变量 PATH 中,这样你就可以从任何位置调用它。
    • 方法三(代码中指定): 在代码中明确指定驱动文件的完整路径。

基本使用示例

下面是一个完整的、从打开浏览器到关闭浏览器的流程示例。

示例:访问百度,搜索 "Selenium",然后关闭浏览器

# 1. 导入必要的模块
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
import time
# 2. 设置 Chrome 选项(可选)
# 无头模式(不显示浏览器界面)
# options = Options()
# options.add_argument("--headless")
# options.add_argument("--disable-gpu")
# 3. 指定 ChromeDriver 的路径
# 如果你已经将 chromedriver 放在了脚本同目录下,可以直接使用 'chromedriver'
# 否则,请提供完整路径, Service(executable_path="C:/path/to/chromedriver.exe")
service = Service(executable_path='./chromedriver') # 假设驱动在脚本同目录
# 4. 初始化 WebDriver
driver = webdriver.Chrome(service=service, options=options)
try:
    # 5. 打开目标网页
    print("正在打开百度首页...")
    driver.get("https://www.baidu.com")
    # 6. 等待页面加载,并最大化窗口
    time.sleep(2) # 简单等待,实际项目中最好用显式等待
    driver.maximize_window()
    # 7. 定位搜索框元素并进行操作
    # 通过 ID 定位搜索框
    search_box = driver.find_element(By.ID, "kw")
    # 在搜索框中输入 "Selenium"
    print("正在输入搜索关键词...")
    search_box.send_keys("Selenium")
    # 模拟按下回车键
    search_box.send_keys(Keys.ENTER)
    # 8. 等待搜索结果加载
    print("正在等待搜索结果...")
    time.sleep(3) # 同样,这里用简单等待作为演示
    # 9. 获取页面标题并打印
    print(f"当前页面标题是: {driver.title}")
    # 10. 验证搜索结果中是否包含 "Selenium 官方网站"
    try:
        # 通过 XPath 定位一个特定的链接
        official_link = driver.find_element(By.XPATH, "//a[contains(text(), 'Selenium 官方网站')]")
        print("成功找到 'Selenium 官方网站' 链接!")
    except NoSuchElementException:
        print("未找到 'Selenium 官方网站' 链接。")
finally:
    # 11. 无论成功与否,最后都关闭浏览器
    print("正在关闭浏览器...")
    driver.quit()

高级功能

1 显式等待 vs. 隐式等待

  • 隐式等待 (implicitly_wait):

    • find_element 被调用时,如果元素没有立即找到,Selenium 会在指定的时间内轮询查找。
    • 全局设置,只需调用一次。
    • 缺点:如果页面加载缓慢,它可能会等待整个超时时间,即使目标元素已经加载出来了,也可能等待一个不存在的元素,浪费大量时间。
      driver.implicitly_wait(10) # 等待最多10秒
  • 显式等待 (WebDriverWait):

    • 强烈推荐,它会等待某个特定条件成立后,再继续执行代码,如果超时,则抛出 TimeoutException
    • 更加精确和高效。
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC

    等待最多10秒,直到ID为 "myDynamicElement" 的元素可见

    element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "myDynamicElement")) )

    Python Selenium模块如何入门使用?-图3
    (图片来源网络,侵删)

2 处理弹窗

  • 警告框:

    alert = driver.switch_to.alert
    alert.accept() # 点击“确定”
    # alert.dismiss() # 点击“取消”
    # alert.send_keys("some text") # 在警告框中输入文本
  • 文件上传: 通常不是通过处理弹窗,而是直接定位到 <input type="file"> 元素,然后使用 send_keys 方法将文件路径发送给它。

    file_input = driver.find_element(By.ID, "file-upload")
    file_input.send_keys("C:/path/to/your/file.txt")

3 页面截图

在调试自动化脚本时,截图非常有用。

# 截取整个屏幕并保存
driver.save_screenshot('screenshot.png')

4 切换窗口/标签页

当点击链接打开一个新窗口或标签页时,需要切换上下文。

# 获取所有窗口句柄
handles = driver.window_handles
# 切换到第二个窗口(索引为1的窗口)
driver.switch_to.window(handles[1])
# 操作完成后,可以切回原来的窗口
driver.switch_to.window(handles[0])

最佳实践

  1. 使用显式等待:避免使用 time.sleep(),除非在调试。WebDriverWait 是更健壮的解决方案。
  2. 使用可靠的定位策略:优先使用 IDCSS_SELECTOR,避免使用脆弱的 XPathCLASS_NAME(除非 class 是唯一的)。
  3. 使用 try...except 处理异常:网络问题、元素未找到等情况是常见的,优雅地处理它们能让脚本更健壮。
  4. 使用 with 语句或 try...finally:确保浏览器在任何情况下都能被正确关闭,避免资源泄漏。
  5. 将选择器与业务逻辑分离:可以将页面的元素选择器存放在一个单独的文件或类中(即 Page Object Model 设计模式),这样当页面结构变化时,只需修改一个地方。
  6. 不要滥用无头模式:无头模式在服务器上运行很棒,但在调试时,看到浏览器可以让你更好地理解脚本执行过程。

Selenium 是一个功能极其强大的工具,是 Web 自动化测试和爬虫领域的利器,掌握它需要耐心和实践,从最简单的打开、定位、操作、关闭开始,逐步学习等待、切换、处理复杂元素等高级功能,你就能用它解决各种复杂的 Web 自动化问题。

分享:
扫描分享到社交APP
上一篇
下一篇