selenium自动化测试
1、Java+selenium环境搭建
下载chromedriver,版本要与Chrome浏览器版本一致。
下载之后将chromedriver.exe
复制到jdk
的bin
目录下。
新建一个项目,在pom
文件中引入selenium
的依赖:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.7.2</version>
</dependency>
2、测试,打开任意网页
public class Main {
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com/");//打开百度
}
}
3、selenium 常见的Api
3.1元素定位findElement
3.1.1 css 选择语法
- id选择器 #id
- 类选择器 .class
- 标签选择器 标签名
- 后代选择器 父级选择器 子级选择器
3.1.2 xpath 选择语法
-
绝对路径:/html 不常用
-
相对路径:
双斜杠//开头
相对路径+索引 ,索引下标1
开始
//form/span[1]/input
//form/span[2]/input
相对路径+属性值
//input[@class="s_ipt"]
//input[@id="su"]
相对路径+通配符
//*[@*="su"]
表示路径下所有属性等于“su”
相对路径+文本匹配
//a[text()="新闻"]
3.1.3 春招面试题
1)、定位一个元素有哪几种方式?(通过什么方式定位元素)
css选择器
和 xpath选择器
2)、css选择器
和 xpath选择器
哪个更好?
css选择器
更好,定位元素效率更高。
3.2 webDriver 中常用操作对象的方法
- click 点击对象
- sendKeys 在对象上模拟按键输入
- clear 清除对象输入框的文本内容
- submit 提交
- text 用于获取元素的文本信息
- getAttribute
private static void test03() throws InterruptedException {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com/");//打开百度
sleep(3000);
//在百度一下输入框 输入内容
webDriver.findElement(By.cssSelector("#kw")).sendKeys("Java107");
//点击百度一下按钮
webDriver.findElement(By.cssSelector("#su")).click();
//webDriver.findElement(By.cssSelector("#su")).submit();
sleep(3000);
//清空百度输入框
webDriver.findElement(By.cssSelector("#kw")).clear();
}
注意:如果点击的元素放在 form 标签中,此时使用 submit 实现的效果和 click 是一样的;但是,如果点击的元素放在非 form标签中使用 submit 会报错
private static void test04() throws InterruptedException {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com/");//打开百度
sleep(3000);
webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();//会报错
//webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).click();//正常执行 不会报错
}
使用getAttribute
获取百度一下按钮的value属性值
private static void test05() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com/");//打开百度
String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
//System.out.println(button_value);
if (button_value.equals("百度一下")){
System.out.println("测试通过");
}else {
System.out.println("测试不通过 "+ button_value);
}
}
3.3 webDriver 中获取页面的url 和title
private static void test06() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com/");//打开百度
String url = webDriver.getCurrentUrl();
String title = webDriver.getTitle();
if (url.equals("https://www.baidu.com/") &&
title.equals("百度一下,你就知道")){
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
}
4、等待
- sleep 强制等待
- 隐式等待
- 显示等待
假设等待3天时间:
如果等待时间为3天,那么强制等待会一直等待,等待的时间是3天;但是,隐式等待最长等待3天,如果3天内获取到页面上的元素,此时可执行下面的代码,若等待3天时间还是没获取到元素,直接报错。
//隐式等待
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);//隐式等待
//显示等待
WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(3000));//显示等待
private static void test07() {
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com/");//打开百度
//显示等待
WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(3000));//显示等待
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title")));
wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
}
隐式等待和显示等待的区别:
隐式等待:
是等待页面所有元素都加载出来之后才执行下面的代码,如果设置等待时间为 3 s,超过 3 s 还没加载出来就报错了。不能针对某个确定的条件进行等待。
显示等待:
他是有一个后续的等待条件,如果满足了这个条件,不管页面元素加没加载完。
5、浏览器操作
- 浏览器前进
webDriver.navigate().forward();
- 浏览器后退
webDriver.navigate().back();
- 浏览器滚动条操作
private static void test01() throws InterruptedException {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com/");//打开百度
//搜索329
webDriver.findElement(By.cssSelector("#kw")).sendKeys("329");
//强制等待3 s
sleep(3000);
webDriver.findElement(By.cssSelector("#su")).click();
//浏览器后退
sleep(3000);
webDriver.navigate().back();
sleep(3000);
//刷新
webDriver.navigate().refresh();
//浏览器前进
sleep(3000);
webDriver.navigate().forward();
sleep(3000);
((JavascriptExecutor) webDriver).executeScript("document.documentElement.scrollTop=10000");
//浏览器最大化
webDriver.manage().window().maximize();
sleep(3000);
//全屏
webDriver.manage().window().fullscreen();
sleep(3000);
//设置宽、高
webDriver.manage().window().setSize(new Dimension(600,1000));
}