3、Selenium基础入门:Selenium简介、WebDriver核心概念、第一个自动化脚本、元素定位方法(ID、Name、Class Name)

3.1 什么是Selenium?

Selenium,说白了就是一套让浏览器听你话的工具集。它不是一个单一的工具,而是一套生态。我刚开始接触自动化测试时,第一个接触的就是它。为什么?因为它是开源的,社区活跃,而且支持几乎所有主流浏览器。

Selenium的核心能力是什么?模拟用户操作。你手动能做的,它都能做:点击、输入、滚动、截图。你手动做不了的,它也能做:比如同时打开100个页面,或者凌晨三点自动跑测试。

它主要由三个组件构成:

  • Selenium WebDriver:核心中的核心,直接操控浏览器
  • Selenium IDE:一个浏览器插件,可以录制回放操作
  • Selenium Grid:分布式测试,让脚本在多台机器上并行跑

我个人习惯,90%的时间都在和WebDriver打交道。IDE适合快速原型验证,Grid则是大项目必备。但入门阶段,你只需要关注WebDriver就够了。

一句话总结:Selenium = 浏览器遥控器。你写代码,它帮你按按钮。

3.2 WebDriver核心概念

WebDriver是什么?它是一个接口,一个协议。它定义了你和浏览器之间的通信方式。你通过WebDriver告诉浏览器:「去打开这个网址」、「找到那个按钮」、「点它一下」。

这里有个关键点:WebDriver不是直接操作浏览器的DOM,而是通过浏览器的原生支持来驱动。这意味着它更接近真实用户的操作行为。我在项目中遇到过有人问:「为什么Selenium比模拟HTTP请求更靠谱?」答案就在这里——它模拟的是真实用户行为,不是伪造数据包。

核心概念就三个:

  1. Driver实例:每个浏览器对应一个Driver。Chrome用ChromeDriver,Firefox用GeckoDriver。你启动一个Driver,就相当于打开了一个浏览器窗口。
  2. 会话(Session):Driver实例和浏览器之间建立了一个会话。这个会话里,你做的所有操作都是有状态的。关闭会话,浏览器就关了。
  3. 定位策略:怎么告诉WebDriver你要操作哪个元素?通过定位器(Locator)。ID、Name、Class Name、XPath、CSS Selector……这些都是定位策略。

我的建议:刚开始学,别贪多。先把ID、Name、Class Name这三种定位方法吃透。它们覆盖了80%以上的场景。剩下的XPath和CSS,后面再补。

3.3 第一个自动化脚本

光说不练假把式。我们直接写一个能跑的脚本。假设你已经装好了Python和Selenium库,也下载了对应浏览器的Driver。

嗯,这里要注意:Driver的版本必须和浏览器版本匹配。我曾经因为Chrome自动更新了,Driver没跟上,排查了半天。后来学乖了,每次跑脚本前先检查版本。

来看代码:

from selenium import webdriver
from selenium.webdriver.common.by import By

# 1. 启动浏览器
driver = webdriver.Chrome()

# 2. 打开网页
driver.get("https://www.baidu.com")

# 3. 找到搜索框,输入关键词
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium入门")

# 4. 找到搜索按钮,点击
search_button = driver.find_element(By.ID, "su")
search_button.click()

# 5. 等待几秒,看看结果
import time
time.sleep(3)

# 6. 关闭浏览器
driver.quit()

这个脚本做了什么?你想想看:

  • 第1步:打开Chrome浏览器
  • 第2步:访问百度首页
  • 第3步:找到ID为"kw"的输入框,输入「Selenium入门」
  • 第4步:找到ID为"su"的按钮,点击搜索
  • 第5步:等3秒,让你看到搜索结果
  • 第6步:关闭浏览器,清理资源

就这么简单。你手动操作一遍需要5秒,脚本跑起来也是5秒。但脚本可以重复跑一万次,不会累,不会出错。

避坑指南:我曾经犯过一个低级错误——忘记调用driver.quit()。结果跑完脚本,浏览器窗口没关,内存被吃光了。记住:每次用完Driver,一定要关掉它。可以用try...finally或者with语句来确保资源释放。

3.4 元素定位方法:ID、Name、Class Name

自动化测试的核心是什么?找到元素,操作元素。找元素的方法,就是定位策略。今天先讲三个最基础的。

3.4.1 ID定位

ID是元素的唯一标识。在HTML规范里,一个页面中每个ID只能出现一次。所以用ID定位是最快、最稳定的方法。

# 通过ID定位
element = driver.find_element(By.ID, "username")
element.send_keys("admin")

什么时候用ID?只要元素有ID,优先用ID。我在项目中定过一个规矩:开发同学给关键元素加上ID,测试同学优先用ID定位。这样双方都省心。

3.4.2 Name定位

Name属性在表单中很常见。它不像ID那样要求唯一,但通常也是唯一的。如果元素没有ID,Name是第二选择。

# 通过Name定位
element = driver.find_element(By.NAME, "password")
element.send_keys("123456")

注意:Name定位返回的是第一个匹配的元素。如果页面中有多个同名元素,你只能拿到第一个。这时候就需要更精确的定位方法了。

3.4.3 Class Name定位

Class Name用于CSS样式,一个元素可以有多个class。用Class Name定位时,通常选择最具体、最独特的那个class。

# 通过Class Name定位
element = driver.find_element(By.CLASS_NAME, "btn-submit")
element.click()

这里有个坑:如果class名包含空格,比如"btn btn-primary",你不能直接传整个字符串。因为空格在class里表示多个class。你需要选择其中一个,或者用CSS Selector来处理。

三种方法对比:

定位方法 速度 唯一性 推荐场景
ID 最快 保证唯一 有ID时首选
Name 较快 通常唯一 表单元素
Class Name 较快 可能重复 样式类定位

3.5 实战小练习

光看不动手,等于白学。我给你留个小任务:

  1. 打开任意一个你常用的网站(比如知乎、豆瓣)
  2. 用浏览器的开发者工具(F12)查看页面元素
  3. 找到三个不同的元素,分别用ID、Name、Class Name定位
  4. 写一个脚本,依次操作这三个元素

为什么要做这个练习?因为只有亲手写过代码,你才会真正理解「定位」是什么意思。我记得自己第一次写自动化脚本时,光找元素就花了半小时。但找到之后,那种成就感是无可替代的。

小技巧:在浏览器控制台里,可以用$("#id")快速验证ID是否存在,用$(".class")验证class。这比反复跑脚本快多了。

3.6 本章小结

这一章我们讲了:

  • Selenium是什么——浏览器遥控器
  • WebDriver的核心概念——Driver、会话、定位策略
  • 第一个自动化脚本——打开浏览器、操作元素、关闭浏览器
  • 三种基础定位方法——ID、Name、Class Name

下一章,我们会深入更多定位方法,包括XPath和CSS Selector。这两个才是真正的利器,能搞定99%的定位难题。但今天,先把基础打牢。你想想看,如果连ID定位都写不对,后面学再多也是空中楼阁。

好了,去写你的第一个自动化脚本吧。遇到问题别怕,调试是测试工程师的日常。我当年也是一行一行代码试过来的。