自动化测试-鼠标+键盘操作 - Actions高级控件

文章目录

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

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


前言


本文开始

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("验证通过"));
    }

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解了 (),如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关推荐
一水鉴天2 小时前
整体设计 定稿 之25 重构和改造现有程序结构 之1 (codebuddy)
开发语言·人工智能·重构
g***B7382 小时前
Java 的第三次跃迁:从企业级语言走向智能时代的通用计算引擎
java·开发语言
lly2024062 小时前
Maven 构建配置文件
开发语言
晚风_END2 小时前
postgresql数据库|数据库维护系列|postgresql数据库参数配置详解和数据库维护时机的选择(三)
运维·开发语言·数据库·postgresql·oracle
一 乐2 小时前
幼儿园管理|基于springboot + vue幼儿园管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
JH灰色2 小时前
【大模型】-LangChain多模态输入和自定义输出
java·前端·langchain
JIngJaneIL2 小时前
基于Java + vue校园论坛系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
Mcband2 小时前
forEach跳出循环
java