本文先完整讲解PyCharm下Python Selenium全套配置、基础/高阶API用法,搭配可运行实操案例;再演示同款需求用Selenium IDE录制实现,最后汇总两种方案使用思路。

前言

selenium

做Web UI自动化、模拟网页操作、简单爬虫时,Selenium是行业最主流工具。它有两种使用模式,大家日常都可以按需选用:

  1. Python手写Selenium脚本:代码可控,支持复杂业务逻辑,可分层封装、对接测试流程,适合长期自动化项目;
  2. Selenium IDE浏览器插件:零代码可视化录制,点点鼠标就能生成操作流程,快速复现页面操作,新手入门友好。

一、环境搭建(PyCharm适配)

1. selenium库安装

打开PyCharm底部Terminal终端,执行pip命令安装核心依赖:

# 核心自动化库 + 自动驱动管理工具
pip install selenium webdriver-manager
  • selenium:提供浏览器操控全套API;
  • webdriver-manager:自动识别本地Chrome版本,一键下载匹配驱动,告别版本不兼容报错。

2. 浏览器驱动两种安装方案

方案1:自动驱动(推荐新手,本文全部示例使用)

无需手动下载驱动文件,代码内部自动拉取对应版本,即装即用。
WebDriver-Manager

方案2:手动下载驱动(旧项目兼容场景)

针对不同的浏览器,需要安装不同的驱动。Chrome用ChromeDriver,Edge用MSEdgeDriver,Firefox用GeckoDriver,各驱动均可在对应官网获取。

这里用 ChromeDriver 安装作为演示:

  1. 查看本地Chrome版本:浏览器右上角设置 → 关于Chrome,记录版本号;
    Chrom版本

  2. 访问 ChromeDriver官方下载地址 找到对应版本压缩包;
    安装驱动

  3. 解压驱动.exe文件,放置Python根目录或代码内指定驱动文件路径,并把当前路径保存到环境变量,即可全局调用驱动。


二、Selenium 基础核心用法

1. 浏览器页面基础操作

1.1 初始化浏览器对象(自动驱动极简写法)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 自动匹配Chrome驱动,初始化浏览器
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

注意:如果运行时报错 TypeError: __init__() got an unexpected keyword argument 'service',说明你安装的是老版本Selenium(3.x),需要升级:pip install -U selenium

拓展:无头模式(后台运行不弹出浏览器窗口,适合批量跑任务)

from selenium.webdriver.chrome.options import Options

opt = Options()
opt.add_argument("--headless=new")  # Chrome 109+ 使用新无头模式
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opt)
1.2 访问网页地址
driver.get("https://www.baidu.com")
1.3 控制浏览器窗口尺寸
# 窗口最大化
driver.maximize_window()
# 自定义宽高
driver.set_window_size(1000, 800)
1.4 页面前进、后退、刷新
driver.back()      # 后退上一页
driver.forward()   # 前进下一页
driver.refresh()   # 刷新当前页面
1.5 获取页面基础属性
print("页面标题:", driver.title)
print("当前URL:", driver.current_url)
print("页面源码:", driver.page_source)  # 可用于调试或简单爬虫

2. 页面元素定位(四大主流定位方式)

统一导入定位枚举类:

from selenium.webdriver.common.by import By
定位方式 代码示例 适用场景
ID定位 driver.find_element(By.ID, "kw") 页面唯一id属性,稳定性最高
Class定位 driver.find_element(By.CLASS_NAME, "s_ipt") 单一class值
CSS选择器 driver.find_element(By.CSS_SELECTOR, "#kw") 灵活适配复杂样式,语法简洁
XPath定位 driver.find_element(By.XPATH, "//input[@id='kw']") 无id/class的复杂页面,万能但效率稍低

CSS选择器常用语法速查

目标 CSS写法 说明
id为kw的元素 #kw # 表示id
class为s_ipt的元素 .s_ipt . 表示class
input标签 input 直接写标签名
子级元素 form > input form下的直接子级input
后代元素 form input form下所有层级input
属性筛选 input[name='wd'] 匹配name属性为wd的input

单数与复数定位

# 定位单个元素(找不到抛异常)
driver.find_element(By.ID, "kw")

