目录
一 了解自动化和selenium
😶🌫️什么是自动化?
自动化测试能够代替一部分手工测试并且能够提高测试效率。随着功能的增加,版本越来越多,版本回归的压力越来越大,仅仅通过人工测试来回归所有的版本是不现实的,所以我们需要借助自动化工具来进行回归。
😶🌫️为什么选择selenium作为web自动化工具
1.开源免费
2.支持多语言。如Java,python
3.支持多浏览器。如Chrome,Firefox,IE,edge,Safari
4.支持多系统。如Linux,Windows,MacOS
5.selenium包底层有很多可使用的API
😶🌫️环境部署
selenium工具包
Chrome浏览器
Chromedriver谷歌驱动
Java版本不低于8
😶🌫️什么是驱动?
计算机里的驱动程序,可以驱动计算机和设备工作起来。在人工测试的情况下,是人工手动打开浏览器,而自动化测试中需要借助驱动程序来协助打开浏览器。
😶🌫️selenium+驱动+浏览器
😶🌫️第一个简单的自动化实例
二 掌握selenium的基础语法
😶🌫️定位元素的方法
❤️css选择器
public class autotest1 {
//创建一个驱动对象
private ChromeDriver driver = new ChromeDriver();
public void startDriver(){
driver.get("https://www.baidu.com");
}
public void locate_test(){
//css选择器
String xwtest = driver.findElement(By.cssSelector("#su")).getText();
}
public void closeddriver(){
driver.quit();
}
}
public class runAutotest {
public static void main(String[] args) throws InterruptedException {
autotest1 test = new autotest1();
test.startDriver();
test.locate_test();
test.closeddriver();
}
}
❤️xpath
语法:
层级:/子级 //跳级
属性:@
函数:contains()...
public void locate_test() throws InterruptedException {
//xpath
driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("亚运会");
Thread.sleep(3000);
}
注意:定位元素必须要唯一
😶🌫️元素的操作
❤️ 点击:click 提交:submit
click 和 submit都可以操作按钮,submit点击的元素必须都在form表单中,click并没有要求。
public void control_test() throws InterruptedException {
//click点击行为
driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
driver.findElement(By.cssSelector("#kw")).click();
//submit提交行为
driver.findElement(By.cssSelector("#kw")).sendKeys("杭州亚运会");
Thread.sleep(3000);
driver.findElement(By.cssSelector("#su")).submit();
Thread.sleep(3000);
//submit可不可以提交新闻-->不可以
driver.findElement(By.cssSelector("#lm-new")).submit();
Thread.sleep(3000);
}
❤️模拟按键输入:sendkeys
//模拟按键进行sendkeys
driver.findElement(By.cssSelector("#kw")).sendKeys("亚运会开幕式");
Thread.sleep(3000);
❤️清除对象输入的文本内容:clear()
//clear清除对象输入的文本内容
driver.findElement(By.cssSelector("#kw")).sendKeys("亚运会开幕式");
Thread.sleep(3000);
driver.findElement(By.cssSelector("#kw")).clear();
Thread.sleep(3000);
driver.findElement(By.cssSelector("#kw")).sendKeys("亚运会火炬点燃");
Thread.sleep(3000);
❤️获取文本:gettext
注意:获取文本是getText(),获取属性值是getAttribute()。
type,id,value,class都是属性
//获取文本:gettext
String txt = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(2) > a > span.title-content-title")).getText();
System.out.println("期望的文本:丰收里的中国色 实际的文本:"+txt);
注意:
//百度一下按钮上的"百度一下"文字不是文本,而是value的属性值,所以这里打印出来的文本为空
String txt = driver.findElement(By.cssSelector("#su")).getText();
System.out.println("期望的文本:百度一下 实际的文本:"+txt);
//如何获取属性值
String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");
System.out.println("期望的属性值:百度一下 实际的属性值:"+txt);
}
❤️添加等待
当代码执行速度比较快,前端页面还没有渲染的速度相对慢一点,这就导致代码已经执行到下一步了,页面还没有渲染出来,元素找不到。这时候就需要添加等待。
等待分为三个:强制等待、隐式等待、显式等待
强制等待:让程序暂停一会,等待指定时间之后继续执行下一步。
优点:语法简单,适合调试的时候用
缺点:需要等待固定的时间,造成测试时间大量消耗,大大减少自动化测试效率
隐式等待:在固定的时间范围内频繁的轮询元素是否存在,作用于webdriver的整个生命周期。
优点:节省了大量等待的时间,元素展示之后就执行下一步,执行效率高
缺点:需要等待所有元素都展现才会执行下一步,仍然会有额外的时间浪费
显式等待:针对某一个元素来进行等待,在固定的时间范围内频繁的轮询元素是否存在。
优点:针对某一个元素进行等待,极大的降低了自动化的等待时间
缺点:写法复杂
public void wait_test() throws InterruptedException {
//不添加等待页面没有渲染完成,导致最后一步的查找页面元素失败
//1.添加强制等待3s再进行页面查找,结果成功
driver.findElement(By.cssSelector("#kw")).sendKeys("我的天才女友");
driver.findElement(By.cssSelector("#su")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector("#\\31 > div > h3 > a > div > div > p > span > span > em"));
//隐式等待
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
driver.findElement(By.cssSelector("#kw")).sendKeys("我的天才女友");
driver.findElement(By.cssSelector("#su")).click();
driver.findElement(By.cssSelector("#\\31 > div > h3 > a > div > div > p > span > span > em"));
//显式等待
WebDriverWait wait = new WebDriverWait(driver,5);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#kw")));
}
❤️信息打印
1.打印标题:getTitle()
2.打印当前Url:getCurrentUrl()
//信息打印
public void printtest(){
//打印标题
String title = driver.getTitle();
System.out.println("title:"+title);
//打印Url
String curUrl = driver.getCurrentUrl();
System.out.println("curUrl:"+curUrl);
}
❤️窗口
句柄:selenium对每一个标签页都给了唯一标识,成为句柄。
1.获取当前页面的句柄:getWindowHandle()-->返回值String类型的字符
2.获取所有页面的句柄:getWindowHandles()-->返回值String类型的集合
3.窗口大小变换:
driver.manage().window().maximize()
driver.manage().window().setSize(new Dimension(宽度,高度))
4.置顶置底:driver.executeScript()
❤️导航
1.前进:driver.navigate().forward();
2.后退:driver.navigate().back();
❤️弹窗
普通弹窗:可以在前端代码里定位到的-->driver.findElement();
警告弹窗+确认:不可以在前端代码里定位到的
-->切换到弹窗上Alert alert = driver.switchTo().alert();
-->点击确认按钮alert.accept();
-->或点击取消按钮alert.dismiss();
提示弹窗+输入:
Alert alert = driver.switchTo().alert();
alert.sendKeys("xxx");
❤️鼠标、键盘操作
selenium提供了Actions接口
❤️选择框
selenium提供了select接口
❤️文件上传
页面中点击文件上传会弹出来系统窗口,selenium不能操作系统窗口。这时候通过sendKeys()方法输入要上传的文件路径以及文件名。
❤️屏幕截图
代码的执行速度比页面渲染速度快,通过截图来留证
driver.getScreenshotAs(OutputType.x)-->x可以选择File,Base64,bytes