news 2026/10/11 19:27:14

Selenium实战指南:从环境搭建到网页自动化应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Selenium实战指南:从环境搭建到网页自动化应用

我刚接触Selenium那会儿,还在一个做数据运营的团队里,每天重复打开同一个后台系统,把十几个报表页面挨个点开、截图、核对数据。后来我用一个简单的Python脚本把这些手工操作替换成了自动化流程,下班时间从晚上九点提前到六点半。Selenium这个名字,在测试圈里几乎无人不知,但真正把它用出价值的人,往往不是测试工程师,而是那些每天被网页操作耗掉大量时间的业务人员、数据人员、运维人员。

这篇文章想跟你聊的,不只是“Selenium能做什么”,而是我在几年职场里用它做自动化测试、数据抓取、报表生成这类活儿时沉淀下来的完整经验。包括环境怎么搭、元素怎么定位、网页左右滑动这类看似冷门但实际高频的功能怎么实现、被反爬虫机制挡住时怎么判断和应对,以及踩过的那些坑。不管你是刚接触自动化的小白,还是已经写过脚本但总被各种莫名其妙的问题卡住的老手,这篇文章应该都能给你一些能直接抄作业的答案。

1. 项目内容设计:搞清Selenium到底解决什么问题

1.1 职场里最常撞上的三个场景

先说说我看到的真实情况。很多人学Selenium,是把它当成“测试工具”来学的,但实际工作中它的使用场景远不止测试。第一类场景是手工重复操作,比如每天上班固定要做一遍的流程:登录系统、点开某个菜单、选几个条件、导出Excel、再发邮件。这类活没有任何技术难度,但就是吃时间,漏一步还得返工。第二类场景是回归测试,公司内部系统每次发版,都要把下单、退款、审核这些主流程手工走一遍,费时费力还容易漏测。第三类场景是数据采集,从公开页面上拿结构化数据,比如把商品列表、公告信息、行业数据定期抓下来存成表格。

这三个场景的共同特点是:操作对象是浏览器,操作方式是重复且规则明确的。这类事情恰好是Selenium最擅长干的。它做的事情说白了就是“模拟真人在浏览器里的操作”——点击、输入、拖拽、滚动、等待页面变化,然后再把我们关心的内容读出来。理解到这一层,你就知道为什么它能在职场里这么实用:不是因为它多高级,而是它把“人肉点浏览器”这个动作变成了可重复的脚本。

1.2 为什么是Selenium,而不是别的工具

我经常被问到一个问题:现在有Playwright、Puppeteer,为什么还用Selenium?我的回答是:如果你的团队已经有Python或Java基础,而你的诉求是快速、稳定、易维护,Selenium仍然是性价比最高的选择。Playwright和Puppeteer确实在API设计和速度上有优势,尤其适合前端测试场景,但它们相对较新,遇到偏门问题时的社区答案没有Selenium那么丰富。

Selenium最大的优势在于它的“老”和“广”。它是Web自动化领域的事实标准,支持Python、Java、C#、JavaScript、Ruby这些主流语言,浏览器覆盖Chrome、Firefox、Edge、Safari。这意味着你在一个项目里写的脚本思路,换到另一个语言或浏览器环境时几乎可以平滑迁移。还有一点很关键:Selenium背后的WebDriver协议已经成了W3C标准,很多云测试平台原生支持它,你写的脚本直接就能跑到远程设备上做兼容性验证。

反过来看,requests这种直接发HTTP请求的工具虽然快,但只要目标页面是JavaScript渲染出来的,或者需要处理复杂登录状态,写起来成本就很高。Selenium直接驱动真实浏览器,面对JS渲染、异步加载、动态内容这些情况天然有优势。对这种“宁可慢一点也要稳一点”的职场场景,Selenium是更稳妥的技术选型。

1.3 工具链选型与架构认知

理解Selenium的架构,对排查问题特别有帮助,建议你花五分钟把这张图在脑子里搭起来。Selenium 4的核心模型是:你的代码通过客户端库(比如Python的selenium包)把命令打包成WebDriver协议消息,消息经过驱动(ChromeDriver、GeckoDriver等)转发给真实的浏览器,浏览器执行操作后再把结果原路返回。