# 定位多个元素(找不到返回空列表,不抛异常)
driver.find_elements(By.CLASS_NAME, "result-item")

3. 模拟鼠标操作

需要导入鼠标动作链:

from selenium.webdriver import ActionChains

action = ActionChains(driver)
elem = driver.find_element(By.ID, "su")

action.click(elem).perform()         # 单击
action.double_click(elem).perform()  # 双击
action.context_click(elem).perform() # 右键
action.move_to_element(elem).perform() # 鼠标悬浮

4. 模拟键盘输入操作

导入键盘按键包:

from selenium.webdriver.common.keys import Keys

search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("Selenium教程")      # 输入文字
search_input.send_keys(Keys.ENTER)          # 回车
search_input.send_keys(Keys.CONTROL, "a")   # Ctrl+A全选
search_input.send_keys(Keys.BACKSPACE)      # 删除

5. 三种延时等待(解决元素加载未完成报错)

5.1 强制等待(不推荐,仅调试用)

固定休眠时间,不管页面是否加载完成,浪费执行时间:

import time
time.sleep(3)
5.2 隐式等待(全局通用)

设置全局等待时长,查找所有元素时最多等待指定秒数,找到立刻执行:

driver.implicitly_wait(10)
5.3 显式等待(企业项目首选,精准高效)

单独等待某一个指定元素,精准控制加载时机,速度更快:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 最多等待10秒,直到搜索框出现
input_elem = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "kw"))
)

6. 页面切换操作

6.1 多窗口切换

打开新标签页后,通过窗口句柄切换页面:

# 获取所有窗口句柄
windows = driver.window_handles
# 切换到第二个新窗口
driver.switch_to.window(windows[1])
# 切回第一个窗口
driver.switch_to.window(windows[0])
6.2 iframe表单切换

页面内嵌iframe时,必须切入框架才能定位内部元素:

# 根据id/name切入iframe
driver.switch_to.frame("iframeId")
# 通过元素对象切入
frame_elem = driver.find_element(By.CSS_SELECTOR, "iframe")
driver.switch_to.frame(frame_elem)
# 切回原页面
driver.switch_to.default_content()

7. Cookie操作

# 获取全部cookie
cookies = driver.get_cookies()
# 添加自定义cookie
driver.add_cookie({"name": "test", "value": "123"})
# 删除单条cookie
driver.delete_cookie("test")
# 清空所有cookie
driver.delete_all_cookies()

三、Selenium 高阶实用技巧

1. execute_script 执行JS脚本

1.1 判断页面元素是否存在
def element_exist(driver, xpath):
    return driver.execute_script(
        'return document.evaluate("{}", document, null, '
        'XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue != null'.format(xpath)
    )
1.2 滚动页面到最底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
1.3 滚动至指定元素位置
target = driver.find_element(By.ID, "su")
driver.execute_script("arguments[0].scrollIntoView();", target)
1.4 获取页面滚动高度(判断是否到底)
scroll_height = driver.execute_script("return document.body.scrollHeight")
current_scroll = driver.execute_script("return window.pageYOffset")

2. XPath高级定位方案

2.1 文本精准定位
driver.find_element(By.XPATH, "//a[text()='百度首页']")
2.2 模糊文本匹配
# 包含指定文字
driver.find_element(By.XPATH, "//div[contains(text(), '搜索')]")
# 属性值包含指定内容
driver.find_element(By.XPATH, "//input[contains(@class, 'ipt')]")
2.3 多条件逻辑定位
# id=kw 且 class=s_ipt
driver.find_element(By.XPATH, "//input[@id='kw' and @class='s_ipt']")
# 多个条件用or
driver.find_element(By.XPATH, "//input[@id='kw' or @name='wd']")
2.4 轴定位(父子/兄弟节点)
# 父节点下的第一个子input(注意:child::是默认轴,可省略)
driver.find_element(By.XPATH, "//form/child::input[1]")
# 简写形式等价
driver.find_element(By.XPATH, "//form/input[1]")
# 获取当前节点的父节点
driver.find_element(By.XPATH, "//input[@id='kw']/parent::form")
# 获取前一个兄弟节点
driver.find_element(By.XPATH, "//input[@id='kw']/preceding-sibling::div")
# 获取后一个兄弟节点
driver.find_element(By.XPATH, "//input[@id='kw']/following-sibling::span")

