《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)

简介: 【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。

1.简介

  上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是相对前边做一个简单的总结分享给小伙伴们或者童鞋们。废话不多数,直接进入今天的主题。

2.鼠标操作

  WebElement的click()方法可实现元素的点击操作,但是没有提供鼠标的右击/双击/悬停/鼠标拖动等操作.这些操作需要通过Action类提供的方法来实现!

2.1Action常用的API

Action常用的API如下:

1. contextClick() 右击

2. clickAndHold() 鼠标悬停

3. move_to_element() 鼠标悬停

4. doubleClick() 双击

5. dragAndDrop() 拖动

6. release() 释放鼠标

7. perform() 执行所有Action中的存储行为

2.2演示模拟验证码点击拖动场景

例如:演示模拟验证码点击拖动场景示例如下:

3.代码准备

3.1前端HTML代码

前端HTML代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <title>北京-宏哥 滑动条</title>

   <link rel="stylesheet" href="drag.css">

   <script src="jquery-1.7.1.min.js"></script>

   <script src="drag.js"></script>

   <style type="text/css">

       .slidetounlock{

           font-size: 12px;

           background:-webkit-gradient(linear,left top,right top,color-stop(0,#4d4d4d),color-stop(.4,#4d4d4d),color-stop(.5,#fff),color-stop(.6,#4d4d4d),color-stop(1,#4d4d4d));

           -webkit-background-clip:text;

           -webkit-text-fill-color:transparent;

           -webkit-animation:slidetounlock 3s infinite;

           -webkit-text-size-adjust:none

       }

       @-webkit-keyframes slidetounlock{0%{background-position:-200px 0} 100%{background-position:200px 0}}

       .button1 {

           background-color: #f44336; 

           border: none;

           color: white;

           padding: 15px 32px;

           text-align: center;

           text-decoration: none;

           display: inline-block;

           font-size: 28px;

           margin-bottom: 100px;

           text-decoration:none;

           color: white;

       }

       #myAnchor

       {

         text-decoration:none;

         color: white;

       }

   </style>

</head>

<body>

<div id="wrapper" style="position: relative;top: 300px;left:300px;">

   <button class="button1"><a id="myAnchor" href="https://www.cnblogs.com/du-hong/">北京-宏哥</a></button></br>

   <div id="drag">

       <div class="drag_bg"></div>

       <div class="drag_text slidetounlock" onselectstart="return false;" unselectable="on">

           请按住滑块,拖动到最右边

       </div>

       <div class="handler handler_bg"></div>

   </div>

</div>


   <!--<a href="#" class="img"><img src="img/Lighthouse.jpg"/></a>-->

<script>

   $('#drag').drag();

</script>

</body>

</html>

3.2滑块CSS样式

HTML滑块CSS样式代码如下:

#drag{

   position: relative;

   background-color: #e8e8e8;

   width: 300px;

   height: 34px;

   line-height: 34px;

   text-align: center;

}

#drag .handler{

   position: absolute;

   top: 0px;

   left: 0px;

   width: 40px;

   height: 32px;

   border: 1px solid #ccc;

   cursor: move;

}

.handler_bg{

   background: #fff url("../img/slider.png") no-repeat center;

}

.handler_ok_bg{

   background: #fff url("../img/complet.png") no-repeat center;

}

#drag .drag_bg{

   background-color: #7ac23c;

   height: 34px;

   width: 0px;

}

#drag .drag_text{

   position: absolute;

   top: 0px;

   width: 300px;

   color:#9c9c9c;

   -moz-user-select: none;

   -webkit-user-select: none;

   user-select: none;

   -o-user-select:none;

   -ms-user-select:none;


   font-size: 12px;        //  add

}

3.3滑块拖拽JS

滑块拖拽JS代码如下:

$.fn.drag = function(options) {

   var x, drag = this, isMove = false, defaults = {

   };

   var options = $.extend(defaults, options);

   var handler = drag.find('.handler');

   var drag_bg = drag.find('.drag_bg');

   var text = drag.find('.drag_text');

   var maxWidth = drag.width() - handler.width();  //能滑动的最大间距


   //鼠标按下时候的x轴的位置

   handler.mousedown(function(e) {

       isMove = true;

       x = e.pageX - parseInt(handler.css('left'), 10);

   });


   //鼠标指针在上下文移动时,移动距离大于0小于最大间距,滑块x轴位置等于鼠标移动距离

   $(document).mousemove(function(e) {

       var _x = e.pageX - x;// _x = e.pageX - (e.pageX - parseInt(handler.css('left'), 10)) = x

       if (isMove) {

           if (_x > 0 && _x <= maxWidth) {

               handler.css({'left': _x});

               drag_bg.css({'width': _x});

           } else if (_x > maxWidth) {  //鼠标指针移动距离达到最大时清空事件

               dragOk();

           }

       }

   }).mouseup(function(e) {

       isMove = false;

       var _x = e.pageX - x;

       if (_x < maxWidth) { //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置

           handler.css({'left': 0});

           drag_bg.css({'width': 0});

       }

   });


   //清空事件

   function dragOk() {

       handler.removeClass('handler_bg').addClass('handler_ok_bg');

       text.removeClass('slidetounlock').text('验证通过').css({'color':'#fff'});       //modify

      // drag.css({'color': '#fff !important'});

       handler.css({'left': maxWidth});                   // add

       drag_bg.css({'width': maxWidth});                  // add

       handler.unbind('mousedown');

       $(document).unbind('mousemove');

       $(document).unbind('mouseup');


   }

};

