摘自网络,复习留存~
由于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();
}
1、app后台运行
driver.background_app(5)
2、锁屏
driver.lock(5)
3、隐藏键盘
driver.hide_keyboard()
4、启动一个app或者在当前app中打开一个新的activity,仅适用于android
driver.start_activity('com.example.android.apis', '.Foo')
5、检查app是否被安装
driver.is_app_installed('com.example.android.apis')
6、安装app
driver.install_app('path/to/my.apk')
7、卸载app
driver.remove_app('com.example.android.apis')
8、关闭app
driver.close_app();
9、启动app
driver.launch_app()
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 常用方法总结
1、appium启动任意的Activity
在手机上启动任意的Activty用driver.start_activity方法,如果启动的Activity不是测试应用程序的一部分,它也将启动该活动的应用程序。
具体的方法如下:
driver.start_activity(‘com.foo.app’, ‘.MyActivity’)
2、检索应用程序字符串
driver.app_strings方法返回应用程序的字符串
strings = driver.app_strings
3、向安卓设备发送一个按键事件
driver.press_keycode(3)
4、查看当前的Avtivty
activity = driver.current_activity assertEquals(’.ApiDemos’, activity)
5、锁定屏幕
driver.lock(5)
6、将 app 置于后台,把当前应用放到后台去
driver.background_app(5)
7、收起键盘
driver.hide_keyboard()
8、启动 Activity
在当前应用中打开一个 activity 或者启动一个新应用并打开一个 activity 。 只能在 Android 上使用
driver.start_activity(‘com.example.android.apis’, ‘.Foo’)
9、打开通知栏 (Notifications),打开下拉通知栏 只能在 Android 上使用
driver.open_notifications()
10、检查应用是否已经安装
driver.is_app_installed(‘com.example.android.apis’)
11、安装应用
driver.install_app(‘path/to/my.apk’)
12、删除应用
driver.remove_app(‘com.example.android.apis’)
13、模拟设备摇晃
driver.shake()
14、关闭应用
driver.close_app()
15、启动 (Launch)
根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。
这不是用于启动指定的 app/activities ,你可以使用 start_activity 做到这个效果,这是用来继续进行使用了 autoLaunch=false 关键字时的初始化 (Launch) 流程的。
driver.launch_app()
16、重置 (Reset)
driver.reset()
17、可用上下文 (context)
列出所有的可用上下文
翻译备注:context可以理解为 可进入的窗口 。例如,对于原生应用,可用的context和默认context均为NATIVE_APP
driver.contexts
18、当前上下文 (context)
driver.current_context
19、切换到默认的上下文 (context)
将上下文切换到默认上下文
driver.switch_to.context(None)
20、应用的字符串 (App Strings)
获取应用的字符串
driver.app_strings
21、按键事件 (Key Event)
给设备发送一个按键事件
driver.keyevent(176)
22、触摸动作(TouchAction) / 多点触摸动作(MultiTouchAction)
生成触摸动作的接口。这部分文档很快将会补充更多的内容进来。
action = TouchAction(driver)
action.press(element=el, x=10, y=10).release().perform()
23、滑动(Swipe)
模拟用户滑动
driver.swipe(start=75, starty=500, endx=75, endy=0, duration=800)
24、捏 (Pinch)
捏屏幕 (双指往内移动来缩小屏幕)
driver.pinch(element=el)
25、放大 (Zoom)
放大屏幕 (双指往外移动来放大屏幕)
driver.zoom(element=el)
26、滑动到 (Scroll To)
滑动到某个元素。
todo: python
27、拉出文件 (Pull File)
从设备中拉出文件
driver.pull_file(‘Library/AddressBook/AddressBook.sqlitedb’)
28、推送文件(Push file)
推送文件到设备中去
driver.pull_file(‘Library/AddressBook/AddressBook.sqlitedb’)