Skip to content

核心 API 通俗详解

接管了候鸟浏览器之后,接下来最重要的事,就是让 Selenium 按照您的意图操控页面。本章用大白话解释您 80% 的时间都会用到的核心 API。


一、导航与页面控制

打开网址

python
driver.get("https://www.amazon.com")
  • 白话:让浏览器"去这个网址"。
  • 脚本会阻塞在这里,直到页面加载完毕(onload 事件触发)才继续执行。

等页面加载完再走

网速有快有慢,如果页面还没刷完就执行后续代码,脚本会找不到元素而报错。最稳妥的办法是配合等待(见第三节)。

获取页面信息

python
title = driver.title                  # 获取页面标题
url   = driver.current_url           # 获取当前 URL
html  = driver.page_source           # 获取完整页面 HTML

前进、后退、刷新

python
driver.back()     # 后退(等于按浏览器左上角← 箭头)
driver.forward()  # 前进
driver.refresh()  # 刷新页面(F5)

二、查找页面元素

IMPORTANT

找到元素是一切操作的前提。 找不到元素 = 找不到门 = 什么都做不了。

定位器类型速查表

Selenium 4 统一使用 By 类来指定定位方式:

python
from selenium.webdriver.common.by import By
定位方式代码示例适用场景
IDBy.ID, "username"最快最稳,优先选这个
CSS 选择器By.CSS_SELECTOR, "#username"灵活,通用性最强
XPathBy.XPATH, "//input[@name='user']"复杂结构必备,但写起来麻烦
类名By.CLASS_NAME, "btn-primary"简单场景可用,重名元素慎用
标签名By.TAG_NAME, "input"很少单独使用
链接文字By.LINK_TEXT, "登 录"点链接时方便
name 属性By.NAME, "password"表单元素常用

查找单个元素

python
# 查找 id 为 "username" 的元素(找不到就报 NoSuchElementException)
element = driver.find_element(By.ID, "username")

# 查找第一个匹配的 CSS 选择器
btn = driver.find_element(By.CSS_SELECTOR, ".login-form button[type='submit']")

查找多个元素(返回列表)

python
# 找到所有商品列表项
items = driver.find_elements(By.CSS_SELECTOR, ".product-item")
print(f"共找到 {len(items)} 个商品")

# 遍历每个元素
for item in items:
    print(item.text)

如何在浏览器里找到选择器?(实操技巧)

  1. 在候鸟浏览器中打开目标网页
  2. 对准要操作的按钮 右键 → 检查(Inspect)
  3. 在 DevTools 的 HTML 代码上 右键 → Copy → Copy selector(CSS 选择器)或 Copy XPath
  4. 粘贴到您的 Selenium 代码里

三、等待机制(防崩溃利器)

CAUTION

time.sleep(N) 是最糟糕的等待方式——网速快时浪费时间,网速慢时还是会崩溃。请使用 Selenium 的智能等待机制。

显式等待(强烈推荐)

等到某个条件满足才继续,最多等 N 秒,超时则报错:

python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 最多等 15 秒,直到 id="username" 的元素可见
wait = WebDriverWait(driver, 15)
username_input = wait.until(
    EC.visibility_of_element_located((By.ID, "username"))
)

常用等待条件 EC.xxx

等待条件说明
EC.presence_of_element_located元素存在于 DOM 中(不一定可见)
EC.visibility_of_element_located元素存在且可见(推荐)
EC.element_to_be_clickable元素可见且可点击
EC.text_to_be_present_in_element某元素包含指定文本
EC.url_contains当前 URL 包含指定字符串
EC.alert_is_present弹窗出现

实战示例:等待登录完成后跳转

python
# 点击登录按钮
driver.find_element(By.ID, "loginBtn").click()

# 等待 URL 变为含"/dashboard"的地址(表示跳转到了主页)
wait = WebDriverWait(driver, 20)
wait.until(EC.url_contains("/dashboard"))
print("登录跳转成功!")

隐式等待(全局设置,不推荐但有时有用)

python
driver.implicitly_wait(10)  # 全局等待:所有的 find_element 最多等 10 秒

四、模拟人类操作

输入文字

python
# 找到输入框并输入账号,delay 参数控制每个字符的输入间隔(毫秒)
from selenium.webdriver.common.action_chains import ActionChains
import time

input_box = driver.find_element(By.ID, "username")
input_box.clear()           # 先清空输入框原有内容
input_box.send_keys("mbbrowser_user")  # 输入内容

# 模拟更真实的人类输入(逐字符输入,有延迟)
def human_type(element, text, delay=0.08):
    """模拟人类打字速度,每个字符之间有短暂停顿"""
    for char in text:
        element.send_keys(char)
        time.sleep(delay)

点击元素

python
btn = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
btn.click()

模拟键盘按键

python
from selenium.webdriver.common.keys import Keys

# 按 Enter 键(常用于提交搜索)
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("候鸟浏览器")
search_box.send_keys(Keys.RETURN)

# 全选 + 删除
input_box.send_keys(Keys.CONTROL + "a")  # Ctrl+A
input_box.send_keys(Keys.DELETE)          # Del

下拉框选择

python
from selenium.webdriver.support.ui import Select

# 通过可见文本选择
select = Select(driver.find_element(By.ID, "country"))
select.select_by_visible_text("美国")

# 通过 value 属性选择
select.select_by_value("US")

# 通过序号选择(从 0 开始)
select.select_by_index(2)

鼠标悬停(触发 hover 菜单)

python
from selenium.webdriver.common.action_chains import ActionChains

menu_item = driver.find_element(By.ID, "topMenu")
ActionChains(driver).move_to_element(menu_item).perform()  # 移动鼠标到该元素上

拖拽

python
source = driver.find_element(By.ID, "drag_item")
target = driver.find_element(By.ID, "drop_zone")
ActionChains(driver).drag_and_drop(source, target).perform()

五、获取元素信息

python
el = driver.find_element(By.ID, "user-info")

# 获取可见文本
text = el.text

# 获取指定属性值
href  = el.get_attribute("href")
value = el.get_attribute("value")
cls   = el.get_attribute("class")

# 判断状态
el.is_displayed()   # 元素是否可见
el.is_enabled()     # 元素是否可交互(如按钮是否灰色)
el.is_selected()    # 复选框/单选框是否选中

# 获取 CSS 属性
color = el.value_of_css_property("color")

六、Cookie 操作

候鸟的环境会持久化保存 Cookie,但您也可以通过代码精确操作:

python
# 获取所有 Cookie
all_cookies = driver.get_cookies()
print(all_cookies)

# 添加一个 Cookie(必须先打开该域名的网址)
driver.get("https://example.com")
driver.add_cookie({
    "name": "session_id",
    "value": "abc123",
    "domain": ".example.com"
})

# 删除指定 Cookie
driver.delete_cookie("session_id")

# 删除所有 Cookie
driver.delete_all_cookies()

七、弹窗处理

python
# 等待弹窗出现
wait.until(EC.alert_is_present())

# 获取弹窗对象
alert = driver.switch_to.alert

# 读取弹窗文字
print(alert.text)

# 接受(相当于点"确定")
alert.accept()

# 拒绝(相当于点"取消")
alert.dismiss()

# 在输入框类弹窗中输入内容
alert.send_keys("我的输入")
alert.accept()

八、多标签页 / 多窗口操作

python
# 打开新标签页
driver.switch_to.new_window("tab")

# 获取所有窗口句柄
handles = driver.window_handles
print(f"当前共有 {len(handles)} 个标签页")

# 切换到指定标签页
driver.switch_to.window(handles[-1])   # 切换到最后一个(最新打开的)

# 切换到第一个标签页
driver.switch_to.window(handles[0])

九、iframe 切换

网页中的登录框、广告等有时被放在 iframe 框架里,直接查找元素会找不到,必须先切换进 iframe:

python
# 通过 CSS 选择器切换进 iframe
iframe = driver.find_element(By.CSS_SELECTOR, "iframe#loginFrame")
driver.switch_to.frame(iframe)

# 现在可以操作 iframe 内的元素了
driver.find_element(By.ID, "username").send_keys("my_user")

# 操作完后,切回主页面
driver.switch_to.default_content()

十、截图

python
# 截整个页面
driver.save_screenshot("screenshot.png")

# 截单个元素
element = driver.find_element(By.ID, "product-image")
element.screenshot("product.png")

# 截图并直接返回二进制数据(用于存数据库等场景)
png_bytes = driver.get_screenshot_as_png()

十一、JavaScript 注入(高级技巧)

有些元素"点不到"(被遮挡、被 JS 拦截等),可以直接注入 JS 操控:

python
# 用 JS 强制点击
driver.execute_script("arguments[0].click();", element)

# 滚动到某个元素
driver.execute_script("arguments[0].scrollIntoView();", element)

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# 修改输入框的值(绕过某些只读框)
driver.execute_script("arguments[0].value = '新值';", input_element)

# 从 JS 获取返回值
title = driver.execute_script("return document.title;")

TIP

API 掌握了就可以处理绝大多数场景了!下一章 实战案例库 提供四个可直接套用的完整业务模板。