当前位置: 首页 > news >正文

【自动化测试】Selenium详解-WebUI自动化测试

 🔥个人主页: 中草药

 🔥专栏:【Java】登神长阶 史诗般的Java成神之路


Selenium 是用于 Web 自动化测试的常用工具,其核心功能围绕浏览器控制、元素操作和页面交互展开。以下是 Selenium 中最常用的函数(方法),按功能分类说明:

Selenium常用函数

浏览器初始化与控制

用于启动浏览器、控制窗口行为等,核心是通过 webdriver 模块初始化浏览器驱动。

函数 / 方法功能说明示例
webdriver.Chrome()启动 Chrome 浏览器(需对应 ChromeDriver)driver = webdriver.Chrome()
webdriver.Firefox()启动 Firefox 浏览器(需对应 GeckoDriver)driver = webdriver.Firefox()
get(url)打开指定 URLdriver.get("https://www.baidu.com")
back()/forward()/refresh()前进/后退/刷新页面driver.navigate.forward()
getTitle()获取当前页面标题driver.getTitle()
getCurrentUrl()获取当前页面Urldriver.getCurrentUrl()

测试demo

//浏览器初始化与控制public void test02() throws InterruptedException {WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver driver = new ChromeDriver(options);driver.get("https://www.baidu.com/");Thread.sleep(1000);driver.navigate().to("https://www.csdn.net/");Thread.sleep(1000);driver.navigate().back();Thread.sleep(1000);driver.navigate().forward();Thread.sleep(1000);driver.navigate().refresh();Thread.sleep(1000);System.out.println(driver.getTitle());System.out.println(driver.getCurrentUrl());driver.quit();}

元素定位

定位方式说明示例代码
By.ID通过元素 id 属性定位java// 单个元素WebElement username = driver.findElement(By.id("username"));// 多个元素List<WebElement> tags = driver.findElements(By.id("tag"));
By.NAME通过元素 name 属性定位javaWebElement password = driver.findElement(By.name("password"));
By.CLASS_NAME通过元素 class 属性定位(单个 class)javaWebElement submitBtn = driver.findElement(By.className("btn-submit"));
By.TAG_NAME通过 HTML 标签名定位javaWebElement input = driver.findElement(By.tagName("input"));
By.LINK_TEXT通过超链接完整文本定位javaWebElement loginLink = driver.findElement(By.linkText("登录"));
By.PARTIAL_LINK_TEXT通过超链接部分文本定位javaWebElement partialLink = driver.findElement(By.partialLinkText("登"));
By.CSS_SELECTOR通过 CSS 选择器定位(推荐)java// id选择器WebElement username = driver.findElement(By.cssSelector("#username"));// 层级选择器WebElement navItem = driver.findElement(By.cssSelector(".nav > li"));
By.XPATH通过 XPath 路径定位(灵活)java// 属性匹配WebElement usernameInput = driver.findElement(By.xpath("//input[@name='username']"));// 文本包含WebElement welcomeDiv = driver.findElement(By.xpath("//div[contains(text(), '欢迎')]"));

常见的是xpath

更便捷的生成selector/xpath的方式:右键选择复制"Copyselector/xpath"

public void test03(){WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver driver = new ChromeDriver(options);driver.get("https://www.baidu.com/");System.out.println(driver.findElement(By.xpath("//ul[@class='s-hotsearch-content']")).getText());System.out.println("--------------------");List<WebElement> elements = driver.findElements(By.xpath("//li[@class='hotsearch-item odd']"));for (WebElement element : elements) {System.out.println(element.getText());}}

元素操作

