appium脚本编写随笔

一、元素定位

使用 SDK自带的APP元素查看工具uiautomatorviewer来获取元素,方法如下:

1、将测试机连接到电脑上,打开测试机上的待测app;

2、打开ANDROID SDK文件夹,在\sdk\tools下找到批处理文件uiautomatorviewer.bat,运行这个文件;

3、点击Devices Screenshot,获取元素如下


二、获取&操作元素

1、直接文本定位,通常用于操作文案不变的按钮;

/*直接文本定位*/

//登录框切换注册、登录

WebElement LogItemBtn =driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Log In\")");

LogItemBtn.click();

Thread.sleep(3000);

WebElement RegisterItemBtn =driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Register\")");

RegisterItemBtn.click();

Thread.sleep(3000);


2、通过id定位元素,较为常用的编写脚本的方式,有通用的缺点是开发增删控件需要重新维护脚本;

/*通过id定位元素*/

//点击按钮-登录框点击back

WebElement backItemBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tvBack"));

backItemBtn.click();

Thread.sleep(5000);

//首次打开关闭freegift弹框

WebElement freeItemBtn1 = driver.findElement(By.id("com.jollycorp.jollychic:id/iv_free_gift_close"));

freeItemBtn1.click();

Thread.sleep(5000);

WebElement searchBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tv_home_search_text"));

searchBtn.click();

Thread.sleep(5000);

//输入框输入内容

WebElement editText = driver.findElement(By.id("com.jollycorp.jollychic:id/etSearch"));

String itemText="dress";

editText.sendKeys(itemText);

Thread.sleep(3000);


3、通过className定位元素,适用于class里只有一个控件,通常与List遍历结合使用;

/*通过className定位*/

//点击按钮-登录框点击back

WebElement backItemBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tvBack"));

backItemBtn.click();

Thread.sleep(5000);

//首次打开关闭freegift弹框-两种写法

//WebElement freeItemBtn =  driver.findElementByClassName("android.widget.ImageView");

WebElement freeItemBtn =  driver.findElement(By.className("android.widget.ImageView"));

freeItemBtn.click();

Thread.sleep(5000);


4、通过List遍历class定位元素,有通用的缺点是开发修改class控件需要重新维护脚本;

/*通过className定位*/

//点击按钮-登录框点击skip

WebElement skipItemBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tvBack"));

skipItemBtn.click();

Thread.sleep(5000);

//首次打开关闭freegift弹框

List<WebElement> textFieldsList  = driver.findElementsByClassName("android.widget.ImageView");

System.out.println(textFieldsList.size());

textFieldsList.get(0).click();

Thread.sleep(5000);

WebElement backItemBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tvTitleLeft"));

backItemBtn.click();

Thread.sleep(2000);


//循环打印class控件数

List<WebElement> wishItemBtnList  = driver.findElementsByClassName("android.widget.TextView");

for(intk=0;k<wishItemBtnList.size();k++){

logger.info(wishItemBtnList.get(k).getText());

}


5、调用系统按键事件,通常用于快速调试脚本或者替代不好实现的控件操作;

/*调用系统按键事件*/

//点击按钮-登录框点击back

WebElement backItemBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tvBack"));

backItemBtn.click();

Thread.sleep(5000);

//首次打开关闭freegift弹框

WebElement freeItemBtn1 = driver.findElement(By.id("com.jollycorp.jollychic:id/iv_free_gift_close"));

freeItemBtn1.click();

Thread.sleep(3000);

WebElement searchBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tv_home_search_text"));

searchBtn.click();

Thread.sleep(3000);

//输入框输入内容

WebElement editText = driver.findElement(By.id("com.jollycorp.jollychic:id/etSearch"));

String itemText="dress";

editText.sendKeys(itemText);

Thread.sleep(5000);

//调用系统enter键开始搜索

driver.pressKeyCode(66);

Thread.sleep(3000);

//文本抓取ok点掉新手提示

driver.findElementByAndroidUIAutomator("new UiSelector().text(\"OK\")").click();

常用事件及参考附录如下,详细参考 http://www.jianshu.com/p/bfc978d52e76

