2026/6/20 7:59:13
网站建设
项目流程
深圳如何建立公司自己网站,网页图片怎么保存为pdf文件,网站的建设报价,贴吧怎么做网站视频Selenium Web 自动化测试脚本总结
Web 自动化的本质#xff0c;是模拟人在浏览器里的操作行为#xff1a;打开浏览器、访问页面、定位元素、输入/点击、做断言验证。Selenium 之所以常用#xff0c;是因为它把这些动作抽象成了一套稳定的 API#xff0c;再配合浏览器驱动是模拟人在浏览器里的操作行为打开浏览器、访问页面、定位元素、输入/点击、做断言验证。Selenium 之所以常用是因为它把这些动作抽象成了一套稳定的 API再配合浏览器驱动WebDriver就能把“测试步骤”变成“可重复执行的脚本”。下面按“工程上最常遇到的问题链路”来讲先跑通 → 再定位稳 → 再等待稳 → 再窗口/弹窗/上传/截图/参数全覆盖。测试概念相关内容会简要收束在文末。1先搞清三件套Selenium 浏览器驱动 浏览器怎么协作来看 Web 自动化落地需要的三件套浏览器最终执行动作的地方浏览器驱动WebDriver把自动化指令翻译成浏览器能理解的操作Selenium 脚本你写的 Java 代码负责发出“打开页面/找元素/点击/断言”的指令再来看它们的交互流程非常关键理解了后面排错就简单Selenium 脚本里会在ChromeDriverService创建一个服务通过服务启动本地驱动一般是localhost:port这是 Selenium 向 WebDriver 发送请求的地址Selenium 向驱动发 HTTP 请求驱动解析请求打开浏览器并返回sessionId后续操作需要携带访问地址、查找元素等动作都通过该服务连接到 WebDriver再通过execute发送请求驱动把请求翻译成浏览器可执行的脚本并发送给浏览器浏览器执行后把结果再经驱动返回给脚本验证“驱动服务真的存在”的方式也很直观执行脚本时终端会打印出驱动服务地址和端口信息。2驱动管理别手动下载驱动交给 WebDriverManager来看一个现实问题Chrome/Edge/Firefox 驱动版本经常和浏览器版本“拧巴”手动维护很痛。解决办法用WebDriverManager做驱动管理它会自动下载、设置、维护驱动并且从 v5 起还支持发现本机浏览器、构建ChromeDriver/FirefoxDriver/EdgeDriver等对象。Maven 依赖示例dependencygroupIdio.github.bonigarcia/groupIdartifactIdwebdrivermanager/artifactIdversion5.8.0/versionscopetest/scope/dependency3Selenium 快速上手一段“百度搜索”脚本跑通全链路来看最小可运行例子打开浏览器 → 访问百度 → 输入关键字 → 点击搜索 → 退出。Selenium 依赖示例dependencygroupIdorg.seleniumhq.selenium/groupIdartifactIdselenium-java/artifactIdversion4.0.0/version/dependency代码骨架Javapublicvoidexample_test(){// 驱动程序管理自动化WebDriverManager.chromedriver().setup();ChromeOptionsoptionsnewChromeOptions();// 允许访问所有链接options.addArguments(--remote-allow-origins*);// 1) 打开浏览器WebDriverdrivernewChromeDriver(options);// 2) 访问百度driver.get(https://www.baidu.com);// 3) 输入关键词driver.findElement(By.xpath(//*[id\kw\])).sendKeys(迪丽热巴);// 4) 点击“百度一下”driver.findElement(By.xpath(//*[id\su\])).click();// 5) 关闭浏览器driver.quit();}4元素定位自动化的核心是“定位必须唯一”Web 自动化测试的操作核心是先找到元素再对元素操作。常见定位方式很多id/className/tagName/xpath/cssSelector实际高频主要是cssSelector 和 xpath。4.1 cssSelector更贴近前端写起来也短来看 selector 的用途选中页面指定标签元素。常见写法id 选择器#kw百度搜索输入框子类/层级选择器例如热搜区域#s-hotsearch-wrapper div4.2 XPath路径语言表达力强来看 XPath 的常用语法点能覆盖 80% 场景获取所有节点//*获取指定标签节点//ul、//input直接子节点/如//span/input父节点..如//input/..按属性匹配//*[idkw]按索引取第 N 个//div/ul/li[3]注意索引从 1 开始4.3 “复制 selector/xpath”很香但要小心“不唯一”浏览器右键 Copy selector/xpath 很便捷但复制出来的表达式不一定满足唯一性有时需要手动改。来看提醒元素定位方法必须唯一不唯一会导致脚本点错对象、偶现失败、甚至误判通过。5操作元素点击、输入、清空、取文本与取属性定位到元素后常见操作包括点击、提交、输入、清除、获取文本。5.1 点击/提交driver.findElement(By.cssSelector(#su)).click();5.2 输入模拟键盘driver.findElement(By.cssSelector(#kw)).sendKeys(输入文字);5.3 清空再输入driver.findElement(By.cssSelector(#kw)).sendKeys(我爱游戏);driver.findElement(By.cssSelector(#kw)).clear();driver.findElement(By.cssSelector(#kw)).sendKeys(我爱学习);5.4 获取文本 vs 获取属性别把“文本”和“属性值”混了获取文本getText()获取属性值getAttribute(属性名称)另外两个经常要用的“页面级信息”当前标题getTitle()当前 URLgetCurrentUrl()6窗口与句柄新窗口打开后脚本并不知道“你眼睛看到的那个窗口”手工测试靠眼睛判断当前窗口脚本需要靠窗口句柄handle。6.1 获取与切换窗口当前窗口句柄driver.getWindowHandle()所有窗口句柄driver.getWindowHandles()切换到新窗口的常见写法StringcurWindowdriver.getWindowHandle();SetStringallWindowdriver.getWindowHandles();for(Stringw:allWindow){if(w!curWindow){driver.switchTo().window(w);}}注意执行driver.close()之前要先切到未被关闭的窗口。6.2 窗口大小控制driver.manage().window().maximize();driver.manage().window().minimize();driver.manage().window().fullscreen();driver.manage().window().setSize(newDimension(1024,768));7等待稳定性的分水岭强制 / 隐式 / 显式代码执行速度通常比页面渲染快不等待就容易出现“元素还没出来就去找”的误报。来看三种等待方式7.1 强制等待Thread.sleep()优点简单、调试时好用缺点浪费时间、影响效率7.2 隐式等待全局智能等待隐式等待会在查找元素时在指定时间内不断尝试找到就继续超时才报错。driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));它的作用域是整个脚本只要driver没quit()就一直生效。7.3 显式等待带条件的智能等待更灵活显式等待在超时时间内只要满足条件就继续执行WebDriverWaitwaitnewWebDriverWait(driver,Duration.ofSeconds(3));wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(#id)));常见条件ExpectedConditions包括elementToBeClickable元素可见且可点击textToBe文本符合预期presenceOfElementLocatedDOM 上存在该元素urlToBeURL 符合预期7.4 重要结论不要混合隐式等待和显式等待来看实验现象隐式等待 5s 显式等待 10s最终等待时间并不稳定会出现 10s、11s…因此结论是不要混用等待时间可能不可预测。8浏览器导航前进、后退、刷新打开网站两种写法driver.navigate().to(https://selenium.dev);driver.get(https://selenium.dev);前进/后退/刷新driver.navigate().back();driver.navigate().forward();driver.navigate().refresh();9弹窗处理页面里找不到元素时用 Alert弹窗在页面 DOM 里通常找不到元素需要切到 Alert9.1 警告/确认弹窗Alertalertdriver.switchTo().alert();alert.accept();// 确认alert.dismiss();// 取消9.2 提示弹窗可输入Alertalertdriver.switchTo().alert();alert.sendKeys(hello);alert.accept();10文件上传系统文件选择框不可控但可以绕过去点击“上传文件”会弹出系统窗口这是非 Web 控件Selenium 无法直接识别。解决办法对input typefile直接sendKeys(文件路径)WebElementeledriver.findElement(By.cssSelector(body div div input[typefile]));ele.sendKeys(D:\\selenium2html\\selenium2html\\upload.html);11截图让“线上跑挂了但你看不见”的问题可追溯自动化脚本往往跑在机器上失败时你不一定能看到现场。截图可以记录当时的错误画面。需要额外依赖示例dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version/dependency核心代码Filefile((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file,newFile(filename));并且可以做“简单版/带时间戳归档版”的路径管理。12浏览器参数无头模式 页面加载策略12.1 无头模式HeadlessChromeOptionsoptionsnewChromeOptions();options.addArguments(--headless);ChromeDriverdrivernewChromeDriver(options);12.2 页面加载策略options.setPageLoadStrategy(PageLoadStrategy.NONE);13测试概念简要收束自动化主要服务回归但不能“神化”来看几个关键结论自动化的主要目的常用于回归测试避免新增功能影响历史功能需要整体回归。自动化不一定能取代人工脚本也是人写的功能变更后脚本需要维护与更新。“自动化能大幅降低工作量”这种绝对化表达要小心更准确的说法是在一定程度上降低但前期投入与维护成本真实存在。自动化类型很多接口自动化、UI 自动化Web、移动端等移动端常依赖模拟器受环境影响更大稳定性通常比接口与 Web 自动化更差。来看“自动化测试金字塔”理想状态是更多精力放在单元层UI 层更少而实际企业里常出现“冰淇淋蛋筒反模式”UI 自动化过重导致成本高、维护难。自动化需要找到“突破点”当持续运行带来长期成本收益时价值才会逐渐体现。Selenium自动化脚本总结定位要唯一、等待别混用、窗口要切对、失败要留证据截图/日志、能用配置别硬编码。