方法说明示例
click()点击元素(按钮、链接等)elem.click();
sendKeys(CharSequence...)向输入框发送文本(支持键盘按键,如Keys.ENTER// 需导入键盘按键类:import org.openqa.selenium.Keys;elem.sendKeys("admin"); // 输入文本elem.sendKeys(Keys.ENTER); // 按回车键
clear()清空输入框内容elem.clear();
getText()获取元素文本内容(可见文本)System.out.println(elem.getText()); // 输出类似"登录按钮"的文本
getAttribute(String name)获取元素指定属性值elem.getAttribute("value"); // 获取输入框当前值elem.getAttribute("href"); // 获取链接的href属性
isDisplayed()判断元素是否可见if (elem.isDisplayed()) { // 元素可见时执行的操作}
isEnabled()判断元素是否可用(如按钮是否可点击)if (elem.isEnabled()) { // 元素可用时执行的操作}
isSelected()判断复选框 / 单选框是否选中if (elem.isSelected()) { // 元素被选中时执行的操作}

测试demo

public void test03() throws InterruptedException {WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver driver = new ChromeDriver(options);driver.get("https://www.baidu.com/");WebElement element = driver.findElement(By.xpath("//*[@id=\"chat-textarea\"]"));WebElement search=driver.findElement(By.xpath("//*[@id=\"chat-submit-button\"]"));Thread.sleep(1000);element.sendKeys("python");Thread.sleep(1000);element.clear();Thread.sleep(1000);element.sendKeys("java");Thread.sleep(1000);search.click();Thread.sleep(3000);driver.quit();}

窗口与标签页操作

方法说明示例
getWindowHandle()获取当前窗口句柄
System.out.println(driver.getWindowHandle());
getWindowHandles()获取所有窗口句柄(列表)
Set<String> windowHandles = driver.getWindowHandles();
switchTo().window(handle)切换到指定窗口
for(String windowHandle : windowHandles) {if(!windowHandle.equals(driver.getWindowHandle())) {driver.switchTo().window(windowHandle);}
}
maximize()最大化窗口
driver.manage().window().maximize();
minimize()最小化窗口
driver.manage().window().minimize();
setSize(new Dimension(width, height))设置窗口大小
driver.manage().window().setSize(new Dimension(1280, 720));

测试demo

public void test03() throws InterruptedException {WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver driver = new ChromeDriver(options);driver.get("https://www.baidu.com/");Thread.sleep(1000);driver.manage().window().maximize();Thread.sleep(1000);driver.manage().window().minimize();Thread.sleep(1000);driver.manage().window().fullscreen();Thread.sleep(1000);driver.manage().window().setSize(new Dimension(1280, 720));Thread.sleep(1000);WebElement element = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]"));element.click();Thread.sleep(1000);System.out.println(driver.getWindowHandle());Set<String> windowHandles = driver.getWindowHandles();for(String windowHandle : windowHandles) {if(!windowHandle.equals(driver.getWindowHandle())) {driver.switchTo().window(windowHandle);}}Thread.sleep(1000);driver.quit();}

屏幕截图

我们的自动化脚本一般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景

File screenshotAs = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshotAs,new File(fileName));

屏幕截图方法需要额外导入包:

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.16.1</version>
</dependency>
public void test03() throws InterruptedException, IOException {WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver driver = new ChromeDriver(options);driver.get("https://www.baidu.com/");getScreenShot(driver);WebElement element = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]"));element.click();System.out.println(driver.getWindowHandle());Set<String> windowHandles = driver.getWindowHandles();getScreenShot(driver);Thread.sleep(2000);for(String windowHandle : windowHandles) {if(!windowHandle.equals(driver.getWindowHandle())) {driver.switchTo().window(windowHandle);}}getScreenShot(driver);driver.quit();}public void getScreenShot(WebDriver driver) throws IOException {SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());String fileName = "./src/test/image/"+dirTime+"/test_"+fileTime+".png";File screenshotAs = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(screenshotAs,new File(fileName));}

等待机制

这里了解一个常见报错 NosuchElementException 出现这个报错的原因主要有以下几种

1、元素选择错误

2、匹配方式不对,xpath->selector

3、自动化打开的界面与手动打开界面不一致(如登录状态不同)

4、动态生成的元素

5、代码执行的速度比页面渲染速度快

这里为了防止因为第五种情况造成的误判,selenium提供了三种等待方式

强制等待

Thread.sleep();

优点:使用简单,调试的时候比较有效

缺点:影响运行速率,浪费大量时间

隐式等待

隐式等待是一种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

隐式等待作用在所有元素上,会等待所有元素加载成功,只要driver对象没有释放,隐式等待会一直生效

若是想等待某一固定元素,隐式等待也会有额外的时间消耗,且隐式等待只能等待页面元素,无法等待弹窗

显示等待

显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码

new WebDriverWait(driver, Duration.ofSeconds(3)).until($express);

其中$express-->涉及到了selenium.support.ui.ExpectedConditions包下的ExpectedConditions类

返回值:boolean

ExpectedConditions预定义方法的一些示例

elementToBeclickable(By locator)-用于检查元素的期望是可见的并已启用,以便您可以单击它。

textToBe(Bylocator,string str)-检查元素。(精确匹配)

presence0fElementLocated(Bylocator)-检查页面的DOM上是否存在元素

urlToBe(java.lang.String url)-检査当前页面的 URL是一个特定的 URL。

示例

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"2\"]")));

官方建议:显示等待与隐式等待不建议一起使用,会致使不可预测的等待时间

弹窗

弹窗是在页面上找不到的元素需要做特殊处理,要使用Selenium的alert接口