驱动这一层就是很多新人容易卡住的地方。Chrome浏览器和ChromeDriver必须是匹配的版本,差一个主版本号都启动不了,报错还不太直观。Selenium 4.6之后内置了Selenium Manager,可以自动下载匹配的驱动,省了不少事,但如果你在公司内网环境或者驱动下载路径受限,还是得手动配置。

另外,Selenium还支持Remote WebDriver和Grid模式,也就是说脚本可以在一台机器上发起,控制远端的浏览器执行。这个架构非常适合团队级的跨浏览器测试。我在实际项目里用的比较多的是本地WebDriver模式,因为脚本跑在服务器上,直接控制服务器里装的浏览器就够了。理解了这套架构,你之后遇到“脚本在本地能跑,服务器上跑不了”这类问题,会更容易定位到是驱动缺失、浏览器版本不一致,还是环境变量不对。

2. 环境准备与安装:从零搭一套可用环境

2.1 快速安装Python与Selenium库

如果你以前没装过,我建议直接用Python官方推荐的venv方式建一个独立环境,不要图省事往系统环境里塞。这样做的目的是隔离依赖,你手头往往不止一个自动化项目,有的依赖selenium 3、有的依赖最新版,放在各自的虚拟环境里才不会互相打架。

python -m venv selenium_env # Windows激活方式: selenium_env\Scripts\activate # macOS / Linux激活方式: source selenium_env/bin/activate pip install selenium

装完之后验证一下版本,确认安装成功:

python -c "import selenium; print(selenium.__version__)"

如果你所在网络环境下载慢,可以用国内镜像源,比如清华源或阿里源,加一个-i参数就能提速。这一步本身很简单,但我见过很多人卡在“import能成功,一启动浏览器就报错”,原因通常是驱动没配对,这就是下一节要说的重点。

2.2 浏览器驱动(WebDriver)的下载与配置

驱动是浏览器和脚本之间的翻译官,没了它,Selenium指令发出去浏览器听不懂。以Chrome为例,你要去ChromeDriver的下载页找到和你Chrome版本完全一致(至少主版本一致)的驱动文件。怎么查Chrome版本?地址栏输入chrome://version就能看到。然后把下载下来的chromedriver放到一个你记得住的目录,或者放进系统PATH里。

Selenium 4.6以上版本内置了Selenium Manager,理论上第一次启动时会自动下载驱动,不用你手动处理。但我在一些企业内网环境里实测,自动下载经常因为网络策略失败,所以手动配置还是必须会的技能。代码里可以用Service指定驱动路径:

from selenium import webdriver from selenium.webdriver.chrome.service import Service service = Service(r"D:\tools\chromedriver.exe") driver = webdriver.Chrome(service=service)

Firefox对应的是GeckoDriver,Edge对应的是MsEdgeDriver,思路完全一样。这里有一个我踩过的坑:不要下载所谓“最新版驱动”就完事,一定要看浏览器主版本号。Chrome升级到120,驱动还在用118,启动报的错是“session not created: This version of ChromeDriver only supports Chrome version 118”,排查了半天才发现是版本不匹配。

2.3 顺带说说Selenium在VBA中的安装思路

热搜词里出现了“selenium vba”,我猜很多人是在Excel里做办公自动化时接触到Selenium的。这种方法确实存在:在Windows上安装SeleniumBasic这个第三方工具包,然后在VBA编辑器里引用它的类型库,就可以用类似New Selenium.ChromeDriver的语法控制浏览器。

Dim driver As New Selenium.ChromeDriver driver.Get "https://example.com" driver.FindElementById("kw").SendKeys "Selenium" driver.Quit

VBA方式的好处是不用装Python环境,Excel里直接跑,适合轻量级的办公场景,比如自动登录网页导数据再填回表格。但它的缺点也很明显:依赖Windows环境、SeleniumBasic更新慢、对现代浏览器的支持有时候跟不上、出问题排查较难。我的建议是:如果只是临时处理一次小批量数据,VBA够用;如果是长期维护的自动化流程,还是迁移到Python更健康,至少在定位器维护和日志排查上会轻松很多。

