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请求更靠谱?」答案就在这里——它模拟的是真实用户行为,不是伪造数据包。
核心概念就三个:
- Driver实例:每个浏览器对应一个Driver。Chrome用ChromeDriver,Firefox用GeckoDriver。你启动一个Driver,就相当于打开了一个浏览器窗口。
- 会话(Session):Driver实例和浏览器之间建立了一个会话。这个会话里,你做的所有操作都是有状态的。关闭会话,浏览器就关了。
- 定位策略:怎么告诉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 实战小练习
光看不动手,等于白学。我给你留个小任务:
- 打开任意一个你常用的网站(比如知乎、豆瓣)
- 用浏览器的开发者工具(F12)查看页面元素
- 找到三个不同的元素,分别用ID、Name、Class Name定位
- 写一个脚本,依次操作这三个元素
为什么要做这个练习?因为只有亲手写过代码,你才会真正理解「定位」是什么意思。我记得自己第一次写自动化脚本时,光找元素就花了半小时。但找到之后,那种成就感是无可替代的。
小技巧:在浏览器控制台里,可以用$("#id")快速验证ID是否存在,用$(".class")验证class。这比反复跑脚本快多了。
3.6 本章小结
这一章我们讲了:
- Selenium是什么——浏览器遥控器
- WebDriver的核心概念——Driver、会话、定位策略
- 第一个自动化脚本——打开浏览器、操作元素、关闭浏览器
- 三种基础定位方法——ID、Name、Class Name
下一章,我们会深入更多定位方法,包括XPath和CSS Selector。这两个才是真正的利器,能搞定99%的定位难题。但今天,先把基础打牢。你想想看,如果连ID定位都写不对,后面学再多也是空中楼阁。
好了,去写你的第一个自动化脚本吧。遇到问题别怕,调试是测试工程师的日常。我当年也是一行一行代码试过来的。