本篇文章是基于Java编程语言实现自动化测试,因此我们使用Java进行自动化测试时,除了要用到ide等Java开发必备的环境外,我们还需要安装浏览器对应的驱动,我使用的是谷歌浏览器,谷歌浏览器大全传送门,在下载驱动时,首先要去你的浏览器中查看你的浏览器版本,再下载对应的驱动版本
下载完成之后,我们在ide中创建一个新的Maven项目,需要导入selenium的依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
使用selenium编写第一个脚本:
public class BilibiliSearch {
public static void main(String[] args) {
// 实例化一个WebDriver实例
WebDriver driver = new ChromeDriver();
// 访问网址
driver.get("https://www.bilibili.com");
// 通过Selenium实现自动模仿人为在输入框中输入,然后点击搜索按钮
// 找到输入框的位置,输入"软件测试"
driver.findElement(By.className("nav-search-input")).sendKeys("软件测试");
// 找到搜索框的位置,点击搜索
driver.findElement(By.className("nav-search-btn")).click();
// 如果浏览器闪退,我们可通过Thread.sleep方法,让其暂停一段时间,这样我们就能观察到自动化测试的过程
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭浏览器
driver.close();
}
}
下述表明我们当前的网页是通过自动化软件控制的,而不是人工控制
自动化测试的过程:
我们先发起一个Client去让他调用一个Driver,然后我们进行代码的编写,例如发起http请求,这个服务器就是一个http服务器,client调用selenium的API,selenium的底层其实是发送http的请求到Driver,Server层发送一些指令到浏览器,浏览器进行元素查找,以及元素的操作,操作完成之后会将执行结果返回给server端,而server端会将返回结果返回给Client端,并由client端进行后续的处理。
元素定位:
我们为什么要做元素的定位?
例如我们现在任意的打开一个网页,对于人来说我们知道鼠标定位到哪里,我们需要做什么样的事情,而对于代码来说,它不像我们拥有如此聪明的大脑,所以我们必须通过代码告诉它,元素在哪里,你要做什么事情等。
根据ID进行元素的定位:
通过id定位,By.ID,id属性在HTML中是唯一的,因此使用id定位可以确保找到页面上唯一的元素,由于id是唯一的,浏览器在查找元素时可以快速定位到目标元素,提高了定位的效率
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
//在百度页面通过id定位到搜索框,再在搜索框中输入selenium,并显示搜索的结果
public class SeleniumSearch {
public static void main(String[] args) throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
//将浏览器的窗口设置为最大化
webDriver.manage().window().maximize();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.id("kw")).sendKeys("selenium");
webDriver.findElement(By.id("su")).click();
Thread.sleep(2000);
//对于下述代码,如果我们没写selenium4也会自动的进行检测,在代码执行完毕后将浏览器关闭
//而selenium3并不会将其浏览器进行关闭
webDriver.quit();
}
}
但是对于目前市面上大部分流行的软件来说,前端开发使用的都是框架,而框架塑造出来的网页是不会给我们提供id的,那么此时就需要使用其他的方法进行元素的定位。
根据By.className进行元素定位:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
public class BilibiliSearch2 {
public static void main(String[] args) throws InterruptedException {
WebDriver webDriver=new ChromeDriver();
webDriver.manage().window().maximize();
webDriver.get("https://www.bilibili.com/");
//当我们使用findElement方法寻找某个元素时,如果这个元素包含多个,那么它就会自动跳转到第一个
webDriver.findElement(By.className("channel-link")).click();
//如果我们想指定跳转到某个,则可通过指定访问数组中的某个元素实现
List<WebElement> elements = webDriver.findElements(By.className("channel-link"));
//在控制台通过循环打印出class名为channel-link的所有名称
for(WebElement element:elements){
System.out.println(element.getText());
}
elements.get(4).click();
Thread.sleep(3000);
webDriver.quit();
}
}
输出如下所示:
注意:如果我们的className中间有空格(如下所示),就会导致在定位元素时发生异常,此时我们就不能通过className来进行定位了,需要通过css来进行元素的定位
webDriver.findElement(By.className("icon-bg icon-bg__channel")).click()