自定義Appium

改造appium-android-driver

這個driver是UIAutomator1的driver奶赠,負責(zé)UIAutomator1的服務(wù)啟動、停止药有、命令接收和執(zhí)行毅戈。

工程結(jié)構(gòu)

  • appium-android-driver(NodeJS工程)
    • bootstrap(Maven工程)

本身appium-android-driver是一個nodejs工程,它還套著一個bootstrap的maven工程愤惰,這個maven工程就是用來打包UIAutomator1的苇经,會再bootstrap/bin的目錄下構(gòu)建生成一個叫AppiumBootstrap.jar的供外層的NodeJS工程使用。代碼在appium-android-driver/lib/bootstrap.js的start函數(shù)中

      const rootDir = path.resolve(__dirname, '..', '..');
      const startDetector = (s) => { return /Appium Socket Server Ready/.test(s); };
      const bootstrapJar = path.resolve(rootDir, 'bootstrap', 'bin', 'AppiumBootstrap.jar');

      await this.init();
      await this.adb.forwardPort(this.systemPort, 4724);
      this.process = await this.uiAutomator.start(
                       bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',
                       startDetector, '-e', 'pkg', appPackage,
                       '-e', 'disableAndroidWatchers', disableAndroidWatchers,
                       '-e', 'acceptSslCerts', acceptSslCerts);

修改pom.xml宦言,編譯bootstrap扇单,輸出AppiumBootstrap.jar

bootstrap工程是一個maven工程,用idea直接open這個文件夾即可奠旺,找到pom.xml蜘澜,右鍵Maven->Reimport,我們會發(fā)現(xiàn)有兩個maven依賴無法導(dǎo)入响疚,報找不到對應(yīng)的jar包:

<dependency>
  <groupId>android</groupId>
  <artifactId>android</artifactId>
  <version>4.4.2_r4</version>
</dependency>

<dependency>
  <groupId>android.test.uiautomator</groupId>
  <artifactId>uiautomator</artifactId>
  <version>4.4.2_r4</version>
</dependency>

原因是默認(rèn)的倉庫是從https://repo.maven.appache.org/maven2中找的鄙信,而這個倉庫根本沒有這兩個庫。

后來我發(fā)現(xiàn)Boundless的倉庫http://repo.boundlessgeo.com/main/中是有的稽寒,在這個pom.xml中配置這個倉庫就可以下載了扮碧。

<project>
...
    <repositories>
        <repository>
            <id>Boundless</id>
            <url>http://repo.boundlessgeo.com/main/</url>
        </repository>
    </repositories>
</project>

依賴庫搞定后,cmd切換到bootstrap文件夾目錄下,執(zhí)行mvn clean package構(gòu)建maven工程慎王,我們會發(fā)現(xiàn)蚓土,并沒有在bin目錄下生成AndroidBootstrap.jar,此時要修改pom.xml中的maven-jar-plugin

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <!--jar輸出目錄-->
    <outputDirectory>./bin</outputDirectory>
    <!--輸出的jar包名稱-->
    <finalName>AppiumBootstrap</finalName>
  </configuration>
</plugin>

重新執(zhí)行mvn clean package赖淤,AppiumBootstrap.jar就完成了正常構(gòu)建蜀漆,也就是說UIAutomator1構(gòu)建好了。

自定義appium-android-driver咱旱,并發(fā)布

找到appium-android-driver/package.json确丢,修改name,比如修改為appium-android-driver2吐限,然后順便修改下version鲜侥,然后再appium-android-driver根目錄下執(zhí)行

npm install  # 重新安裝依賴
npm publish  # 發(fā)布

npm publish是發(fā)布nodejs包的命令着帽,需要你在npmjs.com上注冊自己的賬號帆吻,發(fā)布的時候需要驗證你的賬號。

自定義Appium

