声明
自动化 开发环境 搭建
环境准备
- JDK 安装并配置完成
- 已经安装好浏览器,这里我们使用 谷歌浏览器
- IDEA 已经安装,直接官网下就可以,社区版免费
浏览器驱动下载
使用 Selenium 需要下载一个 WebDriver ,要注意WebDriver的版本要与浏览器的版本类型一致,否则可能会出异常,我们使用的浏览器版本如下:
所以我们这里要去下载谷歌浏览器对应版本的 WebDriver ,地址如下:
选择和自己浏览器相符合的版本即可,这里我们选择 mac 这个版本,如果是其他系统就选择对应的版本:
如果你的操作系统是mac的话,需要在终端,将目录切换至driver所在的目录,执行如下命令:
xattr -d com.apple.quarantine chromedriver
否则会报如下的错误: MacOS 无法打开“chromedriver”,因为无法验证开发者
IDEA 创建 maven 项目
这里我们选择使用 JAVA 语言来进行开发,selenium框架也有对应的 python 版本,在 jar 管理上,我们使用maven来管理,简单且方便。
我们使用IDEA创建一个maven项目吗,菜单路径: File ->New->Project :
输入项目名和项目路径,点击 Finish 即可:
完成后截图如下:
我们打开 pom .xml文件导入selenium和testNG的依赖包,完整的pom文件信息如下,主要关注依赖的坐标就可以了,添加完依赖包的坐标后,记得刷新一下,把包引进来,没有的,需要等待它下载完成,否则会报红:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="#34;
xmlns:xsi="#34;
xsi:schemaLocation=" #34;>
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SeleniumStudy</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.5</version>
</dependency>
</dependencies>
</project>
这里我们引入了两个依赖包,selenium包和testNG测试框架,引入testNG是方便我们测试。
selenium初探
我们先感受一下selenium的使用,这里我们使用的网站是我们自己开发在本地的项目,我们以最经典的登录为例,登录界面如下:
示例代码如下:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login(){
// 设置驱动
System. setProperty ("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#/");
// 通过ID定位到账户输入框
driver.findElement(By.id("account")).sendKeys("123456@qq.com");
driver.findElement(By.id("password")).sendKeys("123456");
driver.findElement(By.id("login_btn")).click();
try {
Thread.sleep(5000);
} catch (Interrupted Exception e) {
e.printStackTrace();
}
driver.close();
}
}
执行结果如下:
我们在上面实现了一个简单的登录功能,在这个程序中我们可以了解到:
- @Test 是一个TestNG测试框架中的注解,当方法被该注解标识,就可以单独运行,这样就不用写主方法了,后面我们单独开一期,系统的学习一下TestNG的框架
- Web UI 自动化的创建思路,一般都是创建一个WebDriver对象,就相当于你拥有了一个浏览器,然后通过 get() 方法进入你要进行测试的网页,然后再通过元素定位去操作每个元素,这也就是我们通常说的 找对象 ,当操作完成后,最后我们关闭浏览器,释放资源。
- 基本上所有的UI自动化测试,很大的一部分工作内容就是在元素的定位。
Selenium元素定位
By.id定位
该方法即使通过Web元素的id属性来定义,一般情况下如果元素有id,我们就使用id定义,因为id一般都是不重复的,定位准确,我们上面的示例中的元素定义就采用的id定位。
前端页面代码
<input id="password" placeholder="请输入密码" class="el-input__inner">
java 定位代码
driver.findElement(By.id("password"));
By.name定位
该方法与 By.id 方法类似,只不是通过 name 属性来定位的,有的时候,前端元素,它没有id,但是它有name,这个时候我们就可以使用name来定位。
前端页面代码
<input name="email" placeholder="请输入邮箱" class="el-input__inner">
java定位代码
driver.findElement(By.name("email"))
By.className定位
有的时候,他们既没有id也没有name,但是它有className,这个class不是编程中的类,它和id一样,也是前端元素的一种属性,与id不一样的是,id是唯一的,但是className是不唯一的。 前端页面代码
<input name="email" placeholder="请输入邮箱" class="el-input__inner">
<input name="password" placeholder="请输入密码" class="el-input__inner">
java定位代码
// 定位邮箱输入框
driver.findElement(By.className("el-input__inner")).sendKeys("123456@qq.com");
driver.findElement(By.id("password")).sendKeys("123456");
driver.findElement(By.id("login_btn")).click();
在我们的页面,有两个元素,邮箱输入框和密码输入框,他们的 className 都是一样的,但是为什么还是能准确定位到邮箱输入框,这是因为我们在找元素的时候,使用的是 findElement 方法, 使用find_element()查找元素,但有多个元素满足条件时,他只取所有满足条件的元素列表的第1个元素 ,因为邮箱在第一个位置,所以就不会报错,但是如果用这个方法定位密码的输入框就会有问题。
此时就需要使用到 find_element() 方法了,该方法会返回一个 List<E> ,也就是一个数组集合,此时我们可以通过使用 List<E> 中 get(int index) 方法,来取到第二个元素完成元素定位,关键代码如下:
driver.findElement(By.className("el-input__inner")).sendKeys("123456@qq.com");
driver.findElements(By.className("el-input__inner")).get(1).sendKeys("123456");
By.tagName定位
该方法就是通过元素的标签定位,在 html 页面中有很多标签元素,如: input 、 div 、 span 、 button 等等,因此我们也可以使用标签来定位,关键代码如下: 前端页面代码
<input name="email" placeholder="请输入邮箱" class="el-input__inner">
<input name="password" placeholder="请输入密码" class="el-input__inner">
java定位代码
driver.findElement(By.tagName("input")).sendKeys("123456@qq.com");
driver.findElements(By.tagName("input")).get(1).sendKeys("123456");
By.linkText定位
该方法就是专门用来定位超链接文本的,比如我们平台的 数据解读说明 超链接文本,页面如下:
,前端代码如下:
<a class="el-link el-link--primary is-underline">
<span class="el-link--inner">数据解读说明</span>
</a>
这里的登录按钮,我们就可以使用 linkText 定位到,关键代码如下:
driver.findElement(By.linkText("数据解读说明")).click();
By. partial LinkText定位
我们上面定位链接文字的时候,是精确匹配的,我们也可以使用模糊匹配,上面的 数据解读说明 ,我们只需输入 数据解读 ,也可以正常匹配到,关键代码如下:
driver.findElement(By.partialLinkText("数据解读")).click();
By.xpath定位
该定位方法也是用的比价多的,xpath全称为XML Path的简称,他可以通过xpath的语法,定位到页面的每个元素,具体的语法我们就不铺开了,我们讲下使用,现在的浏览器开发者工具很方便,我们可以获取到 xpath 路径,如下图:
相对路径 写法
//*[@id="password"]
绝对路径写法
/html/body/div/div/div/div[2]/form/div[2]/div/div/input
我们推荐使用相对路径写法
java核心代码如下
driver.findElement(By.xpath("//*[@id="password"]")).sendKeys("123456");
By.cssSelector定位
在说css样式选择器之前,我们这里先简单的说一下css,如果我们把元素的前端标签当成毛坯房的话,那么css就相当于给毛坯房装修的,我们这里以输入框做个简单的示例,前端代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset ="UTF-8">
<title>测试</title>
</head>
<body>
<div>
<input placeholder="这是原始的输入框"></input>
</div>
<br/>
<div>
<input id ='input' placeholder="这使用css渲染的输入框"></input>
</div>
</body>
</html>
<style>
#input{
border: 1px solid #cac6c6;
padding : 5px;
min-width: 200px;
border-radius: 3px;
}
</style>
前端页面效果如下:
使用了css样式,渲染出来的页面要更好看一些,在css中一般有如下几种方式定位:
- # :通过id
- . : 通过标签的类名
- 通过标签名定位
- 标签+属性 :即 标签名[属性名=属性值]
- 层级定位 : 父标签[父标签属性名=父标签属性值]>(或者空格)子标签
- 索引定位 : 父标签[父标签属性名=父标签属性值]>子标签:nth-child(索引序号)
- 逻辑定位 : 标签名[标签名1= 属性值1][标签名2=属性值2]
核心代码
// 通过id定位
driver.findElement(By.cssSelector("#account")).sendKeys("123456@qq.com");
// 通过标签类名定位
driver.findElement(By.cssSelector(".el-input__inner")).sendKeys("123456@qq.com");
// 通过`标签+属性`定位
driver.findElement(By.cssSelector("input[placeholder='请输入邮箱']")).sendKeys("123456@qq.com");
// 通过层级来定位
driver.findElement(By.cssSelector("div[class='el-input']>input")).sendKeys("123456@qq.com");
// 通过 索引 来定位,索引从1开始
driver.findElement(By.cssSelector("div[class='el-input']>input:nth-child(2)")).sendKeys("123456@qq.com");
// 逻辑定位
driver.findElement(By.cssSelector("input[placeholder='请输入邮箱'][autocomplete='off']")).sendKeys("123456@qq.com");
特殊场景元素定位
我们上面说的定位方式,都是正常的场景,但是有一些场景比价特殊,比如在一个页面中嵌入了一个 iframe 页面 、弹出一个新的选择页面、打开一个新的页面等等,这个时候我们直接使用上面的八大定位可能就不好使了,所以就需要一些特殊的方法。
iframe 表单页面定位
我们有时候会遇到像如下图中这种页面
在一个页面中又嵌套了一个页面即内联框架,但是这个时候我们想登录,直接去定位登录的元素,是行不通,我们需要通过 switchTo().frame() 方法,切换到iframe中,如果我们想再切换回默认页面,可以使用 switchTo().defaultContent(); 方法切换回来。
前端代码如下 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h1>这里是iframe外</h1>
<iframe id="login_iframe" src="#/" style="width: 100%;height: 600px"></iframe>
</body>
</html>
<style>
#input{
border: 1px solid #cac6c6;
padding: 5px;
min-width: 200px;
border-radius: 3px;
}
</style>
示例代码如下 :
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#34;");
driver.get("#34;");
// 先定位到iframe
WebElement iframe=driver.findElement(By.id("login_iframe"));
// 再切换至iframe中
Thread.sleep(1000);
driver.switchTo().frame(iframe);
// 通过ID定位到账户输入框
Thread.sleep(1000);
WebElement account=driver.findElement(By.id("account"));
Thread.sleep(1000);
account.sendKeys("123456@qq.com");
Thread.sleep(1000);
driver.findElement(By.id("password")).sendKeys("123456");
// 点击按钮
driver.findElement(By.id("login_btn")).click();
// 再切换回默认页面
driver.switchTo().defaultContent();
Thread.sleep(1000);
driver.close();
}
}
多窗口切换
我们有一个页面,我们点击了一下一个按钮或者超链接,它打开了一个新的页面,我们需要到新的页面操作,此时我们需要先获取的局面的句柄,然后再通过 switchTo().window() 方法切换至新打开的页面进行操作,前端代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h1>自动化测试</h1>
<a id="login" href="#/" target="_blank">登录页面</a>
</body>
</html>
<style>
#input{
border: 1px solid #cac6c6;
padding: 5px;
min-width: 200px;
border-radius: 3px;
}
</style>
JAVA代码
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Test;
import java.util.Set;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#34;");
WebElement login=driver.findElement(By.id("login"));
Thread.sleep(1000);
login.click();
// 获取当前窗口句柄
String search_handle = driver.getWindowHandle();
//获得所有窗口句柄
Set<String> handles = driver.getWindowHandles();
for(String handle : handles){
if(handle.equals(search_handle)==false){
//切换到登录页面
driver.switchTo().window(handle);
// 通过ID定位到账户输入框
Thread.sleep(1000);
WebElement account=driver.findElement(By.id("account"));
Thread.sleep(1000);
account.sendKeys("123456@qq.com");
Thread.sleep(1000);
driver.findElement(By.id("password")).sendKeys("123456");
// 点击按钮
driver.findElement(By.id("login_btn")).click();
}
}
Thread.sleep(1000);
// 切换至之前的页面
driver.switchTo().window(search_handle);
Thread.sleep(1000);
driver.quit();
}
}
执行效果如下:
警告框处理
在前端页面中我们会遇到如下这种弹框:
这是就需要,通过 switch_to_alert() 方法定位到弹框中,然后再执行操作,弹框常用的方法如下:
- getText() : 返回弹框中的文字信息。
- accept() : 接受现有警告框。
- dismiss() : 解散现有警告框。
- sendKeys(keysToSend) : 发送文本至警告框。
- keysToSend : 将文本发送至警告框。
示例的前端代码 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
<script type="text/javascript">
function disp_alert()
{
confirm("自动化测试!","")
}
</script>
</head>
<body>
<h1>自动化测试</h1>
<button id="alert" onclick="disp_alert()">弹框</button>
</body>
</html>
JAVA代码
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Test;
import java.util.Set;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#34;");
WebElement alert=driver.findElement(By.id("alert"));
Thread.sleep(1000);
alert.click();
// 跳转alert
Alert alertFrame = driver.switchTo().alert();
// 向弹框输入框中输入文本
Thread.sleep(2000);
alertFrame.sendKeys("自动化测试");
Thread.sleep(2000);
System.out.println("弹框中的文字信息:"+alertFrame.getText());
// 确认弹框
alertFrame.accept();
Thread.sleep(2000);
driver.quit();
}
}
选择框处理
选择框主要支持如下几种方式定位:
- selectByVisibleText() : 通过文本选择选项
- selectByIndex() : 通过索引选择选项
- selectByValue() : 通过值选择选项
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h1>自动化测试</h1>
<div>
<h3>城市</h3>
<select id="city" name="city" style="width: 200px;height: 40px;">
<option value="shanghai" selected>上海</option>
<option value="suzhou" selected>苏州</option>
<option value="nanjing" selected>南京</option>
<option value="hangzhou" selected>杭州</option>
</select>
</div>
</body>
</html>
JAVA代码如下 :
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.Test;
import java.util.Set;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#34;");
WebElement select_el=driver.findElement(By.id("city"));
Select sel = new Select(select_el);
Thread.sleep(1000);
sel.selectByVisibleText("上海");
Thread.sleep(2000);
sel.selectByIndex(1);
Thread.sleep(2000);
sel.selectByValue("nanjing");
Thread.sleep(2000);
driver.quit();
}
}
执行结果如下:
上传文件
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#34;");
WebElement upload_file=driver.findElement(By.id("upload_file"));
Thread.sleep(2000);
upload_file.sendKeys("/Users/yangchen/Pictures/123.png");
Thread.sleep(2000);
driver.quit();
}
}
执行结果如下 :
元素等待
在做UI自动化的过程中,会因为种种原因,比如网络、页面加载快慢,导致元素并不能及时的获取到,这个时候,就需要我们使用元素等待,等待找到指定的元素,再进行下一步,一般等待分为三种:
- 强制等待:强制等待,就是假如我在找某个元素之前,强制等待10s,但是,不管元素有没有加载好,都要等待10s才能继续,这样看起来不太智能,如果2s就加载好了,再继续等就会浪费时间,效率不高。
- 显式等待:显示等待要比强制等待,要智能的多,它可以针对于某个特定的元素设置的等待时间,它有两个参数: 检测时间 、 最大等待时间 ,如果我们把 检测时间设置为1s , 最大等待时间设置为10s ,也就意味着,每0.5s就会查找一下元素,只要一找到就立刻继续,不会继续等待,如果一直没找到,超过了最大的等待的时间,就会报错。
- 隐式等待[1] :隐式等待和显示等待类似,但是不同的时候,隐式等待针对的是页面所有元素,是全局,而显示等待是针对某个元素。
java示例代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;
import java.util.concurrent.TimeUnit;
public class SeleniumTest {
@Test
public void login(){
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
/**
* 隐式等待,全局等待
* 1. implicitlyWait 识别对象时的超时时间
* 2. setScriptTimeout 异步脚本的超时时间
* 3. pageLoadTimeout 页面加载时的超时时间
* */ //页面加载超时时间设置为 5s
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
//定位对象时给 5 的时间, 如果 10s 内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//异步脚本的超时时间设置成 5s
driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);
// 打开Web页面
driver.get("#/");
// 通过ID定位到账户输入框
try {
//强制等待1s
Thread.sleep(1000);
driver.findElement(By.cssSelector("input[placeholder='请输入邮箱']")).sendKeys("123456@qq.com");
//隐式等待
//显式等待方式一, 针对某个元素等待
WebDriverWait wait = new WebDriverWait(driver,10, 1);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id="password"]"))).sendKeys("123456");
//显式等待方式二
wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver text) {
return driver.findElement(By.xpath("//*[@id="password"]"));
}
}).sendKeys("123456");
driver.findElement(By.id("login_btn")).click();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
driver.close();
}
}
}
浏览器常用API
- maximize() :浏览器窗口最大化
- minimize() :浏览器窗口最小化
- fullscreen() :浏览器全屏
- setSize() :设置浏览器宽高
- back() :模拟浏览器后退按钮
- forward() :模拟浏览器前进按钮
- refresh() :刷新流量器
- driver.close() :关闭当前页面
- driver.quit() :退出浏览器
示例代码如下:
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#/");
Thread.sleep(2000);
// 窗口最小化
driver.manage().window().minimize();
Thread.sleep(2000);
// 窗口最大化
driver.manage().window().maximize();
// 设置窗口指定大小
Thread.sleep(2000);
driver.manage().window().setSize(new Dimension(1000,600));
Thread.sleep(2000);
// 窗口全屏
driver.manage().window().fullscreen();
// 通过ID定位到账户输入框
Thread.sleep(2000);
driver.findElement(By.id("account")).sendKeys("123456@qq.com");
Thread.sleep(2000);
driver.findElement(By.id("password")).sendKeys("123456");
driver.findElement(By.id("login_btn")).click();
Thread.sleep(2000);
// 刷新页面
driver.navigate().refresh();
// 浏览器后退
driver.navigate().back();
// 浏览器前进
driver.navigate().forward();
Thread.sleep(3000);
driver.close();
}
}
执行结果如下:
常用事件
我们在使用浏览器的时候,一般都会做一些操作,比如输入、点击、这些我们已经在登录的示例中,操作过了,除此之外,还有一些其他的事件方法,下面我们看一下常用的事件方法:
- sendKeys(*value) :该方法为输入方法,主要作用是模拟按键操作,比如输入文本、操作键盘上的某个按键、上传指定的文件。
- click() :该方法为点击事件,可以点击按钮、超链接、图片、选择框等元素。
- clear() :用于清空文本输入框中的内容
- submit() :主要用于表单的提交 示例代码如下:
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#/");
// 通过ID定位到账户输入框
Thread.sleep(1000);
WebElement account=driver.findElement(By.id("account"));
Thread.sleep(1000);
account.sendKeys("123456sdfdsfsf@qq.com");
Thread.sleep(1000);
// 清空文本框
account.clear();
account.sendKeys("123456@qq.com");
Thread.sleep(1000);
driver.findElement(By.id("password")).sendKeys("123456");
// 点击按钮
driver.findElement(By.id("login_btn")).click();
Thread.sleep(1000);
driver.close();
}
}
获取页面元素信息常用方法
- getSize() : 返回元素的尺寸。
- getText() : 获取元素的文本。
- getAttribute(name) : 获得属性值。
- isDisplayed() : 返回该元素是否用户可见。
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#/");
// 通过ID定位到账户输入框
Thread.sleep(1000);
WebElement account=driver.findElement(By.id("account"));
Thread.sleep(1000);
account.sendKeys("123456@qq.com");
// 获取id属性的值
System.out.println("id属性的值:"+account.getAttribute("id"));
// 获取元素的尺寸
System.out.println("元素的尺寸:"+account.getSize());
// 获取元素的位置坐标
System.out.println("元素的位置坐标:"+account.getLocation());
// 获取该元素是否可见
System.out.println("元素是否可见:"+account.isDisplayed());
Thread.sleep(1000);
driver.findElement(By.id("password")).sendKeys("123456");
// 点击按钮
driver.findElement(By.id("login_btn")).click();
Thread.sleep(1000);
driver.close();
}
}
执行结果如下:
id属性的值:account
元素的尺寸:(360, 40)
元素的位置坐标:(570, 319)
元素是否可见:true
获取页面的信息
- getTitle() :用于获得当前页面的title。
- getCurrentUrl() : 用户获得当前页面的URL。
- getPageSource() : 获取页面代码
- getWindowHandle() :获取当前页面句柄
- getWindowHandles() :获取浏览器所有的句柄,返回的是一个集合 示例代码如下:
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#/");
System.out.println("当前URL:"+driver.getCurrentUrl());
System.out.println("当前网站标题:"+driver.getTitle());
System.out.println("当前前端代码:"+driver.getPageSource());
System.out.println("当前页面句柄:"+driver.getWindowHandle());
System.out.println("当前所有句柄:"+driver.getWindowHandles());
Thread.sleep(1000);
driver.close();
}
}
执行结果如下:
信息: Found CDP implementation for version 98 of 97
当前URL:#/
当前网站标题:invest-project
当前前端代码:<html lang="">中间省略<html>
当前页面句柄:CDwindow-431B77CAF29AD1E24466BDA6E83DB971
当前所有句柄:[CDwindow-431B77CAF29AD1E24466BDA6E83DB971]
浏览器cookie操作
- getCookies() :获得所有cookie信息。
- getCookieNamed(String name) : 返回字典的key为name的Cookie信息。
- addCookie(cookie dict) :添加Cookie。“cookie_dict”指字典对象,必须有 name和value值。
- deleteCookieNamed(String name) :删除Cookie信息。 “name”是要删除的cookie的名称; “optionsString” 是该Cookie的选项,目前支持的选项包括“路径” , “域” 。
- deleteAllCookies() :删除所有cookie信息。
示例代码如下:
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
import java.util.Set;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
driver.get("#/");
// 设置Cookies
Cookie c1 = new Cookie("name", "tester");
Cookie c2 = new Cookie("sex", "male");
driver.manage().addCookie(c1);
driver.manage().addCookie(c2);
// 获取Cookies
Set<Cookie> cookies = driver.manage().getCookies();
System.out.println(cookies);
driver.quit();
}
}
调用JavaScript代码
WebDriver提供了 executeScript() 方法来执行JavaScript代码
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h1>自动化测试</h1>
<div id="scroll" style="width: 100%;height: 800px;">
<h4>内容1</h4>
<h4>内容2</h4>
<h4>内容3</h4>
<h4>内容4</h4>
<h4>内容5</h4>
<h4>内容6</h4>
</div>
</body>
</html>
JAVA代码
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
// 打开Web页面
driver.get("#34;");
Thread.sleep(2000);
((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
Thread.sleep(2000);
driver.quit();
}
}
执行结果
获取窗口截图
值得注意的是,这里FileUtils需要添加maven坐标,导入进来,坐标地址如下:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
JAVA代码如下
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import java.util.Set;
public class SeleniumTest {
@Test
public void login() throws InterruptedException {
// 设置驱动
System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");
// 创建一个WebDriver对象
WebDriver driver = new ChromeDriver();
driver.get("#/");
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(srcFile,new File("./screenshot.png"));
} catch (IOException e) {
e.printStackTrace();
}
driver.quit();
}
}
截图如下: