通过上一篇文章中《Appium Android Bootstrap源代码分析之简单介绍》我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的了解,那么依照正常的写书的思路,下一个章节应该就要去看bootstrap是如何建立socket来获取数据然后如何进行处理的了。
但本人认为这样子做并不会太好,由于到时整篇文章会变得非常的冗长,由于你在编写的过程中碰到不认识的类又要跳入进去进行说明分析。
这里我认为应该尝试吸取著名的《重构》这本书的建议:一个方法的代码不要写得太长,不然可读性会非常差,尽量把其分解成不同的函数。
那我们这里就是用类似的思想,不要尝试在一个文章中把全部的事情都做完,而是尝试先把关键的类给描写叙述清楚。最后才去把这些类通过一个实例分析给串起来呈现给读者,这样大家就不会由于一个文章太长影响可读性而放弃往下学习了。
那么我们这里为什么先说bootstrap对控件的处理,而非刚才提到的socket相关的socketserver的建立呢?我是这样子看待的。大家看到本人这篇文章的时候,非常有可能之前已经了解过本人针对uiautomator源代码分析那个系列的文章了,或者已经有uiautomator的相关知识,所以脑袋里会比較迫切的想知道到底appium是怎么运用了uiautomator的,那么在appium中于这个问题最贴切的就是appium在server端是怎么使用了uiautomator的控件的。
这里我们主要会分析两个类:
public class AndroidElement {
private final UiObject el;
private String id;
...
}大家都知道UiObject事实上就是UiAutomator里面代表一个控件的类,通过它就行对控件进行操作(当然终于还是通过UiAutomation框架). AnroidElement就是通过它来跟UiAutomator发生关系的。我们可以看到以下的AndroidElement的点击click方法事实上就是非常干脆的调用了UiObject的click方法: public boolean click() throws UiObjectNotFoundException {
return el.click();
}当然这里除了click还有非常多控件相关的操作。比方dragTo,getText,longClick等,但无一例外,都是通过UiObject来实现的。这里就不一一列举了。我们在脚本上对控件的认识就是一个WebElement:
WebElement addNote = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")");而在Bootstrap中一个对象就是一个AndroidElement. 那么它们是怎么映射到一起的呢?我们事实上能够先看例如以下的代码:
WebElement addNote = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")");
addNote.getText();
addNote.click();做的事情就是获得Notes这个app的菜单,然后调用控件的getText来获得‘Add note‘控件的文本信息,以及通过控件的click方法来点击该控件。那么我们看下调试信息是如何的:
pc端传过来的json字串有几个fields:
package io.appium.android.bootstrap;
/**
* Enumeration for all the command types.
*
*/
public enum AndroidCommandType {
ACTION, SHUTDOWN
}
如上一小节看到的。每个AndroidElement都有两个重要的成员变量:
上一节我们说到appium pc端是通过id把WebElement和目标机器端的AndroidElement映射起来的,那么我们这一节就来看下维护AndroidElement的这个哈希表是怎么实现的。
首先,它拥有两个成员变量:
private final Hashtable<String, AndroidElement> elements; private Integer counter;
/**
* Constructor
*/
public AndroidElementsHash() {
counter = 0;
elements = new Hashtable<String, AndroidElement>();
}而它在整个Bootstrap中是有且仅仅有一个实例的。且看它的单例模式实现: public static AndroidElementsHash getInstance() {
if (AndroidElementsHash.instance == null) {
AndroidElementsHash.instance = new AndroidElementsHash();
}
return AndroidElementsHash.instance;
}下面添加一个控件的方法addElement充分描写叙述了为什么说counter是一个自添加的key,且是每一个新发现的AndroidElement控件的id: public AndroidElement addElement(final UiObject element) {
counter++;
final String key = counter.toString();
final AndroidElement el = new AndroidElement(key, element);
elements.put(key, el);
return el;
}
|
作者 |
自主博客 |
微信 |
CSDN |
|
天地会珠海分舵 |
|
服务号:TechGoGoGo 扫描码:
|
http://blog.csdn.net/zhubaitian |
版权声明:本文博主原创文章,博客,未经同意不得转载。
Appium Android Bootstrap控制源代码的分析AndroidElement
原文:http://www.cnblogs.com/hrhguanli/p/4838733.html