文章目录
✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。

前言
本文开始
1. Action介绍
1.1 定义:
Action: 是Selenium webDriver中提供的的Actions API来模拟一系列复杂的键盘和鼠标操作。
用于向浏览器设备输入动作,如:实现模拟键盘操作,回车,tab键,ctrl键等;
1.2 范围:
Action: 支持键盘操作 + 鼠标操作;鼠标和键盘操作满足大部分使用场景;
【注】Action中还支持笔和滚轮操作-但是支持谷歌内核;-使用较少;
键盘操作:有Keys枚举类,满足键盘中常用键位操作;
键盘常用方法-java:按下键位-keyDown(), 松开键位-keyUp(), 输入信息-sendKeys(text);
【python中键盘操作方法】send_keys(text), key_down(), key_up();
特殊键输入
java
//特殊键
new Actions(driver)
.sendKeys(Keys.ENTER) // 回车键
.sendKeys(Keys.TAB) // Tab键
.sendKeys(Keys.ESCAPE) // ESC键
.sendKeys(Keys.BACK_SPACE) // 退格键
.sendKeys(Keys.DELETE) // 删除键
.sendKeys(Keys.SPACE) // 空格键
.sendKeys(Keys.HOME) // Home键
.sendKeys(Keys.END) // End键
.sendKeys(Keys.PAGE_UP) // 上翻页
.sendKeys(Keys.PAGE_DOWN) // 下翻页
.sendKeys(Keys.ARROW_UP) // 上箭头
.sendKeys(Keys.ARROW_DOWN) // 下箭头
.sendKeys(Keys.ARROW_LEFT) // 左箭头
.sendKeys(Keys.ARROW_RIGHT)// 右箭头
.sendKeys(Keys.F1) // F1键
.sendKeys(Keys.F5) // F5刷新键
.perform();
文本输入
java
new Actions(driver)
.sendKeys("Hello World") // 输入普通文本
.sendKeys("test@example.com") // 输入邮箱
.sendKeys("123456") // 输入数字
.sendKeys("特殊字符!@#$%") // 输入特殊字符
.sendKeys("第一行\n第二行") // 输入多行文本
.perform();
组合键
java
new Actions(driver)
// Windows/Linux: Ctrl, Mac: Command
.sendKeys(Keys.chord(Keys.CONTROL, "a")) // 全选 Ctrl+A
.sendKeys(Keys.chord(Keys.CONTROL, "c")) // 复制 Ctrl+C
.sendKeys(Keys.chord(Keys.CONTROL, "v")) // 粘贴 Ctrl+V
.sendKeys(Keys.chord(Keys.CONTROL, "x")) // 剪切 Ctrl+X
.sendKeys(Keys.chord(Keys.CONTROL, "z")) // 撤销 Ctrl+Z
.sendKeys(Keys.chord(Keys.CONTROL, "y")) // 重做 Ctrl+Y
.sendKeys(Keys.chord(Keys.CONTROL, "s")) // 保存 Ctrl+S
.sendKeys(Keys.chord(Keys.CONTROL, "f")) // 查找 Ctrl+F
.sendKeys(Keys.chord(Keys.CONTROL, "p")) // 打印 Ctrl+P
.perform();
Keys中方法样例:
2. 键盘操作
【注意】
1.需要使用键盘和鼠标操作声明 Action类如:
java
Actions actions = new Actions(webDriver); 参数是驱动;
2.键盘操作需要配合build()方法和perform()方法;
【注】最新在现代Selenium(3.x/4.x)中,无论是鼠标事件还是键盘事件,都可以直接使用 .perform(),无需显式调用 .build()。.perform() 方法内部会自动处理构建过程。
3.鼠标操作直接.perform()即可,不需要build(), 点击后就是Action,可直接执行;
4.方法介绍:
java
/**
* Action中方法:
* 最新在现代Selenium(3.x/4.x)中,无论是鼠标事件还是键盘事件,都可以直接使用 .perform(),
* 无需显式调用 .build()
**/
.sendKeys(元素, 输入的文本字符串)
.build() // 将所有动作构建成一个复合动作
.perform(); // 执行这个复合动作
// 指定目标元素, 输入文本
.sendKeys(input, "Hello World")
// 输入特殊键
.sendKeys(Keys.ENTER) // 回车
.sendKeys(Keys.TAB) // Tab键
//发送组合键
// 方法1:使用Actions API(需要配对keyDown/keyUp)
new Actions(driver)
.keyDown(Keys.CONTROL)
.sendKeys("a") // Ctrl+A
.keyUp(Keys.CONTROL)
.perform();
// 方法2:直接发送组合字符串(推荐)
// Ctrl+A
new Actions(driver)
.sendKeys(Keys.chord(Keys.CONTROL, "a"))
.perform();
4.键盘组合操作 中,使用组合键,需要释放,如ctrl,command,shift等键;
例如:不释放,Ctrl键将保持按下状态,影响后续所有操作;-需要keyUp();
单键盘操作
常用方法在代码示例:
java
/**
* 键盘操作
*/
@Test
public void enter() {
List<Executable> executableList = new ArrayList<>();
//1.获取驱动
WebDriver webDriver = WebDriverManager.chromedriver().create();
//2.声明隐式等待
webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
//3.打开要操作的界面
String url = "https:study_up_up/";
webDriver.get(url);
//4.进行业务逻辑操作: 找到输入框,输入文本,点击回车按钮,验证输入后效果
//4.1定位输入框
WebElement sendEle = webDriver.findElement(By.className("mb-2"));
//初始文本显示
WebElement text = webDriver.findElement(By.className("el-input__inner"));
String before_text = text.getText();
//判断before_text是否等于equalTo()中的内容
executableList.add(() -> assertThat(before_text, equalTo("键盘操作: ")));
//4.2 输入文本并在键盘上点击回车按键
//开始鼠标、键盘操作:键盘操作需要配合build()方法和perform()方法,
// 但是最新使用Selenium(4.x版本)中只使用perform()就可以自动构建了,但支持老版本写法
Actions actions = new Actions(webDriver);
actions
.sendKeys(sendEle, "Selenium")
.sendKeys(Keys.ENTER)
.build()
.perform();
//4.3获取页面显示内容,断言
String after_text = text.getText();
executableList.add(() -> assertThat(after_text, equalTo("键盘操作: Selenium")));
assertAll(executableList);
}
元素sendKeys()和actions中的sendKys()两种输入有什么区别?
鼠标触发事件不同
输入1是:元素点击触发元素 的click()事件
输入2是:鼠标点击触发鼠标的up(),down()事件
都可以使用无差别,看业务具体需求;
java
//输入1:
sendEle.sendKeys("selenium");
//输入2:
Actions actions = new Actions(webDriver);
actions.sendKeys(sendEle, "Selenium").build().perform();
键盘组合操作:
command键-mac电脑,windows电脑对应win键;
常用组合键方法在代码示例:
java
/**
* 组合键:键盘鼠标组合键
*/
public void commandWithClick() {
//1.声明webDriver
WebDriver webDriver = WebDriverManager.chromedriver().create();
//2.声明全局隐式等待
webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
//3.打开要操作的界面
String url = "https://day_day_up.com/";
//获得当前窗口-为后续切换窗口准备
String ori = webDriver.getWindowHandle();
//4.业务逻辑操作
//4.1 找到要点击的元素及文本
//获取找到该元素title raw-link raw-topic-link下的第二个元素
//或者使用class先找到元素,再通过get方法定位第几个元素
WebElement element = webDriver.findElement(By.xpath("(//*[@class='title raw-link raw-topic-link'])[2]"));
String text = element.getText();
System.out.println("第一个文本内容" + text);
//4.2 键盘command+元素点击同时进行-会打开新窗口,需要切换新窗口验证
Actions actions = new Actions(webDriver);
//.keyDown(Keys.COMMAND) + .click(element)=》组合成command+点击
actions
.keyDown(Keys.COMMAND)
.click(element)
.keyUp(Keys.COMMAND)
.build()
.perform();
//4.3 窗口切换,判断新窗口的标题
//获取所有窗口,循环判断
Set<String> handles = webDriver.getWindowHandles();
for(String windowHandle : handles) {
//不是最初窗口,就切换,目前一个就两个
if(!windowHandle.equals(ori)) {
webDriver.switchTo().window(windowHandle);
break;
}
}
//断言
//新窗口标题
String title = webDriver.getTitle();
System.out.println("新窗口标题:" + title);
//断言tiltle中包含text吗
assertThat(title, containsString(text));
}
3. 鼠标操作
【注意】
1.鼠标操作后需要.perform()方法,去提交
点击操作
常用方法:双击doubleClick(),右击contextClick() -重要;点击-click();点击并保持;
双击元素-java:doubleClick(clickable)
python方法:double_click(clickable)
右键点击元素java: contextClick(clickable)
python方法: context_click(clickable)
鼠标点击方法:
java
new Actions(driver)
.click() // 在当前位置单击
.click(webElement) // 单击指定元素
.doubleClick() // 在当前位置双击
.doubleClick(webElement) // 双击指定元素
.contextClick() // 在当前位置右键单击
.contextClick(webElement) // 右键单击指定元素
.perform();
鼠标操作:双击,右击操作
常用点击方法在代码示例:
java
/**
* 鼠标操作:双击,右击操作
*/
@Test
public void mouseClick() {
List<Executable> executableList = new ArrayList<>();
//1.声明驱动
WebDriver webDriver = WebDriverManager.chromedriver().create();
//2.声明隐式等待
webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
//3.进入页面
String url = "https://study_up_up/clicks";
webDriver.get(url);
//获取显示元素
WebElement element = webDriver.findElement(By.xpath("//*[@class='mb-2']"));
System.out.println("初始状态显示:" + element.getText());
//4.业务逻辑
//4.1鼠标双击
WebElement double_but = webDriver.findElement(By.xpath("//*[text()='双击按钮']"));double_but.click();
Actions actions = new Actions(webDriver);
actions.doubleClick(double_but).perform();
System.out.println("双击后显示:" + element.getText());
//assertThat(实际值,预期值)
executableList.add(() -> {
assertThat(element.getText(), equalTo("点击按钮: 我是双击按钮--"));
});
//4.2鼠标右键单击
WebElement right_ele = webDriver.findElement(By.id("rightClick"));
actions.contextClick(right_ele).perform();
System.out.println("右键点击显示:" + element.getText());
executableList.add(() -> {
assertThat(element.getText(), containsString("鼠标右键"));
});
//4.3 鼠标单击
WebElement clickEle = webDriver.findElement(By.xpath("//*[text()='单击按钮']"));
actions.click(clickEle).perform();
executableList.add(() -> {
assertThat(element.getText(), containsString("单击按钮"));
});
assertAll(executableList);
}
悬停操作
常用方法:根据元素找到悬停位置-moveToElement(要移动的元素)-重要;根据坐标找到元素位置;
鼠标悬停java: moveToElement(hoverable)
python方法: move_to_element(hoverable)
鼠标悬浮方法:
java
new Actions(driver)
.moveToElement(webElement) // 鼠标移动到元素上
.moveToElement(webElement, xOffset, yOffset) // 移动到元素的相对位置
.perform();
鼠标悬浮代码示例:
java
/**
* 鼠标悬浮操作
*/
public void mouseover() {
List<Executable> executableList = new ArrayList<>();
//1.声明驱动
WebDriver webDriver = WebDriverManager.chromedriver().create();
//2.隐式等待
webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
//3.进入页面
String url = "https://study_up_up/mouse";
webDriver.get(url);
//4.业务逻辑
WebElement element = webDriver.findElement(By.xpath("//*[@class='ma-1 box mouseover']/h1"));
String text = element.getText();
System.out.println("初始:" + text);
//4.1获取需要悬浮元素的位置,获取文本,验证
WebElement mouseEle = webDriver.findElement(By.xpath("//*[contains(text(), '移入')]"));
//4.2获取Actions对象操作鼠标输入
Actions actions = new Actions(webDriver);
actions.moveToElement(mouseEle).perform();
System.out.println("移入后显示:" + element.getText());
executableList.add(() -> {
assertThat(element.getText(), containsString("移入"));
});
//4.3 鼠标移动到其他按钮,不显示文本
WebElement otherEle = webDriver.findElement(By.xpath("//*[contains(text(), '其他')]"));
//4.2获取Actions对象操作鼠标输入
actions.moveToElement(otherEle).perform();
System.out.println("移入后显示:" + element.getText());
executableList.add(() -> {
assertThat(element.getText(), equalTo("鼠标操作:"));
});
assertAll(executableList);
}
拖拽操作
常用方法:根据元素找到拖拽(起点和终点)位置-dragAndDrop(位置a, 位置b)-重要;根据坐标找到元素位置;
鼠标拖拽-java: dragAndDrop(Aele,Bele)
python方法:drag_and_drop(Aele, Bele)
鼠标拖拽方法:
java
new Actions(driver)
// 基本拖拽
.dragAndDrop(sourceElement, targetElement) // 从一个元素拖到另一个元素
.dragAndDropBy(sourceElement, xOffset, yOffset) // 拖拽到相对位置
// 详细拖拽过程
.clickAndHold(sourceElement) // 按住元素
.moveToElement(targetElement) // 移动到目标
.release() // 释放鼠标
.perform();
鼠标拖拽代码示例:
java
/**
* 鼠标拖拽 -元素
* 初始位置a和最终位置b
* dragAndDrop(a,b)
*/
@Test
public void actionChain() {
//1.获取驱动
//2.设置隐式等待
webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
//3.进入页面
String url = "https://study_up_up/action";
webDriver.get(url);
//4.逻辑操作
//4.1获取元素初始位置A, 移动到的位置B,
WebElement AEle = webDriver.findElement(By.xpath("//*[@id='item1']"));
WebElement BEle = webDriver.findElement(By.xpath("//*[@id='item3']"));
//声明Action,操作鼠标,键盘
//A拖拽到B操作
Actions actions = new Actions(webDriver);
actions.dragAndDrop(AEle, BEle).perform();
//获取提示信息校验
String pageSource = webDriver.getPageSource();
assertThat(pageSource, containsString("验证通过"));
}
总结
✨✨✨各位读友,本篇分享到内容是否更好的让你理解了 (),如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

