一、下载对应浏览器的webdriver,比如edge的:
Microsoft Edge WebDriver - Microsoft Edge Developer
https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver/解压,找到msedgedriver.exe,将其放到 Java 系统环境变量下,例如 : 将其放到 JDK 的 bin 目录下
启动发现edge浏览器webdriver请求地址是127.0.0.1 : 9515
二、创建Maven项目
引入依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
首个测试:这里https://www.baidu.com这个网站点击百度一下不会跳转新标签页
public class FirstAutoTest {
// 百度网址搜索陈伟霆
public void chenWeiTingTest() throws InterruptedException {
// 创建驱动实例, 创建会话(打开浏览器)
EdgeDriver driver = new EdgeDriver();
Thread.sleep(3000);
// 在浏览器找到百度网址, 访问百度首页
driver.get("https://www.baidu.com");
Thread.sleep(1000);
// 找到百度首页输入框元素, 并输入关键词 "陈伟霆"
driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");
Thread.sleep(1000);
// 找到百度首页的 "百度一下" 按钮, 并点击一下
driver.findElement(By.cssSelector("#su")).click();
Thread.sleep(3000);
// 结束会话, 关闭浏览器
driver.quit();
}
}
public class RunAutoTest {
public static void main(String[] args) throws InterruptedException {
FirstAutoTest firstAutoTest = new FirstAutoTest();
firstAutoTest.chenWeiTingTest();
}
}
三、selenium 基础方法
1.查找页面元素
driver.findElement()
driver.findElements()
当元素可以在页面中找到, 程序正确退出
当元素在页面中找不到时, 程序执行报错 >
参数:By.cssSelector("页面元素")
页面元素可以是selector 或 xpath
xpath 语法
层级 : / 代表子集, // 代表跳级
属性 : @
函数 : contains()...
返回值 : webElement / List<WebElement>
2.输入文本
driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");
3.点击 click
driver.findElement(By.cssSelector("#su")).click();
4.提交
submit 相当于通过回车键提交, 但是 selenium 官方不推荐使用 submit, 更推荐 click. 因为 submit 仅适用于表单元素, 而且能使用 submit 提交, 就一定能使用 click 代替, 而反过来不行.
5.清除
driver.findElement(By.cssSelector("#kw")).clear();
6.获取文本
driver.findElement(By.cssSelector("#su")).getText()
7.获取属性对应的值
System.out.println(driver.findElement(By.cssSelector("#su")).getAttribute("id"))
8.获取当前标签页面标题和URL
获取标题 : driver.getTitle()
获取URL : driver.getCurrentUrl()
窗口大小的设置
-
driver.manage().window().maximize();
-
driver.manage().window().minimize();
- driver.manage().window().fullscreen();
- driver.manage().window().setSize(new Dimension(1024, 768));
9.窗口的切换
当浏览器每次打开一个标签页的时候, 会自动的给每个标签页进行标识, 这个标识我们称之为 "句柄"
driver对象会拿着旧标签页的句柄
获取当前页面的句柄
String curHandle = driver.getWindowHandle()
获取所有页面的句柄
Set<String> handles = driver.getWindowHandles();
跳转到新标签页
String curHandle = driver.getWindowHandle();
System.out.println("当前句柄 : " +curHandle);
Set<String> handles = driver.getWindowHandles();
for(String handle : handles) {
// 如果不是当前页面的句柄, 就切换窗口
if(handle != curHandle) {
driver.switchTo().window(handle);
}
}
10.屏幕截图
引入依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
// 屏幕截图 (保存现场)
File srcFile = driver.getScreenshotAs(OutputType.FILE);
String filename = "my.png";
FileUtils.copyFile(srcFile, new File(filename));
11.等待
程序执行速度比浏览器渲染速度要快很多,查找页面元素时元素还没渲染出来呢,就会报错找不到对应的元素。
强制等待
Thread.sleep()
隐式等待
隐式等待会作用于 driver 的整个生命周期. 虽然代码写在前面, 但是隐式等待会一直轮询判断元素是否存在, 如果元素存在, 并且在 1ms 就找到了, 就不会等待三秒, 直接就往下执行了; 如果不存在该元素, 就在设置好的时间里轮询等待即可, 时间一过, 元素还没找到, 程序执行就会报错.
EdgeDriver driver = new EdgeDriver();
// 添加隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");
driver.findElement(By.cssSelector("#su")).click();
// 获取新打开页面的元素
driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span"));
// 退出
driver.quit();
显式等待
private EdgeDriver driver = new EdgeDriver();
public void windowController() throws InterruptedException, IOException {
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("陈伟霆");
driver.findElement(By.cssSelector("#su")).click();
// 添加显示等待
new WebDriverWait(driver, Duration.ofSeconds(5))
.until(driver->driver.findElement(By.cssSelector("#\\31 > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > a > div > p > span > span")));
driver.quit();
}
12.浏览器导航
driver.get("https://www.baidu.com");
driver.navigate().to("https//www.baidu.com");
driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();
13.处理弹窗
Alert alert = driver.switchTo().alert();
alert.sendKeys("abcdef~");
alert.accept();
alert.dismiss();
1. 警告弹窗中, 切换到弹窗,调用 accept().
2. 确认弹窗中, 切换到弹窗, 调用 accept() 或 dismiss().
3. 提示弹窗中, 切换到弹窗, 可以先输入文本, 调用 sendKeys(), 然后调用 accept 或者 dismiss.
但是 sendKeys() 在页面上看不到输入文本的执行效果
虽然警告弹窗只有确认按钮, 但是 accept 和 dismiss 都能处理. 虽然警告弹窗和确认弹窗都没有输入文本的地方, 但如果要执行 alert.sendKKeys(), 代码也不会报错.
14.选择框
WebElement ele = driver.findElement(By.cssSelector("#ShippingMethod"));
// 先创建选择框对象
Select select = new Select(ele);
// 根据文本来选择
select.selectByVisibleText("UPS Next Day Air ==> $12.51");
// 根据属性值来选择
select.selectByValue("12.51");
// 根据序号来选择 (序号从 0 开始)
select.selectByIndex(1);
15.执行脚本
driver.executeScript("var texts = document.querySelector('#kw'); texts.value = 'abcdef'");
16.文件上传
driver.findElement(By.cssSelector("body > div > div > input[type=file]")).sendKeys("D:\\bit-test\\selenium-html\\upload.html");
四、有头模式(操作浏览器看得见/前台)/无头模式(看不见/后台)
public void noHeadController() {
// 先创建选项对象, 然后再设置浏览器参数 (无头模式)
EdgeOptions options = new EdgeOptions();
options.addArguments("-headless");
EdgeDriver driver = new EdgeDriver(options);
...
driver.quit();
}
本文介绍了如何在Java中使用Selenium框架和MicrosoftEdgeWebDriver进行网页自动化测试,包括下载和配置webdriver、创建Maven项目、基础方法如元素定位、操作、等待和浏览器控制等,以及有头和无头模式的区别。
3077

被折叠的 条评论
为什么被折叠?



