4、页面交互操作:点击、输入、下拉选择、复选框、文件上传、键盘操作

好,咱们进入正题。页面交互,说白了就是模拟真实用户去操作浏览器。你想想看,一个电商运营每天要重复多少机械动作?点商品、填表单、选规格、传图片……这些活儿,交给自动化脚本干,它不香吗?

我个人习惯把交互操作分成六大类:点击、输入、下拉选择、复选框、文件上传、键盘操作。这六样玩熟了,90%的页面你都能搞定。下面我一个一个拆开讲。

4.1 点击操作:最基础也最坑

点击,听起来简单吧?element.click() 一行代码的事。但我在项目中遇到过一个问题——明明元素定位到了,点击就是没反应。后来发现,页面有个遮罩层挡住了按钮。

所以我的建议是:点击之前,先确认元素是否可见、是否可点击。用 WebDriverWait 配合 expected_conditions 来等,别硬点。

核心方法:

  • element.click() —— 普通点击
  • element.submit() —— 提交表单(相当于按回车)
  • ActionChains(driver).click(element).perform() —— 高级点击,适合需要鼠标悬停的场景
# 我常用的安全点击写法
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
btn = wait.until(EC.element_to_be_clickable((By.ID, "submit-btn")))
btn.click()

小技巧:如果普通点击失效,试试 driver.execute_script("arguments[0].click();", element)。这是用 JavaScript 强制点击,绕过一些前端框架的拦截。

4.2 输入操作:别忘清空

输入框操作,核心就两个动作:清空 + 输入。你可能会想,直接 send_keys("内容") 不就行了?嗯,这里要注意——如果输入框里已经有默认值,不清空的话,新内容会直接追加在后面。

我曾经踩过这个坑:给商品标题输入框填内容,结果每次运行脚本,标题都变成了「原标题新标题新标题」……后来养成了习惯,输入前先 clear()

# 标准输入流程
input_box = driver.find_element(By.NAME, "keyword")
input_box.clear()  # 先清空
input_box.send_keys("夏季连衣裙")  # 再输入

注意:有些输入框有输入长度限制,或者只允许数字。建议输入前先看看元素的 maxlength 属性,避免数据被截断。

4.3 下拉选择:三种方式随你挑

下拉选择框,在电商后台太常见了——选商品分类、选发货地区、选活动类型……Selenium 专门提供了 Select 类来处理。

我个人习惯用 select_by_visible_text(),因为肉眼看到什么就选什么,代码可读性高。但如果你要处理动态加载的下拉框,那就得用 select_by_value() 了。

方法 适用场景 示例
select_by_index(index) 选项顺序固定 select.select_by_index(2)
select_by_value(value) 选项有唯一 value 属性 select.select_by_value("10")
select_by_visible_text(text) 选项文本可见且唯一 select.select_by_visible_text("女装")
from selenium.webdriver.support.ui import Select

# 定位到 select 元素
category_select = driver.find_element(By.ID, "category")
select = Select(category_select)

# 三种方式任选
select.select_by_visible_text("女装/女士精品")
# 或者
select.select_by_value("1001")
# 或者
select.select_by_index(3)

避坑指南:有些下拉框不是原生的 <select> 标签,而是用 <ul> + <li> 模拟的。这时候 Select 类用不了,你得手动点击下拉框,再点击对应的 <li> 元素。

4.4 复选框:先判断再操作

复选框操作,核心就一句话:先判断状态,再决定是否点击。你想想看,如果复选框已经勾选了,你再点一下,反而取消了。

我记得有一次写自动化脚本,批量勾选商品参加活动。结果因为没判断状态,脚本把已经参加活动的商品又取消勾选了……运营同事差点没把我骂死。

checkbox = driver.find_element(By.NAME, "agree")

# 判断是否已选中
if not checkbox.is_selected():
    checkbox.click()
    print("已勾选")
else:
    print("已经是选中状态,跳过")

批量操作技巧:find_elements 找到所有复选框,然后遍历处理。比如全选、反选、按条件勾选。

4.5 文件上传:两种路子

文件上传,电商运营的日常——传商品图、传详情页、传活动海报……Selenium 处理文件上传有两种方式。

方式一:如果上传按钮是 <input type="file">,直接 send_keys("文件路径") 就行。这是最简单的方式,我90%的情况都用它。

方式二:如果上传按钮是自定义的(比如用 JavaScript 调起的),那就得借助第三方工具了,比如 pyautogui 或者 AutoIt。嗯,这条路比较折腾,我建议能不用就不用。

# 方式一:原生 input 上传
upload_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
upload_input.send_keys("C:\\Users\\admin\\Pictures\\product.jpg")

# 方式二:非原生上传(用 pyautogui)
import pyautogui
import time

driver.find_element(By.ID, "upload-btn").click()
time.sleep(1)  # 等待文件选择窗口弹出
pyautogui.write("C:\\Users\\admin\\Pictures\\product.jpg")
pyautogui.press("enter")

注意:文件路径建议用绝对路径,或者用 os.path.abspath() 转一下。相对路径有时候会找不到文件,尤其是跨平台运行时。

4.6 键盘操作:模拟快捷键

键盘操作,说白了就是模拟你按键盘的动作。Selenium 的 ActionChains 类提供了 key_downkey_up 方法,可以模拟组合键。

我个人最常用的场景是:Ctrl+A 全选Ctrl+C 复制Ctrl+V 粘贴。比如在富文本编辑器里填商品详情,用键盘操作比逐字输入快多了。

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

# 模拟 Ctrl+A 全选
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()

# 模拟 Tab 键切换焦点
element.send_keys(Keys.TAB)

# 模拟回车
element.send_keys(Keys.ENTER)

小技巧:如果你要输入大量文本,别用 send_keys 一个字一个字地敲。试试用 JavaScript 直接设置 value 属性,速度能快几十倍。

# 用 JavaScript 快速填充文本
text = "这是一段很长的商品描述……"
driver.execute_script("arguments[0].value = arguments[1];", textarea_element, text)

小结

好了,页面交互操作就讲这么多。你发现没有?这六类操作其实都有套路:先定位,再判断,最后操作。定位用 find_element,判断用 is_selected()is_enabled(),操作就是 click()send_keys() 这些。

下一章咱们聊聊「等待机制」,这可是自动化脚本稳定性的关键。你想想看,如果页面还没加载完你就去点按钮,那肯定报错。怎么优雅地等?到时候细说。