3. 核心实操:从打开页面到“看得见”的元素操作

3.1 第一个脚本:打开页面并检查元素

先给你一个最小可用的脚本,它做的事情是打开百度首页、打印页面标题、然后退出。别小看这个例子,它能帮你验证环境是否OK,同时理解Selenium生命周期。

from selenium import webdriver driver = webdriver.Chrome() try: driver.get("https://www.baidu.com") print(driver.title) finally: driver.quit()

这里有几个细节。第一,driver.get()会等待页面“开始加载”完成,但不等异步内容全部渲染,所以后面经常要配合等待机制;第二,driver.title拿到的是当前浏览器标签页的标题,如果页面很长或者有iframe嵌套,标题依然是最简单可靠的“页面是否切对”的判断依据;第三,driver.quit()会关闭浏览器并释放进程,而很多人图省事用driver.close(),只能关当前标签页,一旦脚本异常退出,Chrome进程会残留在后台,下次跑就积累一堆僵尸进程。所以能用quit就别用close。

3.2 元素定位:八种定位方式与优先顺序

Selenium提供了八种定位元素的方式:ID、Name、Class Name、Tag Name、XPath、CSS Selector、Link Text、Partial Link Text。我平时用得最多的是ID、CSS Selector和XPath,三者的优先级大概是:有稳定的ID首选ID,没有就写CSS,CSS写不了再上XPath。

为什么是这个顺序?ID选择器在HTML里是最精确定位的方式,一个页面里ID理论上唯一,脚本最简洁。CSS Selector的好处是语法简洁、浏览器原生支持,比如#login-btn、.btn-primary、input[name="username"],一眼能看懂。XPath功能最强,可以按文本内容定位,比如“找页面里文字是‘确认’的按钮”,但XPath在有些情况下解析慢,而且写复杂了可读性差。

# 通过CSS Selector定位 driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin") driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys("123456") # 通过XPath按文本定位 button = driver.find_element(By.XPATH, "//button[contains(text(),'确认')]") button.click()

定位元素最常见的坑有两个:一是动态ID,每次刷新页面ID后面的数字都变,比如order-12345,这时候要用CSS属性匹配或XPath的starts-with来解决;二是页面上同时存在多个匹配元素,find_element默认返回第一个,如果你要第二个或某个特定顺序的元素,需要用find_elements拿列表再过滤,或者用XPath的索引。我用XPath的习惯是优先配合contains和位置关系写,这样即使属性微调也不至于全军覆没。

3.3 网页左右滑动与元素滚动的完整实现

热搜词里好几个都跟“网页左右滑动”相关,这个确实比纵向滚动更容易让人懵。先说一个最常见的操作场景:页面内容一开始只在可视区域渲染,你往下滚到某个位置时,懒加载机制才把图片列表或表格数据拉出来。这时候如果不滚动,find_element就算定位到了那个元素,也可能拿不到数据。

滚动操作在Selenium里通常是通过execute_script执行JavaScript来实现,因为Selenium自己的API里没有直接提供“滚动到某个坐标”的专用方法。纵向滚动大家比较熟悉,我重点说说左右滚动。

# 纵向滚动到底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") # 横向滚动:向右滚动500像素 driver.execute_script("window.scrollBy(500, 0)") # 横向滚动:滚动到最右侧 driver.execute_script("window.scrollTo(document.body.scrollWidth, 0)") # 滚动到某个元素可见(同时适用于左右和上下滚动) target = driver.find_element(By.CSS_SELECTOR, ".product-item:last-child") driver.execute_script("arguments[0].scrollIntoView(true);", target)

