Selenium自动化测试
自动化主要是进行回归测试,就是检测对程序代码进行修改后是否带来了新的问题 ,以前通过的用例现在是否还能通过。软件版本更迭的速度挺快,自动化测试可以一定程度的减少测试人员的工作量,自动进行这些重复的测试工作,但是不能取代人工测试,因为自动化测试代码由人工编写维护,也不是一定能比人工测试更可靠。
分类
接口自动化测试:编写脚本或使用工具对API进行测试,比web测试更早发现底层的问题;
UI自动化测试(界面测试):包含web自动化测试(浏览器界面),移动端测试(部署在手机上的程序),后端底层代码的缺陷可以通过界面显示;
后面主要介绍web自动化测试;
web自动化测试
驱动
web测试首先要打开浏览器页面,要想程序自动打开,需要安装浏览器的驱动。驱动是一类特殊的软件,是操作体系和硬件设备的桥梁。计算机有了驱动就可以与设备(耳机,摄像头,键盘,麦克风)进行通信。
驱动管理
不同类型不同版本的浏览器的驱动都不同,同一浏览器版本更迭也快,如果手动管理版本的话人会很崩溃,所以就需要版本管理器。
添加依赖
<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope>
</dependency>
WebDriverManager是一个开源java库,以完全自动化的方式对Selenium WebDriver所需的驱动程序(如chromedriver,geckodriver, msedgedriver等)进行管理(下载,设置,维护),版本5开始,WebDriverManager还提供了其他功能,如发现本地系统中安装浏览器的能力,构键WebDriver对象。
创建驱动对象
WebDriverManager.chromedriver().setup(); //启动谷歌浏览器驱动的版本管理器
ChromeOptions options = new ChromeOptions(); //创建谷歌浏览器配置对象
options.addArguments("--remote-allow-origins=*", "-headless");//配置参数
WebDriver driver = new ChromeDriver(options);//创建驱动对象
下面用driver表示驱动对象;
Selenium
Selenium 是 编写web自动化测试脚本的工具,提供了许多方法供开发者使用。
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.6.0</version>
</dependency>
元素定位
web自动化测试的核心操作是能找到页面对应的元素,然后才能对元素进行具体的操作,常见元素定位的方式很多,但常用的是cssSelector和xpath;
cssSelector



xpath
XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点,xpath使用路径表达式来选择xml文件中的节点;生成xpath的方式:同selector一样,只是右键选择复制"Copy xpath";
//*:获取HTML页面中的所有节点;
//ul :获取HTML页面所有ul节点;
//input:获取HTML页面所有input节点;
//input/..:获取input 节点上一级;
常用函数
操作测试对象
//输⼊⽂本后⼜想换⼀个新的关键词,这⾥就需要⽤到 clear()
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
获取信息
//如何判断获取到的元素对应的⽂本是否符合预期呢?获取元素对应的⽂本并打印⼀下~~String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("打印的内容是:"+bdtext);
窗口
driver.quit();关闭所有页面窗口,关闭浏览器驱动程序进程;
driver.close(); 关闭窗口,(要确保当前窗口没有被关闭,一般很少用colse(),因为用quit()关闭页面,释放驱动更方便);
driver.manage().window().maximize(); 窗口最大化
句柄用来标识页面,一个页面一个句柄;
driver.getWindowHandle(); 获取当前页面句柄
driver.getWindowHandles(); 获取所有页面句柄
driver.switchTo().window(w); 驱动控制句柄为w的页面
//驱动控制最新的页面,切换驱动的句柄
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for( String w : allWindow){if(w!=curWindow){driver.switchTo().window(w);}
}
屏幕截图
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);//文件形式保存截图FileUtils.copyFile(file, new File(filename));//file放在指定位置
类型 | 方法 | 特点 |
---|---|---|
视口截图 | getScreenshotAs() | 只捕获当前可见区域 |
全屏截图 | getFullPageScreenshotAs() | 捕获整个页面(需要浏览器支持) |
等待
一般程序代码执行很快,但是页面还没有渲染出来,所以需要等待一下页面渲染;
强制等待
隐式等待
implicitlyWait()
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));//隐式等待两秒
参数:Duration类中提供毫秒、秒、分钟等方法;
显示等待
WebDriverWait wait= new WebDriverWait(driver,Duration.ofSeconds(3)) //参数为驱动对象和等待时间
.until(ExceptedConditions.elementToBeClickable(By.cssSelector("#id"))); //指定停止等待的条件
驱动driver在3秒内,如果“#id”这个元素可以被点击的条件满足则停止等待,继续执行;
优点:不会浪费太多时间,灵活,不同操作设置不同等待条件;
缺点:配置条件有点麻烦;
注意:
隐式等待和显示等待混用可能导致等待时间不可预测;
DOM的定义:
DOM是HTML/XML文档的编程接口,它将文档表示为节点树结构,允许程序和脚本动态访问和更新文档内容、结构和样式。
条件 | 检查内容 | 适用场景 |
---|---|---|
presence_of_element_located | 仅DOM存在 | 快速检查元素注入 |
visibility_of_element_located | DOM+可见性 | 需要交互的元素 |
element_to_be_clickable | DOM+可见性+可点击状态 | 按钮/链接等 |
节点类型 | 数值代码 | 示例 |
---|---|---|
Element | 1 | <div> , <p> 页面标签元素 |
Attr | 2 | class="example",属性 |
Text | 3 | 文本信息 |
Comment | 8 | <!-- 注释 --> |
Document | 9 | 整个文档对象 |
浏览器导航
driver.navigate( ).to(); 打开网站
简易写法:driver.get(" "); 打开网站,
dirver.navigate().back(); 后退页面
diver.navigate().forward(); 前进一个页面
diver.navigate().refresh(); 刷新页面
弹窗
弹窗在页面,driver找不到任何元素,只能先处理弹窗。
文件上传
WebElement ele = driver.findElement(By.cssSelector("body > div > div >
input[type=file]"));
//输入地址
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
浏览器参数设置
我们在编写自动化测试脚本的时候需要通过运行的界面来调试我们的脚本,但脚本编写完在测试程序的过程中是不需要浏览器展示测试过程的.这时需要给脚本配置无头模式.
无头模式(Headless Mode) 是指让浏览器在没有图形用户界面(GUI) 的情况下运行.
ChromeOptions option=new ChromeOptions();
option.addArguments("--remote-allow-origins=*");//运行驱动打开任何界面
option.addArguments("-headless"); //设置无头模式