【竞技宝app下载】八 Appium常用方法介绍

2019-12-22 19:51栏目:龙竞技官网
TAG:

在使用driver模拟登录时,需要拖动滑块验证,但是一旦使用driver去获取元素,就会被识别,然后出现拖动失败。我使用的pynput这个库,可以实现拖动。现在想实现的是获取滑块位置的坐标,但是又不能使用driver自带的方法,不然就会失败,所以有其他方法可以获取元素坐标吗?

本文是实现可拖动滑块实现的基本思路,及一个简单的dome,(

由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如在处理webview页面,完全可以使用webdriver中的方法。当然在原生应用中,也可以使用。

1、首先在html中创建一个canvas标签

1.元素相关方法

``

1.1点击操作

2、创建一个进度条对象,编写初始化方法,获取canvas对象及上下文环境;event方法是用来绑定事件;draw是用来绘图的方法,这里把Draw对象的全部方法赋给draw方法;创建绘图实例p,绘制初始图形;

WebElement button = driver.findElement(By.id(“login”));

var Draw={ init:function(){ this.obj=document.getElementById; //获取canvas对象 this.cObj=document.getElementById.getContext;//获取canvas对象上下文环境 this.event(); //初始化事件 this.pathr=120; //滑动路径半径 this.draw.prototype=this; //draw继承Draw方法 this.p=new this.draw; //创建实例p } //... }

或者

3、在Draw中编写绘图方法draw绘制下图:

WebElement button =driver.findElementById(“login”)//然后执行点击操作button.click();

创建绘图方法,获取参数

由元素对象调用click()方法。

draw:function{ //绘图 this.cObj.clearRect; //清空画布 this.x=x; //滑块坐标x this.y=y; //滑块坐标y this.r=r; //滑块移动路径半径 this.j=j; //橙色圆弧结束弧度值 //...}

1.2清除操作

绘制内侧圆弧

WebElement username = driver.findElement(By.name(“username_input”));

this.cObj.beginPath();this.cObj.lineWidth = 1;this.cObj.arc(200,200,100,Math.PI*0.75,Math.PI*2.25,false); // 绘制内层圆弧this.cObj.strokeStyle = '#0078b4';this.cObj.stroke();

或者

绘制外侧圆弧

WebElement username =driver.findElementName(“username_input”);

this.cObj.beginPath();this.cObj.arc(200,200,120,Math.PI*0.75,Math.PI*2.25,false); // 绘制外侧圆弧this.cObj.strokeStyle = '#c0c0c0';this.cObj.lineCap = "round";this.cObj.lineWidth = 20;this.cObj.stroke();

username.clear();

绘制滑块

当执行这个方法的时候,输入框的内容会被清空。

由于滑块是可以移动的这里滑块的位置使用了坐标参数xy,及滑块半径r作为可变参数

1.3获得元素属性的值

this.cObj.beginPath();this.cObj.moveTo;this.cObj.arc(x,y,r,0,Math.PI*2,false); // 绘制滑块this.cObj.fillStyle='#f15a4a';this.cObj.fill();this.cObj.beginPath();this.cObj.moveTo;this.cObj.arc(x,y,11,0,Math.PI*2,false); // 绘制滑块内侧白色区域this.cObj.fillStyle='#ffffff';this.cObj.fill();

getAttribute(java.lang.String name)这个方法。

代码如下:

由于长度可变,这里把闭合弧度作为可变参数

WebElement username = driver.findElement(By.id(“u”));

this.cObj.beginPath();this.cObj.arc(200,200,120,Math.PI*0.75,this.j,false); // 可变圆弧this.cObj.strokeStyle = '#f15a4a';this.cObj.lineCap = "round";this.cObj.lineWidth = 20;this.cObj.stroke();

或者

至此绘图方法完成,调用drow方法并传入参数滑块坐标、半径和拖动弧度即可完成图片的绘制。

WebElement username =driver.findElementId(“u”);

4、绘图方法分析

username. getAttribute(“XXXXX”);

这里首先建立以canvas左上角为原点屏幕坐标系,后面的绘图都将基于该坐标系,坐标图像如下:

这样就可以获得XXXX = “abc”,abc的值了

编写获取当前光标位置点相对canvas坐标系的方法:即当前坐标点减去canvas偏移距离

1.4获取元素文本

getx:function{ //获取鼠标在canvas内坐标x return ev.clientX-this.obj.getBoundingClientRect().left; }, gety:function{ //获取鼠标在canvas内坐标y return ev.clientY-this.obj.getBoundingClientRect().top; }

WebElement中提供一个getText()方法可以获取,代码如下:

为方便构建圆的方程,这里建立一个以canvas中心为原点的坐标系,如下图,在实际使用draw方法绘图时使用的是黑色的坐标系,在使用圆的路径处理是我们使用红色的坐标系

WebElement login= driver.findElement(By.id(“loginBtn”));

下面添加坐标转化方法,

或者

屏幕坐标

WebElement login=driver.findElementId(“loginBtn”);

spotchange:function{ //屏幕坐标转化为中心坐标 var target={}; if{ //二象限 target.x=-; target.y=200-a.y; }else if{ //一象限 target.x=a.x-200; target.y=200-a.y; }else if{ //四象限 target.x=a.x-200; target.y=- }else if{ //三象限 target.x=-; target.y=-; } return target; },

login.getText();

中心坐标

这样就能获取“登录”文字了。

respotchange:function{ //中心坐标转化为屏幕坐标 var target={}; if{ target.x=200+a.x; target.y=; }else if{ target.x=200+a.x; target.y=200-a.y; }else if{ target.x=200+a.x; target.y=- }else if{ target.x=200+a.x; target.y=-; } return target; },

对于原生APP,使用的方法是一样的,直接用元素对象引用getText方法即可。

滑块路径及位置计算方法

1.5元素是否显示

首先不考虑xy正负,

判断这个页面元素是不是显示出来了。

计算光标位置点的正切值

方法有个返回值类型是boolean,也就是说如果元素显示了返回true,如果没有显示返回false。

tanφ = ly/lx;

WebElement login= driver.findElement(By.id(“loginBtn”));

可知φ

或者

φ=arctan

WebElement login=driver.findElementId(“loginBtn”);//webview或者原生app都通用login.isDisplayed();

根据圆的参数方程,可获得光标点对应蓝色路径位置坐标为

1.6元素是否被选择

x=rcosφ

有这样的情况,复选框或者是单选框,我们需要判断这个框是不是被勾选了,此时这个方法就派上用场了。

y=rsinφ

WebElement checkbox= driver.findElement(By.id(“checkbox_id”));

根据上面思路编写获取坐标位置方法,这里添加了xy和弧度值正负处理方法和可拖动弧度范围

或者

getmoveto:function{ if{ //是否可移动 return false; } var tem={}; //存放目标坐标位置 tem.o=Math.atan; //鼠标移动点圆形角 tem.x=this.pathr*Math.cos; tem.y=this.pathr*Math.sin{ //坐标点处理 tem.x=-tem.x; tem.y=-tem.y; } if{ //弧度值处理 tem.z=-Math.atan+Math.PI*2; }else{ tem.z=-Math.atan+Math.PI; } if{ //最大值 tem.z=7.06; tem.x=this.pathr*Math.cos; tem.y=-this.pathr*Math.sin; } if{ //最小值 tem.z=2.4; tem.x=this.pathr*Math.cos; tem.y=-this.pathr*Math.sin; } return tem; },

WebElement checkbox=driver.findElementId(“checkbox_id”);//webview和原生app通用checkbox.isSeelected();

以上方法在canvas内任意点均可作为滑块拖动的目标点,这里编写cheack方法,将限制可拖动位置限制在一个大概的环形里

checkbox.isSeelected();会有返回值,如果勾选了,返回true,如果没有勾选返回false。

check:function{ //限制可拖动范围 var xx=x*x; var yy=y*y; var rr=114*114; //最小 var rrr=126*126; //最大 if(xx+yy>rr && xx+yy5、事件方法编写鼠标按下执行方法OnMouseDown这里使用了getx和gety获取光标相对canvas坐标,并判断鼠标是否移动到了滑块上方位置内,(this.p是当前绘图对象,p.x即滑块横坐标,p.x即当前纵坐标,p.r即滑块最大半径),如果光标在滑块上方则设置isDown为TRUE,反正依然,后面我们会通过isDown来判断是否执行移动滑块的方法:OnMouseDown:function{ var X=this.getx; //获取当前鼠标位置横坐标 var Y=this.gety; //获取当前鼠标位置纵坐标 var minX=this.p.x-this.p.r; var maxX=this.p.x+this.p.r; var minY=this.p.y-this.p.r; var maxY=this.p.y+this.p.r; if(minX鼠标按下后移动时滑块的方法:OnMouseMove:function{ // if{ //是否在滑块上按下鼠标 var a={}; //存放当前鼠标坐标 a.x=this.getx; //坐标转化 a.y=this.gety; var b=this.spotchange; //坐标转化 var co=this.getmoveto; //获取要移动到的坐标点 if{ //判断移动目标点是否在可拖动范围 var co=this.getmoveto; //获取到移动的目标位置坐标() var tar=this.respotchange; //坐标转化 var o=co.z; this.p.draw(tar.x,tar.y,this.p.r,o); //绘图 } } },

1.7元素是否被启用

鼠标释放方法

有些按钮,可能在页面显示上被灰掉,就是不让点击,这个时候这个按钮是不可用的。那么我们如何判断这个按钮是否能被点击呢?请用isEnabled()方法

OnMouseUp:function(){ //鼠标释放 this.p.isDown=false}, 

WebElement login= driver.findElement(By.id(“loginBtn”));

最后将所有方法和事件绑定

或者

event:function(){ //事件绑定 this.obj.addEventListener("mousedown",this.OnMouseDown.bind; this.obj.addEventListener("mousemove",this.OnMouseMove.bind; this.obj.addEventListener("mouseup",this.OnMouseUp.bind; },

WebElement login=driver.findElementById(“loginBtn”);//webview和原生app通用login. isEnabled ();

至此可拖动滑块基本方法编写完成

如果可用返回true,如果不可用返回false。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

1.8提交操作

在有表单的的界面上,可以不通过点击按钮进行提交操作,这就需要用到submit()方法

比如一个webview元素的源码:

登录 //源码竟然被解析了... 

此源码需要在一个表单(Form)中,并且type需要时submit类型,此时我们的代码可以这样写:

WebElement login= driver.findElement(By.id(“loginBtn”));

或者

版权声明:本文由龙竞技官网发布于龙竞技官网,转载请注明出处:【竞技宝app下载】八 Appium常用方法介绍