为什么有时候左右滚动不好使?第一,横向滚动条不在window上,而是在某个内部容器div上,你要先定位到这个容器元素,然后对它的scrollLeft属性做修改,而不是用window.scrollTo。第二,页面本身没有横向溢出,却需求里写的是“左右滑动轮播图”,这时候你要操作的往往是轮播组件的“下一张”按钮,或者是通过触摸手势事件模拟,单纯滚动并不能切换。第三,使用了scrollIntoView之后,浏览器可能会把元素对齐到页面最左侧,导致原本在右侧的横向位置跑到中间,需要配合inline: 'center'参数做微调。

我实际处理过的一个场景是财务系统里的横向宽表格,数据列特别多,右侧有几列金额要截图。最初的思路是循环window.scrollBy(300, 0),结果怎么滚都滚不到底。后来用浏览器开发者工具检查发现,横向滚动条在.table-wrap这个div上,于是改成:

table_wrap = driver.find_element(By.CSS_SELECTOR, ".table-wrap") driver.execute_script("arguments[0].scrollLeft = arguments[0].scrollWidth;", table_wrap)

一次性到位,数据列完整露出来。所以遇到滚动问题,先搞清楚滚动容器是谁、滚动条挂在哪,比盲目执行脚本重要得多。

3.4 等待机制:显式等待、隐式等待与强制等待

要说Selenium里最容易让新手崩溃的问题,“元素还没加载完就在操作”绝对排第一。很多人第一反应是time.sleep(5),硬等几秒再继续。这种做法不是不能用,但问题在于:网页加载速度波动很大,固定等5秒,本地网络快时浪费时间,真慢起来可能等10秒还是不够。

正确的做法是使用显式等待,核心逻辑是:每隔一定时间检查一次条件是否满足,满足就继续,不满足一直等到超时为止。我在项目里最常用的写法是这样:

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#submit-btn")) ) element.click()

WebDriverWait(driver, 10)表示最多等10秒,每500毫秒默认轮询一次,until里的条件一旦成立就立刻返回。常用的条件包括:element_to_be_clickable、presence_of_element_located、visibility_of_element_located、frame_to_be_available_and_switch_to_it。这些覆盖了绝大多数“等页面元素”的需求。

隐式等待则是在webdriver实例上设置的全局等待,意味着每次find_element找不到元素时都会轮询等待一段时间。它写起来省事,但坑在于它只对find_element生效,对元素是否可见、是否可点击无能为力,所以我会把隐式等待作为兜底,显式等待作为主角。强制time.sleep尽量用在“动画播完才能点”这种条件不好表达的场景,而且时间控制在1到2秒以内,别一上来就5秒起步。

4. 反爬虫场景下的安全用法与实战应对

4.1 网站为什么会识别Selenium

聊到Selenium,很难不碰到“反爬虫”这个词。先明确一个前提:Selenium本身只是自动化测试工具,它驱动的是真实浏览器,理论上和真人操作没有本质区别,但网站仍然可以通过浏览器暴露出来的一些自动化特征来判断访问者到底是人还是脚本。最典型的就是JavaScript里的navigator.webdriver属性,在Selenium控制的浏览器里这个值默认是true,而正常浏览器是undefined或false。

除了这个显眼的标记,网站还会观察鼠标轨迹、键盘输入间隔、页面滚动节奏、请求频率这些行为特征。自动化脚本的行为通常过于匀速和机械,比如鼠标每秒固定移动几像素,点击位置总是同一坐标,这类模式容易被风控系统识别。所以你在做自动化测试时如果发现页面提示“当前环境异常”或要求“滑块验证”,不一定是定位写错了,而是你是被当成了机器人在访问。

4.2 降低识别风险的常用配置

在合规的自动化测试场景下,降低被误伤的几率是完全合理的需求。比如你自己公司的系统已经接入了Web应用防火墙,测试环境没有放行自动化流量,你需要让测试脚本更接近真实浏览器行为来跑通流程,这时候有一些配置可以试。

from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=options) # 进入页面后额外执行一段JS,把webdriver标记覆盖掉 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" })

这段代码的作用是在每次新文档加载前,把navigator.webdriver这个属性重写成undefined。实测下来能在不少场景里把自动化特征掩盖掉。另一个实用技巧是加载本地的浏览器Profile目录,这样浏览器登录态、Cookie、本地存储都是连续的,更贴近真实用户。用这种方式,即使你的脚本需要登录,也能省去每次登录的二次验证步骤。

