目录
一、认识自动化测试
Ⅰ为什么要做自动化测试
Ⅱweb自动化为什么选择selenium(4个主要原因)
①开源免费
②支持多浏览器
③支持多语言
④包底层有很多API
Ⅲ下载浏览器驱动
Ⅳ驱动的工作原理
selenium、驱动、浏览器三者之间的关系
二、使用selenium进行测试的步骤(第一个selenium测试程序)
第一步:新建一个maven项目,并且添加依赖:
第二步:新建一个测试类(FirstTest)
第三步:运行程序,观察结果
三、selenium的基本语法
第一步:新建一个类(WebTest1),并且明确使用哪一个浏览器的驱动
第二步:编写一个退出测试(quit)的方法
第三步:在开始和结束之间,编写定位元素的方法(locateTest)并在里面编写选择器定位
①CSS选择器定位
②xpath定位选择器
第四步:在locateTest方法内部编写元素的操作
A.click():点击
B.submit():提交
编辑
submit和click的区别
C.send_keys
D.清除(clear)
E.获取文本getTest()
F.获取属性getAttribute()
总结:
测试类整体代码:
常见等待机制
为什么要有等待的机制?
1、强制等待
2、隐式等待
3、显示等待
三种等待方式总结:
自动化测试可以代替一部分的手工测试,可以提高测试的效率。
在这一篇文章当中,我们提到了:
当进行回归测试的时候,也就是对于历史的版本、历史的功能进行测试。
但是,当版本越来越多,功能越来越多的时候,那么也就需要借助自动化测试来进行回归测试了,它可以代替部分手工测试。
这是一个开源免费的工具
火狐(fire fox)、chrome、IE、edge、Safari
如:Java、python等等。
这些API可以很方便使用,方便调用进行测试。
步骤1:查看edg浏览器的版本(如果有安装)
在下载之前,首先需要查看自己的edg浏览器的版本。
步骤2:点击下面的链接,下载对应的版本
Microsoft Edge WebDriver - Microsoft Edge Developer
步骤3:在这个界面往下拉动,找到如下界面
下载对应的32/64位的内容即可。
步骤4:
下载好之后,找到一个安装包,然后找到里面的exe文件。
步骤5:
把这个exe文件放到jdk的bin目录下面
对于自动化测试来说,代码不可以直接打开浏览器,因此我们需要借助驱动程序来打开浏览器。
org.seleniumhq.selenium
selenium-java
4.0.0
在这个类当中新建一个方法,并且输入以下的内容。
public void baiduTest() throws InterruptedException {
//创建一个驱动对象
EdgeDriver driver=new EdgeDriver();
Thread.sleep(3000);
//输入待测试的网址
driver.get("https://www.baidu.com");
Thread.sleep(3000);
//找到搜索输入框,并且在sendKey当中发送内容
driver.findElement(By.cssSelector("#kw")).sendKeys("hello test!");
Thread.sleep(3000);
//找到"百度一下"的按钮,然后发送
driver.findElement(By.cssSelector("#su")).click();
Thread.sleep(3000);
driver.quit();
}
通过其他类调用这个buildTest方法
public class RunAutoTest {
public static void main(String[] args) throws InterruptedException {
FirstAutoTest firstAutoTest=new FirstAutoTest();
firstAutoTest.baiduTest();
}
}
现在,就可以正常使用了。
可以看到,即使什么也没有做,直接运行程序,也可以正常运行。
/**
* 此处的浏览器为edge浏览器
*/
private EdgeDriver driver=new EdgeDriver();
public void startTest(){
//通过get方法访问到这一个网址
driver.get("https://www.baidu.com");
}
需要在这个方法当中释放驱动对象。
/**
* 释放驱动,退出浏览器
*/
public void endTest(){
//释放驱动的对象
driver.quit();
}
首先,需要找到指定的页面(例如www.baidu.com)
然后,按住fn+f12,打开开发者工具,点击"元素"。
然后右键这个URL,选择:复制selector。下图内容就是复制的元素:
最后,调用driver的findElement方法,通过By这个抽象类传入参数:
/**
* 定位元素的方法
*/
public void locateTest(){
//By的方法传入的参数为edge浏览器对应的选择器(selector)
//返回的参数为这个链接对应的文本名称,类型为String
String test=driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
//输出内容为选择器对应的文本
System.out.println(test);
}
跟CSS选择器类似,只需要右键标签,然后选择复制-->复制xpath。即可复制标签的xpath内容,完成定位。
然后通过下面的方式:
String test= driver.findElement(By.xpath("xpath的内容")).getText();
来获取到输出的内容。
在①和②当中,都是定位到对应的元素(findElement),例如获取到输入框/获取到标签之类的。获取到之后,如果要对它进行一些操作,(例如输入内容,发送消息)等等,就需要涉及到下面的:对于元素(selment)的一系列操作。
点击元素,例如,可以在获取到"新闻"的链接之后,进行点击操作,就可以令浏览器自动点击页面的标签,于是:代码就是下面这样编写:
/**
* 定位元素的方法
*/
public void locateTest() throws InterruptedException {
//By的方法传入的参数为edge浏览器对应的选择器(selector)
//获取到这一个元素:WebElement
WebElement element1=driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
//点击这个元素
element1.click();
Thread.sleep(3000);
}
这个操作也可以操作按钮。
首先 :需要找到输入框对应的CSS选择器。然后调用sendKeys往输入框当中输入字符串。
然后:找到"百度一下"对应的CSS选择器,模拟提交。
/**
* 定位元素的方法
*/
public void locateTest() throws InterruptedException {
//submit提交行为
//找到百度的输入框
driver.findElement(By.cssSelector("#kw")).sendKeys("hello");
//此处模拟的是"提交"
driver.findElement(By.cssSelector("#su")).submit();
}
可以submit的地方都可以click,但是并不是所有的地方都可以"submit"。
模拟按键输入。(也就是往文本框里面输入内容)
也是需要通过findElement方法获取到对应的元素,然后才可以执行:清空文本框的输入内容。
不是说页面上面所有可以看得见的文字,都可以被称之为"文本"。
有一些文字,是input标签的属性值,这个属性值是不可以通过getTest()方法获取到的。
例如:
此时,如果文本输入框当中用户输入了内容,那么getTest()才会获取到输入的内容。
如果文本框当中,没有输入的内容,那么调用getTest()方法也无法获取到文本。
当然,大部分的超链接内容,都不一定视为文本。
还是上面的那个文本输入框,在getAttribute当中传入name,可以获取到value
/**
* 定位元素的方法
*/
public void locateTest() throws InterruptedException {
//获取文本的行为
//获取"百度一下"的文本内容
//body > input[type=submit]
String test=driver.findElement(By.xpath("/html/body/input")).getAttribute("value");
System.out.println(test);
}
public class WebTest1 {
/**
* 此处的浏览器为edge浏览器
*/
private final EdgeDriver driver=new EdgeDriver();
public void startTest(){
//通过get方法访问到这一个网址
driver.get("https://www.baidu.com");
}
/**
* 定位元素的方法
*/
public void locateTest() throws InterruptedException {
//设置最大的等待时间
//如果在这个等待的时间内(下面是秒)
//没有找到下面两个元素,那么直接抛出noSuchElementException
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//输入待测试的网址
driver.get("https://www.baidu.com");
//找到搜索输入框,并且在sendKey当中发送内容
driver.findElement(By.cssSelector("#kw")).sendKeys("hello test!");
//找到"百度一下"的按钮,然后发送
driver.findElement(By.cssSelector("#su")).click();
//指定等待的时间
WebDriverWait webDriverWait=new WebDriverWait(driver,Duration.ofSeconds(3));
//如果寻找的元素没有在指定的时间内
//那么就抛出异常
webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#su")));
}
/**
* 释放驱动,退出浏览器
*/
public void endTest(){
//释放驱动的对象
driver.quit();
}
}
以上是常用的测试一个页面所需要的步骤,下面将介绍几种常见的等待机制。
测试代码执行的速度比较快,而前端页面渲染的速度慢一点,可能导致的结果是:
代码已经执行到下一步了,但是页面还是没有渲染出来。于是就引入了——等待机制。
直接在程序当中调用Thread.sleep(timeout)之后就可以了。
public class WebTest1 {
/**
* 此处的浏览器为edge浏览器
*/
private final EdgeDriver driver=new EdgeDriver();
public void startTest(){
//通过get方法访问到这一个网址
driver.get("https://www.baidu.com");
}
/**
* 定位元素的方法
*/
public void locateTest() throws InterruptedException {
//获取文本的行为
//获取"百度一下"的文本内容
//body > input[type=submit]
Thread.sleep(3000);
//输入待测试的网址
driver.get("https://www.baidu.com");
Thread.sleep(3000);
//找到搜索输入框,并且在sendKey当中发送内容
driver.findElement(By.cssSelector("#kw")).sendKeys("hello test!");
Thread.sleep(3000);
//找到"百度一下"的按钮,然后发送
driver.findElement(By.cssSelector("#su")).click();
Thread.sleep(3000);
}
/**
* 释放驱动,退出浏览器
*/
public void endTest(){
//释放驱动的对象
driver.quit();
}
}
优点:语法简单,适合调用的时候进行调试;
缺点:需要等待固定的时间,造成测试时间的大量消耗
特点1:在规定的时间范围内,轮询等待元素出现之后就立即结束。(相当于不停刷新浏览器)
特点2:如果在规定的时间内元素仍然没有出现,那么就会抛出noSuchElement异常。
特点3:一旦设置了等待时间,那么它将作用于整个driver的生命周期。
特点4:只有所有元素都出现之后,才会进行下一步的操作
//设置最大的等待时间
//如果在这个等待的时间内(下面是秒)
//没有找到下面两个元素,那么直接抛出noSuchElementException
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
优点:节省了大量的等待时间,元素展示之后就可以直接执行下一步了。
缺点:只有等待所有的元素都渲染完成之后,才会进行下一步操作
可以针对某一个元素进行等待。不用像显示等待一样必须要等到下一个元素出现才能查找再下一个元素
//指定等待的时间
WebDriverWait webDriverWait=new WebDriverWait(driver,Duration.ofSeconds(3));
//如果没有在指定的时间内寻找到元素
//那么就抛出异常
webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#su")));
优点:不用像显示等待那样等待上一个元素出现才继续查找下一个元素。可以指定某一个元素进行等待,降低了自动化测试整体的等待时间。
缺点:写法比较复杂。