免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Selenium浏览器自动化测试实战:从环境搭建到元素定位与等待策略

Selenium浏览器自动化测试实战:从环境搭建到元素定位与等待策略 我最早接触Selenium是刚做测试那一两年天天被重复性的回归用例搞得头皮发麻。那时候不知道自动化能解决多少问题只知道点来点去的手工操作费时间、费精力还容易漏测。后来一个前辈把一套Selenium脚本丢给我让我自己跑一遍我才意识到原来浏览器里那些重复劳动是可以交给代码去做的。从那以后Selenium就成了我工作里离不开的工具不管是做功能测试、爬取页面数据还是定时批量跑单据它都能帮上忙。这篇文章我打算用自己做项目的经验把Selenium浏览器自动化测试框架从环境搭建到实战细节完整捋一遍重点讲安装步骤、元素定位、等待策略以及那些文档里不写、但实际特别坑的问题。不管你是在校生、刚入行的测试新人还是想用脚本解决重复操作的开发应该都能从这里找到能直接拿去用的东西。1. Selenium到底是个什么东西它解决了什么问题1.1 理解Selenium的核心定位Selenium不是某个单独的软件而是一套浏览器自动化的工具集。它做的事情本质上是模拟真实用户去操作浏览器打开网页、点击按钮、填写表单、滚动页面、切换标签页、截图等等。它之所以在测试领域被广泛使用是因为它直接驱动真实浏览器而不是像有些工具那样去模拟HTTP请求或解析HTML。这意味着你看到的是什么Selenium操作的就是什么JS渲染出来的动态内容也完全不会漏掉。很多人刚开始学的时候容易混淆一个概念Selenium和那些抓包工具、接口测试工具不是一回事。抓包工具看的是网络请求接口测试工具直接发请求校验响应而Selenium是完整地调动浏览器内核让页面在自己的环境里跑起来。它适合的是端到端的场景比如用户从登录到下单到支付的完整链路能不能走通表单项联动、弹窗提示、前端校验这类交互逻辑是否有问题。理解这一点你才能判断什么时候该用它什么时候用其他工具反而更合适。1.2 为什么选择Selenium而不是其他自动化方案业界做浏览器自动化的方案其实不少但Selenium能活这么多年背后是有原因的。首先它完全开源免费没有授权费用的门槛中小团队和个人开发者都负担得起。其次是跨语言支持Java、Python、C#、JavaScript、Ruby都能写Selenium脚本团队用什么语言不耽误引入这套工具。去年我在一个项目里就同时见过Java和Python两套Selenium代码维护起来也没那么割裂。还有一个不可忽略的优势是跨浏览器。Selenium通过各浏览器厂商提供的WebDriver与浏览器通信Chrome有ChromeDriverFirefox有GeckoDriverEdge也有自己的Driver。同一套用例换一个浏览器配置就能跑兼容性测试这是很多商业工具很难做到的。和新一代的Playwright、Cypress相比Selenium虽然有些地方略显繁琐但它在老项目、多语言环境、以及浏览器兼容性测试方面的积累目前依然很难被完全替代。1.3 谁适合学习Selenium它能给你带来什么如果你是测试工程师那Selenium基本是进阶必需技能。掌握它之后回归测试、冒烟测试这些重复动作可以交给脚本你就有精力去设计更复杂的用例、做更深层的质量分析。如果你是做开发的Selenium也能写一些辅助脚本比如批量填报表、定时抓取数据、自动检查线上页面是否正常。甚至有人拿它做爬虫工具专门处理那些动态渲染、Ajax加载的站点这也是个很现实的使用场景。同时我也想说清楚Selenium不是银弹。如果你的场景是登录后才能看数据、反爬机制很强的网站或者只是想拿接口数据做统计分析那用Selenium可能会很吃力性能上也不划算。它更适合的价值区间是需要真实浏览器环境、需要验证用户交互行为、需要覆盖多浏览器兼容性的场景。2. 环境搭建与第一个可运行的Selenium脚本2.1 Python环境与Selenium库安装Selenium支持多语言但对我这种不喜欢在代码上纠缠太多的人Python是最省事的。它写起来简洁社区资源又多遇到问题一搜就有答案。建议你用Python 3.8以上的版本太老的版本容易出现依赖兼容问题。先说安装用pip就能完成pip install selenium如果你在公司内网环境可能需要配置国内镜像源否则下载会慢到怀疑人生pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple装完之后可以用命令行检查一下版本pip show selenium正常情况下会输出版本信息比如当前我用的版本是4.x。这里要注意一个重要区别Selenium 3和Selenium 4的API有一些细节不同尤其是定位元素的方式和等待机制的底层实现。如果你看的教程是几年前的代码可能有报错需要会调整。2.2 浏览器驱动WebDriver的下载与版本匹配装完Selenium库之后很多人以为就可以跑了结果一运行就报错。报错内容一般是这样的WebDriverException: Message: chromedriver executable needs to be in PATH这是因为Selenium本身不包含浏览器驱动它需要通过WebDriver这个中间层去控制浏览器。WebDriver就像一个翻译官Selenium把代码指令翻译给浏览器内核执行。所以你的电脑上得有对应的Driver而且版本必须和浏览器版本匹配。以Chrome为例你需要先打开浏览器的“设置—关于”查看完整的版本号比如131.0.6778.86。然后去ChromeDriver的下载页面找到对应版本的驱动文件下载。下载完后你有两种方式使用它# 方式一把chromedriver所在的目录添加到系统PATH环境变量 # 方式二在代码里直接指定driver路径 from selenium import webdriver driver webdriver.Chrome(executable_path/path/to/chromedriver)不过到了Selenium 4.x官方推荐的做法是用Service对象来管理from selenium import webdriver from selenium.webdriver.chrome.service import Service service Service(executable_path/path/to/chromedriver) driver webdriver.Chrome(serviceservice)现在还有一个更省事的方式使用webdriver-manager这个库它能自动检测浏览器版本并帮你下载匹配的Driver。对于新手来说这条路线最不容易踩坑不过我建议你还是手动下载一次把原理搞清楚这样出现问题的时候才知道怎么排查。2.3 用Selenium IDE录制脚本先明白自动化是怎么工作的很多人搜索“怎么安装selenium插件”其实指的就是Selenium IDE。它是Selenium官方提供的一个浏览器扩展装在Chrome或Firefox里可以录制你的操作步骤然后导出成测试脚本。Selenium IDE的意义不是让你直接用录制的脚本做大规模测试而是让你直观地认识Selenium的工作原理。你打开IDE、点一下录制按钮、在浏览器里执行几步操作、停止录制它就会生成一条条的命令记录对应着打开URL、点击元素、输入文本等动作。这个过程中你能清楚地看到一个用户操作是如何被拆解成浏览器能够理解和执行的自动化指令的。不过说实话实际做项目时我很少直接用Selenium IDE出来的脚本。因为录制生成的代码通常充满了冗余定位元素一变就找不到维护成本很高。我推荐的做法是用IDE去快速验证某个操作步骤是否可以用自动化实现然后再手动编写更稳定的脚本。Selenium IDE更适合作为教学工具和快速原型验证工具而不是生产级脚本的来源。2.4 手写第一个脚本访问页面并搜索关键词我先给你一个完整的可运行示例功能是打开百度首页、在搜索框里输入“Selenium自动化”、点击搜索按钮然后等待结果出现。虽然百度这个例子已经被人写烂了但作为第一个脚本它确实很直观。import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service # 创建浏览器驱动实例 service Service(executable_path./chromedriver) driver webdriver.Chrome(serviceservice) try: # 打开页面 driver.get(https://www.baidu.com) # 定位搜索输入框并输入关键词 search_input driver.find_element(By.ID, kw) search_input.send_keys(Selenium自动化) # 定位搜索按钮并点击 search_btn driver.find_element(By.ID, su) search_btn.click() # 等待页面结果加载 time.sleep(3) # 打印页面标题验证搜索是否成功 print(driver.title) finally: # 无论执行结果如何最后都关闭浏览器 driver.quit()你复制这段代码把chromedriver换成你自己电脑上的路径运行一下如果能看到浏览器自动打开、完成输入和点击然后打印出“Selenium自动化_百度搜索”那说明环境就没问题了。3. 核心API与实战细节从能跑脚本到能写靠谱脚本3.1 元素定位的几种方式以及什么时候用哪一个Selenium操作页面的核心就是先找到你要操作的元素然后再对它做动作。Selenium 4里提供了八种定位方式分别对应By类里的方法定位方式写法适用场景IDBy.ID页面里ID唯一速度最快优先使用NameBy.NAME表单控件常用但可能重复Class NameBy.CLASS_NAME适用于CSS类特征明显的元素Tag NameBy.TAG_NAME定位一组同类标签如所有divLink TextBy.LINK_TEXT精确定位超链接文本Partial Link TextBy.PARTIAL_LINK_TEXT超链接文本较长时用部分匹配XPathBy.XPATH功能最强能处理复杂层级和文本条件CSS SelectorBy.CSS_SELECTOR语法简洁性能优于XPath我实际使用时的优先顺序是这样的能用ID就先用ID这几乎不会出错没有ID就看name或者class再不行就用CSS Selector只有在CSS写不出来的时候比如要根据文本内容、包含关系或者复杂的前后兄弟节点来定位才使用XPath。这里要注意很多人一上来就习惯右键复制XPath这种绝对路径定位方式非常脆弱。页面一改布局路径就断了。更好的做法是写相对定位比如根据元素的文本内容定位或者找它的某个稳定的祖先节点作为参考。我遇到过很多次“昨天还能跑今天就不能跑”的情况排查到最后都是因为复制了带绝对路径的XPath。3.2 与页面交互输入、点击、提交与清空定位到元素之后接下来就是对元素执行操作。最常用的三个操作是send_keys输入文本、click点击、clear清空内容。这些操作看起来简单但在实际使用中有很多细节需要留意。先说说send_keys。它不只是能输入普通的文本还能模拟键盘按键比如按回车、按Tab键切换焦点、按CtrlA全选。常见的使用场景是在输入框里输入内容后直接按回车触发搜索这比去找搜索按钮再点击更稳定。示例代码from selenium.webdriver.common.keys import Keys search_input.send_keys(Selenium自动化) search_input.send_keys(Keys.ENTER)还有一点某些输入框有格式校验比如日期控件手动点击选择很容易出现层级深、定位不准的问题。这种时候可以直接给input标签发送格式化的日期字符串往往比操作日历面板省事得多。click操作需要注意的是如果你定位到的元素被其他元素遮挡浏览器会报“element click intercepted”错误。这种情况常见于弹窗遮罩层没有完全消失或者有fixed定位的元素挡住了按钮。解决办法是先用显式等待把遮罩层等没再去点击目标元素。如果还是不行可以用JavaScript强制点击driver.execute_script(arguments[0].click();, element)不过这是最后的手段正常情况下你应该先思考是不是等待时机不对而不是一遇到问题就绕过。force click虽然能让脚本跑通但它绕过了用户的真实行为可能掩盖掉真正的页面bug。3.3 等待机制为什么time.sleep不是好习惯刚开始写Selenium脚本大家都会习惯性地加time.sleep等页面加载几秒钟。这个方法简单但完全不推荐原因有两点。第一固定时间无法应对网络波动。页面加载快的时候sleep时间太长会白白浪费时间加载慢的时候sleep时间不够元素还没出现脚本就会报错。第二大量sleep会大幅拉长测试执行时间几十个用例跑下来光等待就占掉一大半时间。Selenium提供了两种正式的等待机制隐式等待和显式等待。隐式等待的写法是driver.implicitly_wait(10)它的原理是设置一个超时时间在这段时间内如果元素没有被找到它就会轮询DOM一直到找到元素或超时为止。它一次性生效之后所有的find_element操作都会应用这个规则。显式等待则针对特定元素设置等待条件from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait WebDriverWait(driver, 10) element wait.until(EC.element_to_be_clickable((By.ID, su)))显式等待的核心优势在于它是“面向条件”的你可以指定元素可点击、可见、存在、包含指定文本等条件。它还提供了更丰富的参数比如轮询频率、忽略异常类型这让脚本的容错性大大提高。我的实际建议是隐式等待可以设一个基础的兜底值比如5秒但主要依赖显式等待。不要混用两者因为隐式等待和显式等待组合时底层的超时计算机制在某些场景下会出现意外延长等待的问题。最近几年版本的Selenium对此有所调整但为了保险起见新项目我基本都是只用显式等待把wait封装成工具方法调用的时候传入定位器和超时时间即可。3.4 处理iframe、弹窗和多窗口切换这几个场景容易让新手懵圈写Selenium脚本的时候最让人头疼的不是普通页面的元素定位而是页面里嵌套了iframe、弹出了alert或者浏览器打开了新窗口。这三个场景有个共同特点元素明明在页面上但你就是定位不到。先说iframe。iframe是页面里嵌入的另一层HTML文档Selenium默认是在主文档里查找元素所以iframe内部的内容直接定位是找不到的。你需要先切换到iframe里# 切换到iframe参数可以是索引、id/name、或者WebElement对象 driver.switch_to.frame(mainIframe) # 操作完iframe内的元素后切回主文档 driver.switch_to.default_content()这里有个嵌套iframe的情况要特别注意如果iframe里还有iframe你要一层一层切进去操作完再一层一层切出来顺序搞错就会找错上下文。再说JavaScript弹窗包括alert、confirm、prompt三种。它们的处理方式是# 获取弹窗对象 alert driver.switch_to.alert # 点击确定 alert.accept() # 点击取消 alert.dismiss() # 获取弹窗文本 text alert.text处理完弹窗之后如果你没有再对弹窗做操作之后的代码仍然是在原来的页面上下文里运行的所以不需要像iframe那样切换回来。最后是多窗口切换。当脚本点击了一个链接浏览器新开了一个标签页新的页面元素同样定位不到因为Selenium的焦点还在原来的窗口上。你需要先获取所有窗口句柄再切换到目标窗口handles driver.window_handles driver.switch_to.window(handles[-1])这些上下文切换的操作建议你在一开始设计代码时就封装成方法比如封装一个switch_to_new_window方法专门负责获取新窗口句柄并切换。这样用例代码看起来干净遇到问题时也好排查。4. 常见问题与排查技巧实录这些坑我基本都踩过4.1 元素找不到这个报错背后的多种可能性“NoSuchElementException”是Selenium使用频率最高的报错之一每个写Selenium的人都会遇到。原因种类很多但归纳起来关键在于元素定位错了、元素加载慢了、元素不在当前上下文里。我的排查经验是先检查定位表达式有没有写错。把定位表达式复制到浏览器开发者工具的Console里用document.querySelector验证一下就能确认是不是表达式的问题。如果表达式没问题再看等待时间够不够是不是元素是异步加载的你等得太早。再检查一下是不是在iframe里这种上下文问题特别容易忽略。最后还有一种可能页面有多个相同属性值的元素Selenium默认返回第一个但你要操作的是第二个。这种情况下要么把定位写得更精确要么用find_elements获取列表再按下标选择。很多人在代码里直接复制XPath这个习惯很容易在页面结构不变、但一个属性值变化时导致元素找不到。比如按钮的class被前端工程师从“btn-primary”改成了“btn-success”直接复制的XPath就彻底失联了。4.2 元素点击无效或超时大概率是等待和状态判断不到位“ElementClickInterceptedException”和“TimeoutException”也是高频报错。前者是元素被遮挡后者是等待条件一直没满足。我刚学Selenium时遇到点击无效第一时间就是加time.sleep瞎等结果发现有时行有时不行特别不稳定。后来才意识到问题根源不只是时间不够而是元素的状态不对。有时候元素在DOM里存在但不可见、不可点击或者正在被动画过渡。正确的做法是使用显式等待的element_to_be_clickable条件它会等待元素可见且可点击。我之前做过一个前端框架生成的后台系统所有按钮点击后都有loading遮罩层这时候如果不去等待遮罩消失直接点下一个按钮大概率会被拦截报错。后来我给自己定了一个习惯凡是连续两步操作之间有异步过程一定要加针对性的等待条件。4.3 浏览器崩溃与Driver进程残留稳定性问题的处理思路用Selenium批量跑用例的时候运行久了总会出现浏览器不响应、内存占用飙高、甚至无响应僵尸进程堆积的问题。最常见的原因是脚本抛出异常后driver.quit()没有执行导致浏览器进程和chromedriver进程残留在系统里。解决方法是使用try/finally结构确保无论测试是否成功driver都会被关闭driver webdriver.Chrome() try: # 测试代码 pass finally: driver.quit()如果异常已经导致进程残留Windows下可以打开任务管理器手工结束chromedriver和chrome相关进程或者用命令行强制执行taskkill /F /IM chromedriver.exe为了避免批处理时浏览器状态互相干扰还可以让每个脚本都使用全新的用户数据目录。我在跑不同账号的自动化任务时发现共用一个用户目录会出现登录态串号的问题改成临时目录后这个问题就解决了。4.4 定位动态元素的下标问题与页面刷新另一个实际项目中经常遇到的坑是页面元素的顺序会动态变化。比如同一页面上有多个相同class的卡片第一次运行脚本时你定位到下标0第二次运行可能排列顺序就变了。这类问题不能靠死记硬背下标来解决应该根据卡片里的唯一文本内容来定位相对元素。另外页面的局部刷新会导致之前获取的WebElement对象失效再操作它会抛出“StaleElementReferenceException”。比如你点击了一个按钮页面局部更新了旧元素已经从DOM里摘除但你的代码还在使用这个旧元素的引用。解决方法是重新获取元素引用或者用循环重试机制在异常时重新定位再继续操作。5. 进阶实战让Selenium真正扛起自动化任务5.1 Page Object模式别再把用例代码堆在一页里很多人一开始写Selenium脚本都是把定位和操作全部写在测试用例里。这在小脚本时看着没什么问题但一旦用例多起来维护成本会急速上升。比如登录框的定位方式变了你就要把所有使用了这个定位的用例全部改一遍非常痛苦。Page Object模式的核心是把每个页面封装成一个类。页面里的元素定位作为类属性页面的操作行为作为类方法测试用例只负责调用这些方法而不关心底层是如何定位的。举个例子class LoginPage: def __init__(self, driver): self.driver driver self.username_input (By.ID, username) self.password_input (By.ID, password) self.login_btn (By.ID, loginBtn) def input_username(self, text): self.driver.find_element(*self.username_input).send_keys(text) def input_password(self, text): self.driver.find_element(*self.password_input).send_keys(text) def click_login(self): self.driver.find_element(*self.login_btn).click()这样设计有个好处页面的变化被隔离在Page类内部用例层相对稳定。再加上一个BasePage基类把常用的显式等待、操作封装放进去写用例时会快很多维护起来也不会一头雾水。5.2 与测试框架整合pytest加断言从“能跑”到“能测”Selenium本身只是浏览器自动化工具它不提供断言机制、不生成测试报告、也不管理系统性的用例。要让自动化脚本真正用于验证产品质量你需要搭配一个测试框架Python生态里最常用的是pytest或unittest。我个人更推荐pytest它的断言写法简洁、fixture机制灵活、插件生态丰富而且生成的报告非常直观。用pytest写Selenium用例的典型结构是import pytest from selenium import webdriver pytest.fixture def driver(): driver webdriver.Chrome() yield driver driver.quit() def test_search(driver): driver.get(https://www.baidu.com) search_input driver.find_element(By.ID, kw) search_input.send_keys(Selenium) search_input.send_keys(Keys.ENTER) assert Selenium in driver.title这里最核心的思路是Selenium负责“执行动作”pytest负责“验证结果”。没有断言你的脚本只是跑了个寂寞页面出没出错全凭肉眼和运气。有了断言每次执行完结果里自动显示通过了哪些、失败了哪些、失败的原因是什么这才是自动化测试的意义。5.3 数据驱动与配置管理少写重复代码提升维护效率如果用例需要覆盖多组数据比如一个登录功能要测十组账号密码最笨的办法是写十个几乎一样的用例方法。但更高效的做法是数据驱动把测试数据从代码里抽离成一个独立的文件或数据结构让同一套用例逻辑跑不同数据。pytest里可以使用参数化来实现import pytest import allure pytest.mark.parametrize(username,password, [ (user1, pass1), (user2, pass2), (user3, pass3), ]) def test_login(driver, username, password): # 执行登录逻辑 pass配置管理也很重要。不要把URL、账号密码、Driver路径这些硬编码在用例代码里否则换一个测试环境就要改一遍代码。我的做法是把环境相关的配置放配置文件里代码里通过读取配置来构建测试数据。这样开发环境、测试环境、预发布环境之间的切换只是换一个配置的问题不用改动任何用例代码。5.4 并发执行与Selenium Grid大规模用例的执行思路当一个项目的用例数量积累到几百上千条时单线程一条条跑就显得太慢了。这时候你会想要并发执行让多个浏览器同时跑不同用例。Selenium Grid就是官方提供的分布式执行方案它允许把测试分发到多台机器、多个浏览器上并行执行。搭建Selenium Grid的基本流程是启动一个Hub作为调度中心注册多个Node作为执行节点每个Node可以配置不同的浏览器环境。然后测试代码连接HubHub会选择合适的Node来执行用例。实际使用中Selenium Grid的配置和调优有一些复杂度尤其是版本兼容和网络配置。如果你只是在一台机器上想快速提升执行速度也可以考虑用pytest-xdist插件做进程级并发。我个人的体验是当用例规模没有到几千级别的阶段pytest-xdist已经能解决大部分性能瓶颈。等到团队规模大了环境种类多了再考虑引入Selenium Grid。不要一开始就追求高并发架构先把用例质量做好比什么都重要。6. 多浏览器兼容性测试与常见失败总结6.1 一套脚本跑Chrome、Firefox、Edge的思路我做项目时经常遇到一个需求功能在Chrome上是好的但领导要求确认Firefox和Edge也能正常跑。手工测三遍费力不说关键是容易漏细节。有了Selenium之后这事就简单了只要把浏览器实例的创建逻辑抽成工厂方法传入一个浏览器类型的参数就能决定使用哪个Driverfrom selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.firefox.service import Service as FirefoxService from selenium.webdriver.edge.service import Service as EdgeService def get_driver(browser_name): if browser_name chrome: return webdriver.Chrome(serviceChromeService()) elif browser_name firefox: return webdriver.Firefox(serviceFirefoxService()) elif browser_name edge: return webdriver.Edge(serviceEdgeService()) else: raise ValueError(Unsupported browser)这样之后你的用例代码完全不用动只需要在运行前指定本次跑哪个浏览器。在pytest里可以通过fixture参数化或者通过命令行参数来控制结合CI平台就能实现一次提交、三个浏览器并行验证的效果。6.2 兼容性测试时最容易遇到的差异问题实际做多浏览器兼容性测试时你会遇到一些很有意思的差异问题。第一个是CSS样式差异同一个元素在Chrome里正常点击在Firefox里可能因为字体渲染差异导致元素尺寸不一样点击区域发生变化。这个问题在断言元素可见性和点击位置上表现得比较明显。第二个是Driver的超时行为差异ChromeDriver和GeckoDriver对隐式等待、页面加载状态的处理方式并不完全一致在Chrome上跑得好好的脚本到Firefox上可能一个等待条件都不触发一直等到超时。第三个是文件下载路径的处理不同浏览器的默认下载目录不同如果你在脚本里检查下载后的文件需要针对每个浏览器单独配置下载目录。我的经验是不要指望一套脚本在所有浏览器上100%无差异地稳定运行这不现实。正确的心态是把脚本尽量写得符合标准规范在出现差异时逐个浏览器做针对性调整并把调整记录在测试文档里。毕竟浏览器兼容性测试的目的就是发现差异脚本本身也是测试的一部分。6.3 移动端Web自动化与扩展思考Selenium并不直接支持移动端的原生应用自动化但如果你的场景是移动端H5页面、也就是手机浏览器里打开的网页那还是可以用Selenium的思路来做的。常见做法有两种一种是在桌面浏览器里通过开发者工具切换成移动设备模拟模式另一种是利用Appium这类工具通过手机浏览器驱动来操作真机或模拟器里的浏览器。如果你的测试主要面向桌面Web端那Selenium已经够用了。但如果你所在的项目既有Web端又有移动端H5建议在Selenium的基础上了解Appium它的核心设计理念和Selenium一脉相承学会了Selenium再学Appium成本会低很多。这个扩展方向对未来职业发展也很有价值。最后说几句掏心窝子的经验做了这么多年自动化我最深的体会是工具只是手段稳定可靠才是最终目标。Selenium看似简单真正写好它需要积累很多细节上的判断力。什么时候该等待、什么时候该切换上下文、定位器怎么写才稳定、异常怎么处理才不会导致浏览器残留这些都是踩过坑之后才会真正理解的。如果你刚开始学建议从一个小项目入手比如把自己平常最重复的一个操作场景自动化起来慢慢打磨比啃完一大堆文档再动手有效得多。等你能跑通第一个脚本再逐步把等待机制、Page Object、数据驱动这些概念融进去你会慢慢找到那种“一切尽在掌握”的感觉。
返回列表