options.add_argument(r"--user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data")

但要注意:加载真实Profile目录时浏览器会提示“请关闭已打开的Chrome”,所以实际使用中通常是复制一个独立的Profile副本给脚本用,避免冲突。

4.3 关于反爬虫边界的职场判断

这部分我在实际工作里吃过亏,想多说几句。接到需求方说“帮我爬一下某某网站”,先别急着动手。你要做的第一件事,是判断数据来源是否允许自动化采集:查看目标网站的robots.txt,阅读服务条款中关于数据爬取的条款,确认采集范围、采集频率、用途是否合规。如果是内部系统,确认是否有授权访问。如果是公开数据,也尽量控制访问频率,避免对对方服务器造成压力。

我的经验是:职场里的专业表现,恰恰体现在“知道什么不能做”上。一些场景下,与其写Selenium去硬突破,不如走正规API通道,或者与对方沟通获取数据授权。拿公司内部系统举例,你用自己的账号做自动化测试没问题,但用脚本去批量导出超出权限范围的数据,性质就变了。所以这项技术我强调的是边界意识:把自动化用在提升效率上,而不是绕过规则上。

5. 常见问题与排查技巧实录

5.1 元素找不到的典型原因与排查顺序

我在群里看到一个求助特别典型:脚本跑得好好的,换了一天再跑,突然在find_element那行报NoSuchElementException。他排查了两个小时,最后发现是页面前天晚上更新,按钮的CSS类名从btn-primary改成了btn-confirm。这看起来是个小问题,但它背后的逻辑很重要:页面结构变,定位器跟着变,这是Selenium自动化维护成本的大头。

遇到元素找不到,我建议按这个顺序排查:

  1. 等待是否足够:先用显式等待试一下,是不是元素加载慢。
  2. 是否在iframe或新标签页里:如果用find_element找不到内容,切换到iframe里再找。
  3. 选择器是否过期:打开浏览器开发者工具,重新复制一下元素属性。
  4. 选择器是否唯一:在Console执行$$('你的选择器')看看匹配了几个。
  5. 页面是否存在遮挡层:比如有个透明遮罩盖住了按钮,能定位但点击报错。

第5条经常被忽略。很多点击失败不是找不到元素,而是元素被一个透明的浮层盖住,element.click()执行了但点的是浮层。解决办法是等浮层消失再点,或者直接用JavaScript强制点击:

driver.execute_script("arguments[0].click();", button)

这种强制点击能解决大部分“可见不可点”的问题,但也要慎用,因为跳过了用户操作的合法性检查。

5.2 滚动加载场景下的数据抓取坑

无限滚动页面是另一个高频坑。页面一开始只渲染前10条数据,往下一滚又加载10条,再滚再加载,你如果只抓第一次find_elements的结果,拿到的数据永远不完整。

我的方案是用循环滚动加条件判断:

from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC previous_count = 0 while True: items = driver.find_elements(By.CSS_SELECTOR, ".item") current_count = len(items) if current_count == previous_count: break # 滚动后数量没变化,说明到底了 previous_count = current_count driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") WebDriverWait(driver, 5).until( lambda d: len(d.find_elements(By.CSS_SELECTOR, ".item")) > current_count )

这个循环的核心是“每滚动一次,验证数据量有没有增加,没有增加就停止”。比单纯固定滚10次更可靠。如果遇到页面加载慢导致滚动后数量长时间不更新,可以在until里加超时再强制滚动一次,重试到数据不再变化为止。数据全部加载完之后,再统一用find_elements二次解析,避免每滚一次解析一次浪费性能。

5.3 弹窗、新标签页、iframe处理

弹窗处理分为两种。一种是浏览器原生对话框,包括alert、confirm和prompt,这种用driver.switch_to.alert处理,点击接受或取消:

alert = driver.switch_to.alert print(alert.text) alert.accept()