KEYCODE_DPAD_UP导航键向上19

KEYCODE_DPAD_DOWN导航键向下20

KEYCODE_DPAD_LEFT导航键向左21

KEYCODE_DPAD_RIGHT导航键向右22

KEYCODE_PAGE_UP向上翻页键92

KEYCODE_PAGE_DOWN向下翻页键93

KEYCODE_BACK返回键4

KEYCODE_ENTER回车键66


6、通过xpath定位,优点是可以模糊匹配,有通用的缺点是开发修改class控件需要重新维护脚本;

//点击按钮-登录框点击skip

WebElement skipItemBtn = driver.findElement(By.id("com.jollycorp.jollychic:id/tvBack"));

skipItemBtn.click();

Thread.sleep(5000);

driver.findElementByXPath("//android.widget.TextView[contains(@text,'Cancel')]").click();

//driver.findElementByXPath("//android.widget.TextView[contains(@text,'Can')]").click();

还可用于判定控件是否存在,详细可参考http://www.cnblogs.com/paulwinflo/p/4738904.html

List appiumItems = driver.findElementsByXPath("//android.widget.RelativeLayout[@text='Cancel']");

if(appiumItems.isEmpty()) {

System.out.println("is null");

}else{

System.out.println("is exist");

}

// Check if item is added

//List appiumItems =driver.findElementsByXPath("//android.widget.RelativeLayout[@text='Cancel']");

//Assert.assertEquals("is nul 'Cancel'", false,appiumItems.isEmpty());


7、通过获取控件value,来判定当前控件是否为选中状态

/**获取底下导航标签列表**/

List<String> elemnts =findElements(By.id("com.jollycorp.jollychic:id/fixed_bottom_navigation_icon"));

/**如果当前选中的不是Home标签则点击Home **/

if(!Boolean.TRUE.toString().equals(getValueInJsonObject(getAttribute(elemnts.get(i),Attribute.SELECTED.getName()),"value"))) {

click(elemnts.get(i));

}


8、findElemnt(By.id())方法

findElemnt(By.id("com.jollycorp.jollychic:id/tv_my_account_help_center"))

获取到结果:

{"status":0,"value":{"ELEMENT":"bf599629-49fa-43c6-be84-8043bdf63f15"}}

获取不到结果:

{"status":7,"value":"An element could not be located on the page using the given search parameters."}

例用方法:

if(!isElementPresent(findElemnt(By.id("com.jollycorp.jollychic:id/tv_my_account_help_center")))) {

slideScreen(1,Direction.UP.getName());

}

public static booleanisElementPresent(String elementResponse)throwsJSONException {

int status =newJSONObject(elementResponse).getInt("status");

return status ==0;

}


9、uiautomator2.0直接调用系统方法发post请求

public static voidpressBack() {

JSONObject jsonObject =newJSONObject();

jsonObject.put("command","input keyevent BACK");

post(UI2_SERVER_ADDR+"/exec",jsonObject.toString());

}

public static finalStringUI2_SERVER_ADDR="http://127.0.0.1:"+port+UI2_SERVER_PREFIX;


10、使用content找元素

click(findElemnt(By.xpath("//*[@content-desc='Cooperation']")));


11、xpath的一种用法

List list =findElements(By.id("sss"));

String text =getText(list.get(0));

findElemnt(By.xpath("//*[@text='"+text+"']"));

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 1.定位元素应用元素 1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以...
    涛b阅读 743评论 0 1
  • 1.contexts contexts(self): Returns the contexts within th...
    七月尾巴_葵花阅读 2,007评论 0 10
  • 由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如在处理webview...
    涛b阅读 1,060评论 0 0
  • 静静的湖面上 凉凉的晚风袭来 你轻轻地出现 温暖了整个夜空 那白色的月光 映在你的美丽脸庞 你微微的一笑 让我心生...
    南仲阅读 254评论 0 2
  • 除了学生,不知道工作了朋友还有没有午休的机会。是的,马上6月份就要毕业了,工作还没找到。此刻躺在床上感觉是浪费时间...
    大敏1阅读 125评论 0 0