八 Appium常用方法介绍(转)
由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如在处理webview页面,完全可以使用webdriver中的方法。当然在原生应用中,也可以使用。
1.元素相关方法
1.1点击操作
WebElement button = driver.findElement(By.id(“login”));
或者
WebElement button = driver.findElementById(“login”) //然后执行点击操作 button.click();
由元素对象调用click()方法。
1.2清除操作
WebElement username = driver.findElement(By.name(“username_input”));
或者
WebElement username = driver.findElementName(“username_input”); username.clear();
当执行这个方法的时候,输入框的内容会被清空。
1.3获得元素属性的值
getAttribute(java.lang.String name)这个方法。
代码如下:
WebElement username = driver.findElement(By.id(“u”));
或者
WebElement username = driver.findElementId(“u”); username. getAttribute(“XXXXX”);
这样就可以获得XXXX = “abc”,abc的值了
1.4获取元素文本
登录按钮的源码:
<button class="btn btn-major" id="loginBtn" type="button">登录</button>
WebElement中提供一个getText()方法可以获取,代码如下:
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementId(“loginBtn”); login.getText();
这样就能获取“登录”文字了。
对于原生APP,使用的方法是一样的,直接用元素对象引用getText方法即可。
1.5元素是否显示
判断这个页面元素是不是显示出来了。
方法有个返回值类型是boolean,也就是说如果元素显示了返回true,如果没有显示返回false。
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementId(“loginBtn”); //webview或者原生app都通用 login.isDisplayed();
1.6元素是否被选择
有这样的情况,复选框或者是单选框,我们需要判断这个框是不是被勾选了,此时这个方法就派上用场了。
WebElement checkbox= driver.findElement(By.id(“checkbox_id”));
或者
WebElement checkbox= driver.findElementId(“checkbox_id”); //webview和原生app通用 checkbox.isSeelected();
checkbox.isSeelected();会有返回值,如果勾选了,返回true,如果没有勾选返回false。
1.7元素是否被启用
有些按钮,可能在页面显示上被灰掉,就是不让点击,这个时候这个按钮是不可用的。那么我们如何判断这个按钮是否能被点击呢?请用isEnabled()方法
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementById(“loginBtn”); //webview和原生app通用 login. isEnabled ();
如果可用返回true,如果不可用返回false。
1.8提交操作
在有表单的的界面上,可以不通过点击按钮进行提交操作,这就需要用到submit()方法
比如一个webview元素的源码:
<button class="btn btn-major" id="loginBtn" type="submit">登录</button>
此源码需要在一个表单(Form)中,并且type需要时submit类型,此时我们的代码可以这样写:
WebElement login= driver.findElement(By.id(“loginBtn”));
或者
WebElement login= driver.findElementById(“loginBtn”); //webview和原生的app 提交按钮通用 login. submit();
2.webview中iframe的处理
在混合应用APP中的webview页面中也会遇到frame的情况,处理情况和web页面中的frame处理一样。
selenium webdriver中提供了进入一个iframe的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)
也提供了一个返回default content的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent()
核心代码:
driver.switchTo().frame(“XXX”); //传入的是iframe的ID
如果要返回到以前的默认content,可以使用:
dr.switchTo().defaultContent();
3.下拉框选值
webview下拉框操作:先定位出你要处理的下拉框(元素),然后将此元素传入Select对象中,接着用Select中的相关方法来选取下拉值。
我们先要定位这个Select下拉框(元素)
WebElement element_province = driver.findElement(By.id(“province”));
然后把element传入Select
Select province = new Select(element_province);
然后由Select来操作下拉框
province.selectByIndex(0) //province .selectByVisibleText(“XXX”)
4.alert处理
@Test public void handleAlert() throws InterruptedException { WebElement showAlert= driver.findElement(By.name("Show Alert")); //点击之后弹出alert窗口 showAlert.click(); WebElement yes=driver.findElement(By.name("Yes")); //点击yes按钮之后alert窗口消失 yes.click(); //暂停4秒观察显示 Thread.sleep(4000); }
Alert我们无法用selenium alert api处理 ,我们使用的是直接找到按钮的方式。这样就可以找到Yes按钮,然后点击yes按钮即可。
5.滚动和滑动
5.1滚动操作
实现代码:
@Test public void scroll() throws InterruptedException { //滑动直到查找到E driver.scrollToExact("E"); }
5.2滑动操作
@Test public void swipe() throws InterruptedException { Thread.sleep(1000); TouchAction tAction=new TouchAction(driver); tAction.press(400,500).waitAction(800).moveTo(50,500).release().perform(); Thread.sleep(4000); }
其中的核心代码是:
TouchAction tAction=new TouchAction(driver); tAction.press(400,500).waitAction(800).moveTo(50,500).release().perform();
使用的是TouchAction类,首先调用press方法,然后加上等待动作的缓冲时间800毫秒,接着移动到坐标(moveTo),当移动到指定坐标点的时候,松开手。最后调用perform方法就可执行整个操作。
6.等待元素加载
6.1 硬性等待
Thread.sleep(int sleeptime);
此方法会把当前的driver进程暂停一段时间,然后在执行接下来的操作。这方法有个缺点就是,你不能确定元素到底多久加载出来,如果你的sleepTimes是10秒,但是元素2秒就加载出来了,那么此进程还会继续等待8秒,造成时间浪费。所以非必要情况下不要使用此方法。
6.2智能等待
public void waitForElementToLoad(int timeOut, final By By) { try { (new WebDriverWait(driver, timeOut)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver driver) { WebElement element = driver.findElement(By); return element.isDisplayed(); } }); } catch (TimeoutException e) { Assert.fail("超时!! " + timeOut + " 秒之后还没找到元素 [" + By + "]",e); } }
此方法有两个参数,timeOut是等待元素的超时时间,就是说过了这个时间如果元素还没加载出来就报错。By对象,这个是你元素的定位方式比如By.id(“login”);
这个方法会在给定timeOut去查找元素,如果在小于timeOut的时间内找到了元素,剩下的时间不在等待,直接执行接下来的操作。
6.3 设置等待页面加载完毕
int pageLoadTime = 10; driver.manage().timeouts().pageLoadTimeout(pageLoadTime, TimeUnit.SECONDS);
这段代码,加载driver.get(url)方法之前,他们等待你给定的时间,如果在给定时间内网页还是没有加载出来就会报错,如果在小于给定时间内加载完毕了,剩下的时间不再等待。
7.Spinner下拉菜单选择
Spinner是安卓SDK中的一个下拉菜单组件,它可以让用户从下拉框中选择不同值。
@Test public void testSpinner() throws InterruptedException { WebElement spinner=driver.findElement(By.id("android:id/text1")); //点击下拉框 spinner.click(); //滑动查找直到摘到india driver.scrollToExact("India"); WebElement optionIndia=driver.findElement(By.name("India")); //点击一下India optionIndia.click(); //暂停4秒观察显示 Thread.sleep(4000); }
8.SeekBar拖动条操作
实现代码:
@Test public void testSeekbar() throws InterruptedException { //找到拖动条 WebElement slider=driver.findElementById("com.android.androidui:id/seekBar1"); //获取拖动条的开始拖动点的x坐标 int xAxisStartPoint = slider.getLocation().getX(); //获取拖动条的结束点的x坐标 = 开始x坐标+滑动条元素的宽度 int xAxisEndPoint = xAxisStartPoint + slider.getSize().getWidth(); //滚动条的y坐标 int yAxis = slider.getLocation().getY(); TouchAction act=new TouchAction(driver); act.press(xAxisStartPoint,yAxis).waitAction(800).moveTo(xAxisEndPoint- 1,yAxis).release().perform(); } @AfterClass public void afterClass() { driver.closeApp(); }
八 Appium常用方法介绍(转)的更多相关文章
- 八 Appium常用方法介绍
由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如在处理webview页面,完全可以使用webdriver中的方法.当然在原生应用中,也可以使用. 1.元素 ...
- appium===常用方法介绍,元素定位
https://testerhome.com/topics/3711 元素定位方法: find_element_by_android_uiautomator ,使用uiautomator定位,后面参数 ...
- 七 Appium常用方法介绍
文本转自:http://www.cnblogs.com/sundalian/p/5629609.html 由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如 ...
- java基础-BigDecimal类常用方法介绍
java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...
- java基础-BigInteger类常用方法介绍
java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...
- java基础-Arrays类常用方法介绍
java基础-Arrays类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Array类的概念 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定 ...
- java基础-Math类常用方法介绍
java基础-Math类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Math类概念 Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函 ...
- java基础-System类常用方法介绍
java基础-System类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.System类概念 在API中system类介绍的比较简单,我们给出定义,system中 ...
- java基础-Integer类常用方法介绍
java基础-Integer类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需 ...
- Java基础-Calendar类常用方法介绍
Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...
随机推荐
- count(列名)、count(1)和 count(*)有什么区别?
在MySQL中,这几个都是统计操作,很多人在使用的时候,都使用的是count(1),这有没有问题?使用正确?达到了统计效果? 我们从效果和效率两方面来分析下 执行效果 count(*) 包括了所有的列 ...
- Vulhub activewq_漏洞复现——源码分析
Vulhub activewq_漏洞复现--源码分析 漏洞简介 Apache ActiveMQ是由美国阿帕奇(Apache)软件基金会开发的开源消息中间件,支持Java消息服务.集群.Spring框架 ...
- pikachu靶场学习
pikachu靶场通关 搭建靶场 1.官网下载https://github.com/zhuifengshaonianhanlu/pikachu 2.把pikachu文件夹放到phpstudy的web服 ...
- 2023-03-29:如何高效计算三条线路选择方案?小A的旅行线路规划问题
2023-03-29:第一行有一个正整数n(3<=n<=100000),代表小A拟定的路线数量 第二行有n个正整数,第i个代表第i条路线的起始日期 第三行有n个正整数,第i个代表第i条路线 ...
- 【GPT-4理论篇-1】GPT-4核心技术探秘
前言 GPT-4已经发布有一段时间了,但是出于安全性等各种原因,OpenAI并没有公布GPT-4的技术细节和代码,而是仅仅给出了一个长达100页的技术报告[1]. 这个技术报告着重介绍了GPT-4的强 ...
- vscode 配置代码自动格式化加修复
子曰:"工欲善其事,必先利其器", 编码必须的就是有一个顺手的ide,然而光有还不行,还要懂得配置,毕竟不同的团队代码规范不同,如目前用得较多的就是eslint,今天就顺便记录下v ...
- vue 一键导出数据为excel文件并附带样式 十分简单
自入行以来我就一直疑惑一个问题,导出excel为什么总是搞的很复杂,包括网上的教程,屎里淘金,非常耗费精力.今天刚好业务需要,整理一个简单明了的由vue前端导出的版本出来. 开始: #1.添加xlsx ...
- Tomcat处理http请求之源码分析
本文将从请求获取与包装处理.请求传递给Container.Container处理请求流程,这3部分来讲述一次http穿梭之旅. 1 请求包装处理 tomcat组件Connector在启动的时候会监听端 ...
- Redis数据结构:高频面试题及解析
概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射. 键的类型只能为字符串,值支持五种数据类型:字符串.列表.集合.散列表.有序集合. Red ...
- C#里的var和dynamic区别到底是什么,你真的搞懂了嘛
前言 这个var和dynamic都是不确定的初始化类型,但是这两个本质上的不同.不同在哪儿呢?var编译阶段确定类型,dynamic运行时阶段确定类型.这种说法对不对呢?本篇看下 概括 以下详细叙述下 ...