另一种是页面内弹出的“活动弹窗”,本质还是普通HTML元素,直接定位关闭按钮点击就行。比较麻烦的是某些弹窗出现时间不确定,我习惯先把关闭按钮用显式等待等出来,再点击,不然脚本很容易在等下一条操作时被弹窗挡住了。

新标签页的处理同样常见。点击一个链接打开了新的标签页,但Selenium默认还停留在原来的标签页上,你要先拿到所有句柄再切换:

main_handle = driver.current_window_handle # 触发打开新标签页的操作... handles = driver.window_handles for h in handles: if h != main_handle: driver.switch_to.window(h) break

iframe就更隐蔽了。很多时候你要找的元素并不在主文档里,而是在iframe内嵌的文档里。直接find_element永远找不到,必须先切进去:

driver.switch_to.frame("iframe的id或name") # 在iframe里操作完成后 driver.switch_to.default_content()

我踩过最深的一次坑是:两层iframe嵌套,切进一层之后继续切另一层,操作完要一层层切回来,顺序错了就全部找不着。后来我把所有iframe的位置写到注释里,下次调试省事很多。

5.4 性能与稳定性优化建议

脚本写完能跑只是第一步,能稳定跑一个月才是职场里的真功夫。我手里维护的几个自动化脚本,运行频率是一天跑一次,最怕就是早上到公司发现昨晚任务挂了,白白错过报表。稳定性要靠几个习惯撑起来。

第一,尽量使用无头模式。options.add_argument("--headless")可以让浏览器在后台运行,不弹窗、不占屏幕,服务器上部署也友好。但要注意,有些网站在无头模式下的行为不同,元素加载策略可能会变,所以我会在本地用有头模式调通,部署时再切无头。

第二,所有浏览器实例都要放在try/finally里,确保异常时driver.quit()还能执行。最好再加一层重试机制,比如遇到超时异常时重新启动浏览器再来一次,能消掉很多偶发问题。我写过一个小工具函数,超过两次重试才真正报错,并且每次异常时自动截图存档,排查问题事半功倍。

第三,给脚本加日志。日志级别不用太复杂,能记录“什么时间、做了什么操作、结果是什么”就行。我见过太多同事说脚本“莫名失败”,一问连日志都没有,只能靠猜。加上日志之后,很多问题看一眼就能定位。

6. 项目落地与职场经验小结

6.1 把脚本组织成可维护的小项目

写自动化脚本最容易陷入“一盘散沙”的境地:所有的定位器和业务逻辑挤在一个200行的文件里,两周后自己都不想再看。哪怕只是一个内部小工具,我也建议把代码按照套路拆分。

我的习惯目录结构是:config放配置(URL、账号、等待超时这些),utils放公共函数(启动浏览器、重试、截图、日志),locators放元素定位器(所有的CSS/XPath都收在这里),cases放具体的业务流程脚本。不要先追求什么框架设计,先把这三件事做出来就够了:定位器不散落在业务代码里、业务步骤清晰可读、有统一的日志和截图方法。

写代码时还有一个建议:元素定位器尽量用By.CSS_SELECTOR而不是By.XPATH,因为CSS Selector可读性更好,改起来更直观。定位器上面写注释,标注“这是登录页的账号输入框,页面更新时重点检查这里的类名变化”。组里接手你脚本的人会感激你的。

6.2 工作计划与排错路径

如果你准备在职场里推一个自动化项目,我的建议是不要一上来就承诺“全部自动化”,而是先选一个最痛、最重复、耗时长且出错率高的场景切入。比如我之前做的一个数据报表自动化:原先人力操作每天大概40分钟,脚本写好后每天自动跑,耗时5分钟,人力完全释放。前期的调研和时间估算大概是:确定需求和页面结构1天、写脚本2天、调试各种边界条件2天,加上试运行一周观察稳定性,总共差不多两周时间。

这个投入产出是非常划算的,但前提是你得在需求阶段跟业务方对齐“自动化的边界”。比如遇到验证码、需要人工审核的环节,脚本能停住并报警等待人工处理,而不是瞎尝试把账号封了。这个“人工介入点”的设计,是职场自动化项目里最容易被忽略也最重要的部分。做得好,脚本是一个可靠的助手;做不好,脚本是一个定时炸弹。