跟自定義appium-android-driver一樣些阅,我們找到package.json狐粱,修改name和version舀寓,比如分別是appium2和1.12.1-20190401a,順便我們修改一下lib/main.js中的一條語句肌蜻,以驗證我們的修改是否生效:

async function logStartupInfo (parser, args) {
  let welcome = `Welcome to Appium2 v${APPIUM_VER}, modified by chengming`; // 我修改了此處
  let appiumRev = await getGitRev();
  if (appiumRev) {
    welcome += ` (REV ${appiumRev})`;
  }
  logger.info(welcome);

  let showArgs = getNonDefaultArgs(parser, args);
  if (_.size(showArgs)) {
    logNonDefaultArgsWarning(showArgs);
  }
  let deprecatedArgs = getDeprecatedArgs(parser, args);
  if (_.size(deprecatedArgs)) {
    logDeprecationWarning(deprecatedArgs);
  }
  if (!_.isEmpty(args.defaultCapabilities)) {
    logDefaultCapabilitiesWarning(args.defaultCapabilities);
  }
  // TODO: bring back loglevel reporting below once logger is flushed out
  // logger.info('Console LogLevel: ' + logger.transports.console.level);
  // if (logger.transports.file) {
  //   logger.info('File LogLevel: ' + logger.transports.file.level);
  // }
}

還有要在package.json中互墓,找到dependencies,把我們的appium的UIAutomator1的依賴改為"appium-android-driver2":"latest"蒋搜,使我們自定義的appium能夠使用我們自定義的UIAutomator1 driver

同樣篡撵,重新構(gòu)建和發(fā)布:

npm install
npm publish

在npmjs.com網(wǎng)站中,我的項目下就會看到appium2的工程:

image-20190402112045705

使用自定義的appium

安裝:

npm i -g appium2

啟動

appium

效果

image-20190402112501248

TODO:驗證自定義appium-android-driver是否生效

這個要修改bootstrap的java代碼齿诞,在啟動server的時候加上你的日志即可驗證酸休,后續(xù)再補充吧。

補充:2019-04-02 17:20

糾正AppiumBootstrap.jar的打包方式

官方readme.md沒有說怎么打包這個jar包的事情祷杈,我按照如上述的打包方式生成的jar是不可用的斑司,格式不正確。jar中的內(nèi)容應(yīng)該是一個classes.dex文件但汞,而不是編譯好的classes宿刮。

image-20190402152727758

我們需要先把class文件打包成dex,然后再把dex打包成jar私蕾,shell代碼如下:

dx --dex --output=./classes.dex target/classes
jar -cvf AppiumBootstrap.jar -C ./ ./classes.dex

你需要配置好android的環(huán)境變量僵缺,使你的dx能夠全局調(diào)用。

既然打包方式知道了踩叭,并且appium是要求在appium-android-driver/bootstrap/bin下有個AppiumBootstrap.jar的磕潮,那么我們?nèi)サ舸饲敖omaven-jar-plugin設(shè)置的configuration翠胰,重新編寫一個shell腳本bootstrap.sh

#!/bin/sh
mvn clean package # 清理環(huán)境,編譯class文件
dx --dex --output=./target/classes.dex target/classes # 將class文件打包自脯,生成dex文件
jar -cvf bin/AppiumBootstrap.jar -C ./ ./target/classes.dex # 將dex文件打包之景,生成jar

測試AppiumBootstrap.jar

我們找到bootstrap工程中的io.appium.android.bootstrap.Bootstrap.java,在testRunServer方法的第一句膏潮,添加一段注釋:

public class Bootstrap extends UiAutomatorTestCase {

  public void testRunServer() {
    Logger.info("這是我自定義的Bootstrap锻狗,成功啦...");
    Find.params = getParams();
    boolean disableAndroidWatchers = Boolean.parseBoolean(getParams().getString("disableAndroidWatchers"));
    boolean acceptSSLCerts = Boolean.parseBoolean(getParams().getString("acceptSslCerts"));

    SocketServer server;
    try {
      server = new SocketServer(4724);
      server.listenForever(disableAndroidWatchers, acceptSSLCerts);
    } catch (final SocketServerException e) {
      Logger.error(e.getError());
      System.exit(1);
    }

  }
}

