自动化测试 selenium
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
一、了解自动化测试和selenium
1. 什么是自动化测试为什么要使用自动化测试
自动化测试能够代替一小部分的手工测试提高测试的效率。比如在回归测试时当软件的版本不断跟新而以前的每一个旧的版本仍然需要进行测试如果是手工测试的话效率会大大降低所以我们需要借助自动化测试来进行回归测试。
2. 为什么使用selenium
1开源免费
2支持多浏览器。Chrome、Firefox、IE、edge、SafariMac默认浏览器....
3支持多系统。Linux、Windows、MacOS....
4支持多语言。Java、Python...
5selenium 底层实现了很多可供我们使用的API。
3. 环境部署
- selenium 工具包
- Chrome浏览器
- Chromedriver谷歌驱动
- java版本最低要求8
4. 什么是驱动驱动的工作原理
类似汽车的驱动一样汽车有两轮驱动、四轮驱动可以让那个汽车跑起来。这里的驱动是指打开浏览器。
因为要使用自动化测试人工测试要打开浏览器自动化测试里就使用驱动来打开浏览器。我们可以通过代码来让驱动打开浏览器。
selenium 和 驱动 和 浏览器 之间的关系
根据图中代码要发送请求驱动要接收请求、解析请求。因此这里是驱动就是一个服务器。其IP127.0.0.1端口号9515 。可以打开驱动的文件看到
5. selenium 的依赖代码
在Maven项目中的 pom.xml 中导入 selenium 的依赖。也可以在Maven Repository: Search/Browse/Explore 搜索selenium 找到依赖代码
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
二、selenium 的基础语法
1. 元素的定位
driver.findElement() 定位页面的元素
参数抽象类By里的方法如cssSelector、xpath、id、name、classname。
下面的代码只是使用方法代码进行自动化测试还要加上 获取drive对象传入百度的URL。最后还要关闭驱动
1css选择器的定位
css选择器
- 基础选择器id选择器、类选择器、标签选择器...
- 符合选择器子类选择器、父类选择器...
public void dingwei_Test1(){
//1. css选择器的定位
String xwtext = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
//将结果在控制端进行显示方便看操作
System.out.println("xwtext : " + xwtext);
}
2xpath 路径
定位元素必须要唯一。
语法
- 层级/ 次级// 跳级
- 属性@
- 函数contains() .....
public void dingwei_Test2() throws InterruptedException {
//2. xpath选择器
driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("selenium");
driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
Thread.sleep(2000);
driver.findElement(By.xpath("//*[@id=\"2\"]/div/div/h3/a")).click();
Thread.sleep(2000);
}
2. 元素的操作
1点击click() 提交submit()
click 和 submit 回车都可以操作按钮但是可以click 不一定可以 submit。只要是页面元素都可以 click。
public void control_Test1() throws InterruptedException {
//1. click点击行为
//点击百度一下
driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
Thread.sleep(2000);
//点击百度热搜里的一个链接
driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title")).click();
Thread.sleep(2000);
}
public void control_Test2() throws InterruptedException {
//2. submit提交行为
driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
Thread.sleep(2000);
driver.findElement(By.cssSelector("#su")).submit();
Thread.sleep(2000);
}
2模拟按键输入sendKeys()
driver.findElement(By.cssSelector("#kw")).sendKeys("#@$@^@$");
3清除文本内容 clear()
driver.findElement(By.cssSelector("#kw")).clear();
4获取文本 getText()
要分清是文本内容还是属性值。
获取文本内容getText()
获取属性值getAttribute()
获取文本内容
public void control_Test5() { //5.获取文本内容 String str = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText(); System.out.println("预期输出端牢中国饭碗 综合实施保夏收 实际输出" + str); }
获取属性值
public void control_Test6() { //6. 获取属性值 String str = driver.findElement(By.cssSelector("#su")).getAttribute("value"); System.out.println("预期获取的属性值百度一下 实际输出" + str); }
3. 等待
代码的执行速度比较快当我们跳转到新的页面的时候前端的代码还需要一定的时间锦绣柠渲染。因此我们不能在前端页面渲染的时候就执行下一条语句。因此要使用等待。
1强制等待
让程序暂停一会等待指定的时间之后再让程序正常运行。这个时间要人为的自己规定不能太短也不能太长
Threat.sleep(2000)
public void WaitTest1() {
//1. 强制等待使用Thread.sleep
driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
//强制等待2秒
Thread.sleep(2000);
//点击百度热搜里的一个链接
driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title")).click();
//再强制等待2秒
Thread.sleep(2000);
}
优点语法简单适合调试的时候使用。
缺点每次都等待固定的时间造成时间的大量消耗。减小了自动化测试的效率。
2隐式等待
在规定的时间范围内一轮询的方式执行。当要执行的元素可以定位就结束等待如果没有在规定的时间内定位到就轮询的方式一直判断。
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
优点节省了大量的等待时间。
缺点要等到所有元素全部显示才会执行仍有不必要的时间浪费。
3显式等待
针对某一个元素的显示来进行等待。
WebDriverWait foo = new WebDriverWait(driver,Duration.ofSeconds(3));
foo.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("")));
第一个参数webdriver对象
第二个参数Duration 类方法用于设置强制等待时间。
until 方法等待到括号里的条件满足为止。
优点针对某一个元素进行等待大大缩短了等待时间。
缺点写法更为复杂。
4. 信息的打印
打印标题gettitle()
String str = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
打印属性getAttribute()
String str = driver.findElement(By.cssSelector("#su")).getAttribute("value");
5. 窗口
1窗口的切换
selenium 不知道要切换哪一个页面所以就直接操作打开的第一个页面。当我们想操作新打开的新页面的时候就要手动切换句柄。否则不能找到新页面的元素。选择器选择不到会报错
获取当前的页面的句柄driver.getWindowHandle() 返回值String
String str = driver.getWindowHandle();
获取所有页面的句柄driver.getWindowHandles() 返回值Set
Set<String> set = driver.getWindowHandles();
切换到指定的句柄driver.switch.window(句柄)
Set<String> set = driver.getWindowHandles();
for(String str : set) {
if (!str.equals(driver.getWindowHandle())) {
driver.switchTo().window(str);
}
}
2窗口的大小
描述窗口 driver.manage.window()
窗口的最大化driver.manage.window.maxmize()
窗口的最小化driver.manage.winsow.minmize()
@Test
public void testWindowSize(){
WebDriver.Window window = driver.manage().window();
window.maximize();
window.minimize();
}
指定窗口大小driver.manage.window.setSize(new Dimension(宽度高度))
3页面的上下滚动
driver.executeScripe(" "); 里面传的是JS代码。
6. 导航
driver.navigate()
1前进
driver.navigate().forward();
//前进
driver.navigate().forward();
2后退
driver.navigate().back();
//后退
driver.navigate().back();
7. 警告框弹窗
使用接口Alert。
切换到警告框Alert alert = driver.switchTo().alert();
点击确认按钮alert.accept();
点击取消按钮alert.dismiss();
输入信息sendKeys(" ");
8. 鼠标和键盘的操作
使用接口Actions。需要实例化一个Actions。
Actions actions = new Actions(driver)
1鼠标
移动到指定元素并保持actions.clickAndHold(Webelement ele).perform();
@Test
public void testClick(){
WebElement element = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"));
Actions actions = new Actions(driver);
actions.clickAndHold(element).perform();
}
移动到指定元素并点击actions.click().perform();
@Test
public void testClick2(){
WebElement element = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"));
Actions actions = new Actions(driver);
actions.click(element).perform();
}
2键盘
sendKeys(" ");
9. 选择框
使用类 Select。先实例化一个对象。
Select select = new Select(Webelement ele);
选择方法有三种
通过索引来选择 selece.selectByIndex(); 参数索引值从0开始。
通过value属性来选择select.selectByValue("value");
通过可见的文本来选择select.selectByvisibleText(" ");
10. 文件上传
selenium 不能操作系统的窗口。
巧方法使用sendKeys传入文件的路径 + 文件名。
driver.finElement(By.).sendkeys(" 文件的路径 + 文件名 ");
11. 屏幕截图
进行截图File srcfile = driver.getScreenshotAs(OutputType.File); 以文件形式保存
截图保存到指定路径下
File filename = new File("路径 + 指定的截图名");
FileUtils.copyFile(srcfile, filename);
一般将屏幕截图的方法写在Common类中在要用的方法的里面直接调用。