作者:~小明学编程
文章专栏:测试开发
格言:热爱编程的,终将被编程所厚爱。
目录
什么是自动化,我们为什么需要自动化的测试?
为什么选择selenium来作为我们的web自动化测试的工具?
定位元素
使用cssSelector定位
使用Xpath定位
操作元素
点击
模拟按键输入
清空输入框
获取文本
等待
操作界面
打印操作
窗口
窗口的切换
窗口的大小设置
浏览器的前进和后退
关闭弹窗
鼠标操作
键盘操作
上传文件
屏幕截图
什么是自动化,我们为什么需要自动化的测试?
自动化就是让程序代替手来帮助我们去测试一部分的功能,随着我们软件功能的增加,版本越来越大,版本回归的压力也越来越大,想要都通过手来测试是不现实的这个时候就需要我们借助自动化测试来帮助我们完成一部分的测试。
为什么选择selenium来作为我们的web自动化测试的工具?
- 首先selenium是免费开源的。
- 支持多浏览器例如,chrome,firefox,edge,ie等。
- 支持多系统例如:Linux,windows,macos等。
- 支持多语言,例如java,python等。
- selenium提供了很多可使用的API。
定位元素
使用cssSelector定位
public class FirstAuto {
public void test() throws InterruptedException {
//创建一个驱动对象来打开浏览器
ChromeDriver chromeDriver = new ChromeDriver();
Thread.sleep(3000);
//输入百度的网址
chromeDriver.get("https://www.baidu.com");
Thread.sleep(3000);
//找到百度输入框,并且输入关键字周杰伦
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
Thread.sleep(3000);
//找到百度按钮并且点击
chromeDriver.findElement(By.cssSelector("#su")).click();
Thread.sleep(3000);
//释放驱动对象并且关闭浏览器
chromeDriver.quit();
}
}
方法很简单主要就是我们找到css所对应的标签,然后点击标签就行了。
ChromeDriver driver = new ChromeDriver();
public void test1() throws InterruptedException {
driver.get("https://www.baidu.com");
Thread.sleep(3000);
//定位标签,并打印标签内容
String str = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
System.out.println(str);
close();
}
//关闭驱动
public void close() {
driver.quit();
}
使用Xpath定位
public void xpathTest() throws InterruptedException {
driver.get("https://www.baidu.com");
Thread.sleep(3000);
driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("周杰伦");
Thread.sleep(3000);
}
我们需要注意的是当我们定位文本的时候要保证我们定位的路径是唯一的。
操作元素
点击
常规操作包括文本清除、文本输入、单击元素、提交表单、获取元素值等:
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
//定位输入框,并且输入火锅
driver.findElement(By.id("kw")).sendKeys("火锅");
Thread.sleep(2000);
//定位到 ‘百度一下’ 并单击
driver.findElement(By.id("su")).click();
Thread.sleep(3000);
//定位到 火锅 贴吧
driver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-tieba_3gnzZ.s-tab-tieba")).click();
//获取文本
String text = driver.findElement(By.cssSelector("#pagelet_frs-header\\/pagelet\\/head > div > div.head_content > div.card_top_wrap.clearfix.card_top_theme > div.card_top.clearfix > p")).getText();
System.out.println(text);
//隐式等待,等待超过三秒就抛出异常
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//清除输入框
driver.findElement(By.id("wd1")).clear();
Thread.sleep(3000);
driver.quit();
}
关于点击事件我们要注意一下,当我们百度的时候我们定位到元素然后会使用click()来点击同时我们也可以用submit()的方法来提交,但是我们的click()方法比较万能直接就可以点击我们指定的位置,而submit则不行没有输入框的时候不能submit。
模拟按键输入
driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("周杰伦");
就像我们上面的这段语句,sendKeys方法可以模拟我们用户的按键输入。
清空输入框
我们的clear()方法可以将我们定位到的输入框里面的东西清理完毕。
public void test2() throws InterruptedException {
driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
Thread.sleep(3000);
driver.findElement(By.cssSelector("#kw")).clear();
}
获取文本
getText()方法用于获取到我们定位的位置的文本。
String str = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
我们在自动化测试的时候我们不知道我们的这块文本正不正确所以有时候我们需要对齐进行一个打印。
注意:我们这里获取的是文本值当我们想要获取属性值的时候要用getAttribute()来进行获取。
等待
先看一段程序:
public void waitTest() throws InterruptedException {
driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
driver.findElement(By.cssSelector("#su")).click();
// Thread.sleep(3000);
driver.findElement(By.cssSelector("#\\34 > div > div:nth-child(1) > h3"));
}
这里直接给我们报错了,然后下面我们把sleep()给放开。
报错奇迹般的就没了,这是因为我们刚刚没有让我们的线程暂停的时候我们的程序执行的速度非常的快,我们的下一个界面还没有渲染好呢我们就开始定位元素了,所以最后没有点位到我们指定的元素导致最后就报错了,在我们给加上一个线程休眠之后我们的前端页面就渲染好了。
但是这样的方式会浪费很多的时间,我们的下面的这种方式会更好。
隐式等待:
public void waitTest() throws InterruptedException {
driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
driver.findElement(By.cssSelector("#su")).click();
// Thread.sleep(3000);
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));
driver.findElement(By.cssSelector("#\\34 > div > div:nth-child(1) > h3"));
}
这种等待的方式是在我们限定的时间内如果页面全部加载完毕我们就进行定位,但是需要我们的页面全部加载完毕,后面的页面也许我们就不需要这样又会导致我们浪费一些时间。
显式等待:
强制等待可以针对我们某一个元素进行等待。
public void waitTest() throws InterruptedException {
driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
driver.findElement(By.cssSelector("#su")).click();
// Thread.sleep(3000);
// driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));
//传入驱动和等待的时间
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));
//等待的条件
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#\\34 > div > div:nth-child(1) > h3")));
// driver.findElement(By.cssSelector("#\\34 > div > div:nth-child(1) > h3"));
close();
}
操作界面
打印操作
public void printTest() {
String title = driver.getTitle();//打印标题
System.out.println("title:"+title);//title:百度一下,你就知道
String url = driver.getCurrentUrl();//获取当前的url
System.out.println("url:"+url);//https://www.baidu.com/
}
我们可以根据一些方法来打印我们当前页面的一些信息。
窗口
窗口的切换
public void printTest() {
String title = driver.getTitle();//打印标题
System.out.println("title:"+title);//title:百度一下,你就知道
String url = driver.getCurrentUrl();//获取当前的url
System.out.println("url:"+url);//https://www.baidu.com/
driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
String title1 = driver.getTitle();//打印标题
System.out.println("title:"+title1);//title:百度一下,你就知道
String curWindow = driver.getWindowHandle();//获取当前的句柄
Set<String> windows = driver.getWindowHandles();//获取所有的句柄
for (String window:windows) {
if (window!=curWindow) {
driver.switchTo().window(window);//切换到点击后的句柄
}
}
String title2 = driver.getTitle();//打印标题
System.out.println("title:"+title2);//title:百度一下,你就知道
}
我们每一个窗口都有属于自己的一个句柄,我们的程序在点击之后是不能自己去切换句柄的,需要我们调用相关的方法然后去切换句柄。
窗口的大小设置
public void window() throws InterruptedException {
driver.manage().window().maximize();//将窗口设置为最大
Thread.sleep(2000);
driver.manage().window().minimize();//将窗口设置为最小
Thread.sleep(2000);
driver.manage().window().setSize(new Dimension(500,500));//自定义大小
}
我们可以同上上面的一些方法来设置我们的窗口的大小。
浏览器的前进和后退
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("火锅");
driver.findElement(By.id("su")).click();
Thread.sleep(3000);
//后退
driver.navigate().back();
Thread.sleep(3000);
//前进
driver.navigate().forward();
Thread.sleep(3000);
driver.quit();
}
我们可以通过navigate().来选择我们的前进和后退意味着我们前进到下一个页面后者后退到前一个页面。
关闭弹窗
常见的弹窗有两种:一种是我们可以定位的弹窗,一种是我们不能定位的弹窗。
这种弹窗就是我们可以定位的弹窗我们只需要定位到指定位置然后触发点击时间就乐意解决了,还有一种就是我们无法定位的弹窗,也就是警告弹窗。
对于这种弹窗我们要想关闭就不能那么简单了。
public void alert() throws InterruptedException {
driver.findElement(By.cssSelector("#tooltip")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();//跳转到弹窗
alert.accept();//点击确认,如果有取消按钮就用dismiss()方法
Thread.sleep(2000);
}
鼠标操作
这里提供了一些关于鼠标的操作用来模拟我们鼠标的移动双击右键等一系列的操作。
键盘操作
selenium 中的 org.openqa.selenium.Keys 类提供了键盘上几乎所有按键的方法。 sendKeys() 方法可以用来模拟键盘输入,可以用它来输入键盘上的按键, 组合键。
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
WebElement element = driver.findElement(By.cssSelector("#kw"));
//输入框输入内容
element.sendKeys("周杰伦");
Thread.sleep(2000);
//删除最后一个文字
element.sendKeys(Keys.BACK_SPACE);
Thread.sleep(2000);
//输入空格键
element.sendKeys(Keys.SPACE);
Thread.sleep(2000);
//ctrl+a 全选输入框内容
element.sendKeys(Keys.CONTROL, "a");
Thread.sleep(2000);
//通过回车键盘来代替点击操作
element.sendKeys(Keys.ENTER);
Thread.sleep(2000);
//F5按键刷新页面
Actions action=new Actions(driver);
action.sendKeys(Keys.F5);
Thread.sleep(3000);
driver.quit();
}
这里简单的给大家介绍几个操作。
上传文件
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
driver.findElement(By.xpath("//span[@class='soutu-btn']")).click();
//上传按钮为input标签,定位上传按钮
WebElement element = driver.findElement(By.xpath("//input[@class='upload-pic']"));
Thread.sleep(2000);
//输入文件路径,上传文件
element.sendKeys("D:\\download\\test.jpg");
Thread.sleep(3000);
driver.quit();
}
首先定位到我们指定的位置,然后我们通过sendKeys()的方式来进行上传文件。
屏幕截图
public void picture() throws IOException {
driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
driver.findElement(By.cssSelector("#su")).click();
//屏幕截图
File file = driver.getScreenshotAs(OutputType.FILE);
File file1 = new File("D:\\.1学习资料\\1.jpg");
FileUtils.copyFile(file,file1);
driver.findElement(By.cssSelector("#\\31 > div > section > div.container_EBGt2.fold_2kZgh > div:nth-child(2) > div > section:nth-child(1) > div > div.title_1v7d9 > a"));
}
这里报错了,我们可以看到原因是我们的页面还没加载好呢
我们只需要在新页面加载之前停一下就可以解决问题了。