電腦插上手機,執(zhí)行:

adb devices

輸出:

chengmingdeMacBook-Pro:bootstrap cmlanche$ adb devices
List of devices attached
cf02d869    device

確保你的手機是連上電腦的焕参。

保存轻纪,執(zhí)行bootstrap.sh,在bin目錄會打包好AppiumBootstrap.jar叠纷,我們把它push到手機:

adb push ./bin/AppiumBootstrap.jar /data/local/tmp/AppiumBootstrap.jar

完成后刻帚,我們啟動UIAutomator1的測試:

adb shell uiautomator runtest /data/local/tmp/AppiumBootstrap.jar -c io.appium.android.bootstrap.Bootstrap
image-20190402171841536

自定義AppiumBootstrap至此流程已通,接下來就是自定義權(quán)限框處理讲岁,讓Appium自主識別權(quán)限框我擂。

—— by cmlanche.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缓艳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌看峻,老刑警劉巖阶淘,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異互妓,居然都是意外死亡溪窒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門冯勉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澈蚌,“玉大人,你說我怎么就攤上這事灼狰⊥鹈椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵交胚,是天一觀的道長份汗。 經(jīng)常有香客問我,道長蝴簇,這世上最難降的妖魔是什么杯活? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮熬词,結(jié)果婚禮上旁钧,老公的妹妹穿的比我還像新娘吸重。我一直安慰自己,他們只是感情好歪今,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布嚎幸。 她就那樣靜靜地躺著,像睡著了一般彤委。 火紅的嫁衣襯著肌膚如雪鞭铆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天焦影,我揣著相機與錄音车遂,去河邊找鬼。 笑死斯辰,一個胖子當(dāng)著我的面吹牛舶担,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彬呻,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼衣陶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闸氮?” 一聲冷哼從身側(cè)響起剪况,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒲跨,沒想到半個月后译断,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡或悲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年孙咪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡语。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡翎蹈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出男公,到底是詐尸還是另有隱情荤堪,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布理澎,位于F島的核電站逞力,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏糠爬。R本人自食惡果不足惜寇荧,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望执隧。 院中可真熱鬧揩抡,春花似錦户侥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烁设,卻和暖如春替梨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背装黑。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工副瀑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恋谭。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓糠睡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疚颊。 傳聞我的和親對象是個殘疾皇子狈孔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這一章主要針對項目中可以用到的一些實用功能來介紹Android Gradle,比如如何隱藏我們的證書文件材义,降低風(fēng)險...
    acc8226閱讀 7,620評論 3 25
  • 請允許我借鑒前輩們的東西~~~~ 感激不盡~~~~~ 以下為Android 框架排行榜 么么噠~ Android...
    嗯_新閱讀 2,057評論 3 32
  • 2018只剩下最后的幾個小時了其掂,總想說點兒什么到忽,卻又不知從何說起。 2018清寇,在我的人生旅途上發(fā)生了很多重要事情,...
    那時那刻閱讀 251評論 0 1
  • 法院的一紙傳票讓老賀家再次掀起軒然大波护蝶,賀大一看傳票內(nèi)容當(dāng)即大怒华烟,氣沖沖的給賀小妹要她寫一張六萬塊錢的借款單,嘴里...
    油油的悠悠閱讀 498評論 0 1
  • 大早上老媽給我發(fā)了這個圖片喂链,一直以來老媽都是不停地把她認(rèn)為勵志的,立業(yè)的妥泉,保健的椭微,雞湯文等發(fā)給我,期待我也能學(xué)習(xí)盲链。...
    Bjorn_DX閱讀 413評論 0 1