当页面出现弹窗,必须要进行处理

Alert alert = driver.switchTo().alert();
alert.accept();
alert.dismiss();
alert.getText();
alert.sendKeys("Test");

一般建议用显示等待来处理弹窗

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
wait.until(ExpectedConditions.alertIsPresent());

文件上传

点击文件上传的场景会弹窗系统窗口,进行文件的选择

selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别

但是可以使用sendKeys() 来上传指定路径文件

WebElement ele = driver.findElement(By.cssSelector("body > div > div > 
input[type=file]"));ele.sendKeys("D:\\upload.html");

浏览器参数设置

设置无头模式

在 Selenium 中,无头模式(Headless Mode) 是指浏览器在无图形界面(GUI)的情况下运行,仅在后台执行自动化操作。这种模式适合在服务器、CI/CD 环境或不需要可视化界面的场景中使用,能显著减少资源占用(内存、CPU)并提高运行速度。

WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();// 对于 Chrome 112+,推荐使用 "--headless=new"(新无头模式,功能更完整)
options.addArguments("--headless=new");// 旧版无头模式(不推荐,可能逐步被淘汰)
// options.addArguments("--headless");

设置加载策略

在 Selenium 中,页面加载策略(Page Load Strategy) 用于控制 WebDriver 等待页面加载完成的时机。简单来说,它决定了浏览器在什么时候停止等待页面加载,并允许脚本继续执行后续操作。这对于优化自动化脚本的执行速度(尤其是处理加载缓慢的页面)非常重要。

策略优点缺点最佳实践
normal兼容性最好,确保所有资源加载完成速度慢(尤其页面有大量图片 / 视频)页面加载速度快、需操作所有资源(如图片上传预览)时使用。
eager速度较快,满足大多数 DOM 操作需求不等待异步加载的资源(如 AJAX 数据)主要操作表单、文本等 DOM 元素,无需等待图片 / 样式时优先使用。
none速度最快,可在加载中干预页面需手动处理所有等待(易出现元素未加载)需拦截页面加载(如阻止弹窗)、或页面加载极慢时使用,必须配合显式等待。
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);//最慢
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
options.setPageLoadStrategy(PageLoadStrategy.NONE);//最快

要为重活而高兴,不要为死去的忧伤。                                                                ——林清玄

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸 

http://www.lryc.cn/news/624460.html

相关文章:

  • 代理模式深度解析:从静态代理到 Spring AOP 实现
  • MATLAB建模与可视化技术文档:从二维到三维
  • 当使用STL容器去存放数据时,是存放对象合适,还是存放对象指针(对象地址)合适?
  • Centos7使用lamp架构部署wordpress
  • 使用华为显卡训练深度学习模型的步骤
  • 计算机网络技术学习-day3《交换机配置》
  • 像素风球球大作战 HTML 游戏
  • 【opencv-Python学习笔记(6):阈值处理】
  • 如何平衡电竞酒店和高校宿舍对AI云电竞游戏盒子的不同需求?
  • 云计算- KubeVirt 实操指南:VM 创建 、存储挂载、快照、VMI全流程 | 容器到虚拟机(镜像转换/资源调度)
  • AI需要防火墙,云计算需要重新构想
  • 我们为什么需要时序数据库?
  • AI大模型实战:用自然语言处理技术高效处理日常琐事
  • 云计算核心技术之容器技术
  • 网站服务器使用免费SSL证书安全吗?
  • Orange的运维学习日记--45.Ansible进阶之文件部署
  • 公司无公网IP,如何将内网服务,给外面异地连接使用?远程办公可通过什么访问?
  • 力扣70:爬楼梯
  • 终端管理一体化
  • 【图像算法 - 17】慧眼识“果”:基于深度学习与OpenCV的苹果智能检测系统(附完整代码)
  • 哪里找最新AI工具官网?如何快速对比ChatGPT替代品?AI工具导航指南 - AIbase
  • 实现make/makefile
  • MyCAT完整实验报告
  • 项目实战——矿物识别系统(利用机器学习从化学元素数据中识别矿物,从数据到分类模型)
  • 把 AI 编程助手塞进「离线 U 盘」——零依赖的 LLM-Coder 随行编译器
  • 8.18 打卡 DAY 45 Tensorboard使用介绍
  • Nextcloud 私有云部署:cpolar 内网穿透服务实现安全远程文件访问
  • lamp架构部署wordpress
  • 直播美颜SDK架构揭秘:动态贴纸功能的实现原理与性能优化
  • 【前端进阶】UI渲染优化 - 骨架屏技术详解与多框架实现方案