6.3 个人体会与扩展建议

最后说一点个人体会。我见过很多人在Selenium的学习上用错了力气,上来就研究各种复杂框架、高深的设计模式,结果连最基本的“打开页面、等元素、点按钮”都写得磕磕绊绊。我的建议是:先拿一个真实项目练手,从最痛苦的重复工作开始,把几件小事做扎实——环境搭建、定位器、显式等待、滚动容器判断、异常重试。这五件事做好,已经能覆盖大部分日常自动化需求。

如果还想往深走,建议研究这几个方向:一是熟练使用execute_script,掌握JavaScript会让你的滚动、点击、取值能力上升一个台阶;二是了解Selenium Grid,以后做多浏览器兼容测试用得上;三是学一点浏览器开发者工具的使用,特别是Network面板和Elements面板,排查问题的速度会快很多。与此同时,Playwright这类新工具也可以保持关注,它确实在某些场景下更好用,但把Selenium吃透再横向迁移,你会觉得其他工具上手都很快。

我在实际操作中一直有一个习惯:每次脚本写完,先跑三遍,看稳定性,再删掉所有调试用的print和sleep,最后补上日志和异常截图。这套流程看起来琐碎,但正是这些琐碎让脚本从“能跑”变成了“靠得住”。如果你也想在职场里用Selenium做点实际的事,我的建议是从最痛的那件重复事开始,先跑通,再优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 19:24:58

红外海洋船只检测数据集:8402张VOC+YOLO双格式7类目标实战指南

简介:这份红外海洋船只检测数据集面向从事目标检测算法研究、遥感图像分析及海上智能监控开发的工程师与研究生,提供可直接用于模型训练与验证的标注数据。数据集同时包含Pascal VOC与YOLO两种标注格式,图片与标注一一对应,省去格…

作者头像 李华
网站建设 2026/10/11 19:24:13

SpringBoot众筹平台全栈实战:前后台管理系统从立项到跑通

简介:这是一套基于SpringBoot开发的众筹平台前后台管理系统完整源码,面向计算机相关专业学生与缺乏实战经验的初级开发者,可用于课程设计、毕业设计参考或项目练习。系统功能覆盖前台用户注册登录、发起众筹、支持项目、个人中心,…

作者头像 李华
网站建设 2026/10/11 19:22:15

隧道智能照明:如何实现按需调光、节能又安全

一、行业背景:隧道照明的两难问题隧道作为交通基础设施,照明系统承担着保障行车安全的核心职能,同时也面临突出的能耗问题。隧道通常需要长时间、大范围照明,若长期满负荷恒亮运行,电能消耗十分可观;而照明…

作者头像 李华
网站建设 2026/10/11 19:21:00

微波技术基础简答题整理:传输线、波导与S参数考点速背

简介:微波技术基础简答题整理是一份面向微波技术课程学习者与期末备考学生的docx文档,聚焦传输线理论、微波传输线、微波集成传输线等章节常见考点,以问答形式梳理核心概念,方便快速复习与查漏补缺。资源仅含1个docx文件&#xff…

作者头像 李华
网站建设 2026/10/11 19:17:37

显示异常80%可定位:四层链路诊断法实战指南

1. 项目概述:为什么这套定位方法论能覆盖80%的显示异常问题屏幕黑屏、花屏、闪屏——这三个词几乎每天都在各类技术论坛、售后工单和用户群聊里高频出现。我做过一个粗略统计:在某高校实验室近三年收集的217份显示类故障报告中,这三类问题合计…

作者头像 李华
网站建设 2026/10/11 19:16:57

Turbo Intruder并发原理与实战:从安装到接口批量测试

第一次用Burp自带的Intruder跑一批接口参数时,发到2000多个请求,界面就开始卡顿,结果区滚动都费劲。后来换成Turbo Intruder做同样的并发重放,几万条请求跑下来界面基本不卡,速率还能继续往上提,这才意识到…

作者头像 李华