3.4jquery-1.7.1.min.js下载地址

jquery-1.7.1.min.js下载链接:http://www.jqueryfuns.com/resource/2169

4.自动化代码实现

4.1代码设计

4.2参考代码

package lessons;

import org.junit.Test;

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.interactions.Actions;


/**

* @author 北京-宏哥

*

* 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)

*

* 2021年10月15日

*/

public class ActionsTest {

   

   @Test

   public void test() throws InterruptedException {

       

       System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe");

       

       WebDriver driver =null;

       try {

           driver =new ChromeDriver();

           driver.get("file:///C:/Users/DELL/Desktop/test/MouseDrag/identifying_code.html");

           driver.manage().window().maximize();

           Actions actions = new Actions(driver);

           WebElement targetElement = driver.findElement(By.xpath("//*[@id=\"drag\"]/div[3]"));

           int x = targetElement.getLocation().getX();

           int y = targetElement.getLocation().getY();

           Thread.sleep(3000);

           //首先定位到方块并点击=》移动到目标位置=》松开释放鼠标=》perform执行Actions的一系列方法调用

           actions.clickAndHold(targetElement).moveToElement(targetElement, x+260, y).release().perform();

           Thread.sleep(3000);

       }catch (Exception e) {

           e.printStackTrace();

       }

   }


}

4.3运行代码

1.运行代码,右键Run AS->Junit Test,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

5.小结

宏哥这里用了单元测试的方法,当然你也可以用之前的方法进行测试,在这里宏哥就不在赘述!

1.在设计代码过程中会报错:Type mismatch: cannot convert from Test to Annotation  

解决办法:参考宏哥这篇文章的小结:https://www.cnblogs.com/du-hong/p/15189106.html




每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问):

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

相关文章
|
4天前
|
Java 测试技术 Python
《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)
【6月更文挑战第21天】本文介绍了TestNG中测试方法的依赖执行顺序。作者通过一个实际的自动化测试场景展示了如何设计测试用例:依次打开百度、搜索“selenium”、再搜索“selenium+java”。代码示例中,`@Test`注解的`dependsOnMethods`属性用于指定方法间的依赖,确保执行顺序。如果不设置依赖,TestNG会按方法名首字母排序执行。通过运行代码,验证了依赖关系的正确性。
26 4
|
2天前
|
Java 测试技术 Python
《手把手教你》系列基础篇(八十一)-java+ selenium自动化测试-框架设计基础-TestNG如何暂停执行一些case(详解教程)
【6月更文挑战第22天】本文介绍了如何在TestNG中不执行特定测试用例。当部分模块未准备好时,可以通过以下方式暂停测试:③使用`@Test(enabled=false)`注解来禁用测试用例。作者提供了一个Java Selenium自动化测试的示例,展示如何通过修改`enabled`参数控制测试方法的执行。代码中,`testSearch2()`方法被禁用,因此在测试运行时不执行。文章还包含了测试报告和执行过程的截图。
33 7
|
1天前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十二)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-上篇(详解教程)
【6月更文挑战第23天】TestNG 是一个用于自动化测试的 Java 框架,它自动生成测试报告,包括 HTML 和 XML 格式。报告可在 `test-output` 文件夹中找到。要创建测试用例,可创建一个实现了 `@Test` 注解的方法。通过 `testng.xml` 配置文件来组织和执行测试。默认报告包括测试结果、失败点和原因。用户还能实现 `ITestListener` 和 `IReporter` 接口来自定义报告和记录器。
18 2
|
4天前
|
XML 存储 自然语言处理
基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理
基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理
|
1月前
|
测试技术 数据安全/隐私保护
通过抓包能否做好接口测试
通过抓包能否做好接口测试
23 0
|
6天前
|
JSON Java Maven
使用`MockMvc`来测试带有单个和多个请求参数的`GET`和`POST`接口
使用`MockMvc`来测试带有单个和多个请求参数的`GET`和`POST`接口
19 3
|
1月前
|
NoSQL 安全 测试技术
接口测试用例设计的关键步骤与技巧解析
该文介绍了接口测试的设计和实施,包括测试流程、质量目标和用例设计方法。接口测试在需求分析后进行,关注功能、性能、安全等六项质量目标。流程包括网络监听(如TcpDump, WireShark)和代理工具(Charles, BurpSuite, mitmproxy, Fiddler, AnyProxy)。设计用例时,需考虑基本功能流程、输入域测试(如边界值、特殊字符、参数类型、组合参数、幂等性)、线程安全(并发和分布式测试)以及故障注入。接口测试用例要素包括模块、标题、优先级、前置条件、请求方法等。文章强调了保证接口的幂等性和系统健壮性的测试重要性。
54 5
|
7天前
|
监控 前端开发 测试技术
postman接口测试工具详解
postman接口测试工具详解
35 7
|
7天前
|
监控 JavaScript 前端开发
postman接口测试工具详解
postman接口测试工具详解
20 6
|
1天前
|
监控 druid Java
Springboot用JUnit测试接口时报错Failed to determine a suitable driver class configure a DataSource: ‘url‘
Springboot用JUnit测试接口时报错Failed to determine a suitable driver class configure a DataSource: ‘url‘
6 0