四、完整综合实操案例:百度搜索自动化

完整可运行代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
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
from webdriver_manager.chrome import ChromeDriverManager
import time
import traceback

options = Options()
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--window-size=1920,1080")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.implicitly_wait(8)
driver.maximize_window()
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")


try:
    driver.get("https://www.baidu.com")
    print("当前页面标题:", driver.title)
    time.sleep(3)

    # 在AI搜索框中输入内容(使用对应的textarea)
    ai_search_input = driver.find_element(By.ID, "chat-textarea")
    ai_search_input.clear()
    ai_search_input.send_keys("Python Selenium自动化教程")
    print("已向AI搜索框输入关键词")
    time.sleep(0.5)

    # 点击AI搜索框旁的“百度一下”按钮
    ai_search_btn = driver.find_element(By.ID, "chat-submit-button")
    ai_search_btn.click()
    print("已点击AI搜索按钮")

    # 等待搜索结果加载
    time.sleep(3)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    print("已滚动至页面底部")

    # ===== 添加暂停,让你查看搜索结果 =====
    print("\n" + "="*50)
    print("搜索结果已加载完成,浏览器保持打开状态。")
    print("请查看搜索结果,完成后按 Enter 键关闭浏览器...")
    print("="*50)
    input()  # 等待用户按回车键

except Exception as err:
    print("脚本执行异常:", err)
    traceback.print_exc()
finally:
    # 关闭浏览器,释放进程
    driver.quit()
    print("浏览器已关闭。")

运行效果

  1. 自动弹出Chrome浏览器并打开百度首页;
  2. 在AI搜索框中输入关键词"Python Selenium自动化教程",点击"百度一下"按钮执行搜索;
  3. 等待3秒后自动滚动页面至底部;
  4. 程序暂停,浏览器保持打开,按 Enter 键 后自动关闭浏览器,无残留进程。

五、零代码替代方案:Selenium IDE录制同款百度搜索

前面我们用Python代码完成了自动化流程,不想写代码的小伙伴可以使用Selenium IDE插件快速实现一模一样的操作:

1. 前置准备

Chrome/Edge浏览器应用商店搜索安装官方 Selenium IDE 插件。
Selenium IDE

2. 录制完整步骤

  1. 打开插件,点击「录制新测试」,填写用例名称,默认网址填 https://www.baidu.com
    1

  2. 点击红色录制按钮,自动打开百度页面;

  3. 手动在搜索框输入 Python Selenium自动化教程,按下回车;

  4. 页面加载完成后,滚动页面到底部,完成操作后停止录制;

3. 回放与导出

  1. 点击播放按钮,自动复现全部操作流程;
    运行

  2. 支持导出Python脚本(或其他语言),导出后可复制到PyCharm中二次修改优化。

注意:Selenium IDE导出的Python脚本通常包含 time.sleep() 固定等待,且用的是老式 find_element_by_* 语法。如果要在新版Selenium 4.x中运行,需要将定位改为 By.xxx 格式,并建议将强制等待替换为显式等待,否则脚本稳定性会打折扣。


六、全文总结

  1. Python Selenium脚本:功能全面,支持等待、JS执行、复杂逻辑、批量任务,适合长期维护自动化测试、爬虫场景,是企业主流方案;
  2. Selenium IDE工具:零代码可视化录制,上手成本极低,适合临时验证页面、快速复现bug、新手熟悉自动化流程;
  3. 学习建议:新手先用IDE看懂自动化执行逻辑,再系统学习Python Selenium基础+高阶API,两种方案结合使用效率最高;
  4. 避坑要点
    • 优先使用显式等待 + 隐式等待兜底,少用 time.sleep()
    • 定位优先用ID和CSS,XPath做兜底
    • 生产环境务必用 try-finallywith 确保 driver.quit() 被执行
    • Selenium 4.x 已废弃 find_element_by_* 系列方法,统一使用 find_element(By.xxx, value)

参考

  1. Selenium 官方WebDriver开发文档
  2. ChromeDriver官方版本适配说明

更多推荐