From ce7caa794e7bcdeee0122d8dad1ae2f84b4bbf7d Mon Sep 17 00:00:00 2001 From: Eric Plaster Date: Thu, 25 Apr 2013 17:22:12 -0500 Subject: [PATCH] Added support for screenshots for Android. Added support for screenshots for Android. Now uses ScreenShooter found at https://github.com/appium/screenshooter Fixed some javascript lint issues Removed screenshooter... again Removed grunt buildScreenShooter and fixed string Removed grunt build commands for Android Screen Shooter --- app/android.js | 61 +++++++++++++++++++++++++++++++++- app/android/ScreenShooter.jar | Bin 0 -> 7430 bytes 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 app/android/ScreenShooter.jar diff --git a/app/android.js b/app/android.js index 640849606..d21e5dd6f 100644 --- a/app/android.js +++ b/app/android.js @@ -11,6 +11,8 @@ var errors = require('./errors') , parseXpath = require('./uiauto/appium/xpath').parseXpath , exec = require('child_process').exec , fs = require('fs') + , os = require('os') + , temp = require('temp') , async = require('async') , path = require('path') , UnknownError = errors.UnknownError; @@ -566,7 +568,64 @@ Android.prototype.setOrientation = function(orientation, cb) { }; Android.prototype.getScreenshot = function(cb) { - cb(new NotYetImplementedError(), null); + var me = this; + var localfile = "/tmp/" + path.basename(temp.path({prefix: 'appium', suffix: '.png'})); + var b64data = ""; + var jar = path.resolve(__dirname, '../app/android/ScreenShooter.jar'); + var jarpath = path.resolve(process.env.ANDROID_HOME, "tools/lib"); + var classpath = ""; + + async.series([ + function(cb) { + exec('uname -m', function (error, stdout, stderr) { + if (error) { + cb(error); + } else { + classpath = jarpath + "/ddmlib.jar:" + jarpath + "/" + stdout.trim() + "/swt.jar:" + jar; + cb(null); + } + }); + }, + function(cb) { + var javaCmd = 'java -classpath "' + classpath + '" io.appium.android.screenshooter.ScreenShooter '; + + var cmd = javaCmd + me.adb.curDeviceId + " '" + localfile + "'"; + logger.debug("screenshot cmd: " + cmd); + exec(cmd, {}, function(err, stdout, stderr) { + if (err) { + logger.warn(stderr); + return cb(err); + } + cb(null); + }); + }, + function(cb) { + fs.readFile(localfile, function read(err, data) { + if (err) { + cb(err); + } else { + b64data = new Buffer(data).toString('base64'); + cb(null); + } + }); + }, + function(cb) { + fs.unlink(localfile, function(err) { + if (err) { + cb(err); + } else { + cb(null); + } + }); + } + ], + // Top level cb + function(){ + cb(null, { + status: status.codes.Success.code + , value: b64data + }); + }); }; Android.prototype.fakeFlick = function(xSpeed, ySpeed, swipe, cb) { diff --git a/app/android/ScreenShooter.jar b/app/android/ScreenShooter.jar new file mode 100644 index 0000000000000000000000000000000000000000..63c16475db5cf736e036a65881f17adabe23e7fe GIT binary patch literal 7430 zcma)B2UJtp+6`TLON1ar6qKQNq)6|fhtPWnO-O*ydzFq9=~bk6kS3rAh)7X-QJMsh z-UNp#{`mYI-^@7gy_0p5m9@UT?>XPS=bUe!tp&lsB?17h003H=nX-U?YlHw?fVzUN z43~M|NCiV9F&ZgoZXIKF$`yudKe z;ET{#*2BpRK+5)~8T_Q8Z&NNZP=z4d>HzxvB~OKYn?FjxNd7{##0*pLJO02es`!1|9E8EY$LgrhUUl^gD8 ziALw>+xt>af$zev#j%jn0&%cpIZLoO-=$)!M20dL!DT2?;;vCgI_dBy;d`&yDGtWc z=R-0DomvYaNyy=6>X1yNbd-~9)=q=^k>;1tp)X+dp&al4e=0-nvA5gN(cM+k9p7Hm z#qMVjz}Cx-g6TLv+@r@73Y10osI5Hm) zPir<{ME&YPd0iz62Vn3J@%~W%u?djS&&>H)7Rd8KfzQVtblzbFG=G_9?I$YRV@|kK zp`G1}2R2XMcLy&d3|C$~pz>HI(i5%9RG1l!S+}ZlTst|;mwID&;$WXwMFTPF2pbMU zZtR#5d9cQ-+JWn%GsBv)kq$Q}T+N<5DD@8IsLO_F#XT;sit(14h;$HM%Gnqq(qJ~1?_%I! zV7)fMz5VbyqEAY?P7TV@f?WbvpvR&_R!ZwBEOZlk{8Y=FspSMB={F+k3A`j2!1FG$l&JxfO20efo6g%GHraoT9w7NyJAw zesjs?JB+oCfhv&+T(F+a%E3%)2Yn7VR9tQvlitMg{#rV$k@!89>GD*j5q?n^HlFWr zO+Gn!|8acCF2oV1*=jfxd7mv!ytMyDPI1AGIH*K_=5hmJuXp@xv%nz2RcpcWNILeIG5{`+9&G%DjXg;ViF{tE!88fyw*`< zPm7-2II^m{!(Q{xOGUC`F|qr{xS6rBx?&QI_dcSgE;c z=cKNF)&jkqmeDP$=5uaG^ZqI3AR94gY7cJ_TCa>{izO=g>fCT?QX;HkXB=iJ$xlsX zZHzXVxb^vpP>Q=AJrx8G)FkKn$1rwUsJN@Q=dwei%l&N)5`DjsEeOLuHk9Awi*`N1_?oGLQj!J(ss}T57p+cf3LB0+A-t zSyIuA)W&JQ&4xux-=ajck#X7GR3@nyiC3Qvs+x{$yR*@0GaJEGSO@a;*4Yo@e}oWn+g=XS~4Ic^~_1eqZ0zdSzQD)?|b4G&fbNhY=sY zYP>pRb+IKZEMQj>EF$M57o9iYi=$Oeod1$7^b4aO9l;*2Cge_}BfuQfUd9;kMLcBp zmR}7)N2h)>u36Wk6&aECo5MM{&yJj=PbR2>E+Telaz$xo?nKO>=S23jj!1-adUt~G zY@PIL4K0xSeCUJo9g0{732sdA^rYyl=qwtiZ*z@yH>$^WL^QN56?CPiX}OhW?qNV1 zrBzc6Jjq?4kzcJ$&RVRCy4N0-(v)qPIoNwhQN{4Fy7th-!u|?38Cu;yEc(br)8JG> zv$=M6>5bQv(B7GQ%PL)y$~l3JIKd2SfZG=B`VOhdtUF`BJIgCy+r)Oa{i;9+u>?Ff zH^Q5cED4<&i)PGYnQ9*0d@wxlrlE)ceh0(1S<#bE{=jE2-Y1G@kv8!BnDEa0t_!}= zm$P?wBXaSk6PksLJkdrtjnwlQDi`rn$PbWCQdL3n<9;8W{KpJsqO%8;ET-}Ud#Q~* zX$z;jpsnaR@z67F^WyxF&n-D%T_$qN&d0N&ifv3w7c82wPiWiozN+Sa*!ICTWgExT zMSWSCrPjNR?V~Q?9&$ki+9E_%V~ow7N4M&|6p>5(iu0p*_`YEeO^CEh;Q|21gaE*e zf84O;5gzt%#P{7g4(1EJ1_OR|x`LZjME+t@7K0gBre<91@rwLIgsX(DNI1#6>&Z_$W_v|D&^z9tg+aYENv+lC%v-G?yO|9j4RlLjICd>bY<;jki`}(OW)%uF36{)%5tLV~X zwT0sH=`K`@Jo@Y5iKFAx- zD&Ev{6m7#8@~RNg@y2}C?{wTX>E<7ybWOBt%Ij@`4h1)8!g(U=AQS9#ijO}vGLzw` zByCh@v1l~ps7!^k`hR6`3bCWXN$EQ{Ni;bv;@o`h>d1p7fR*urae}}cqQhlinP|7R z!eD;vrV&umHBNAi?l8m&B7!0uS{k(Z4L@hVxn3bYhQ4`8}VsF{ zr>yG>*^M{eg_W_xkQkjDBS}VKLq|`U(9Tb*n@wFivNqS4Mq}=(EfD#Lw(QsykNE-N zVM`50im?IG{JywcS-#=Zc@5EvI9$=2#b^C1Iw??@|4B~Lo$1^V@kGy}lAD>9r8$dcEI7}^ zM@V)Xd(UK8x~*>C=h!AeCz3#NXseq9IOX{{nUqHD_}y&Hm%fZKdyN*%&gsUFa4)5K z(Q7#@FGD4K{I;cjEI)r2Hw?dAeh^-8gtMDH3W@%U)QFyYQuFx|5`YB&@ccLErQ%Td zLG=I2n3g)ETN;?H4lk(7Y%1_XO@_p*s>&4RhNP+PW?4sRCe0;~@1wlgz4i!>AHPgH zCN!H3Z$9|=CM($A-!}luIbJ0QOP1*-6C7(dghYrqxI1~x>@HgdM{*wwn%MVotTD(J z0p+4lv_4cfe%aazb9p<+QXkbnRbEj2m1XW@yhE^|yk2>IVN*hXVM>wiMz4GtsUdV= zK+r6}9UUyAZJV=@=ND{&m|-888qatTxSQj?!EEA4sP;AImh)cnr#Bc{vOrZ&T=UtFJpR9%3%zy<(R@BskM{{gLrvbFu8_~M}Vpkva&yAWbRd#{wVemUtE zP1hG6-3VcO@F{^vS)8})j>h|HR<$f%74~lPef@kUqQ?RkfWU`Kb4?Emw2z1HKJ(nY zySnveXUKdZ0FW*%D?`xW6APE^D#T_I1VgczVpgI;JS1Seakl(6@_Qz)DrHyD{AO(F zy%2DXHD_d%0vN)d$|}!V$;(EZwf~u1e8fwzlOmR3JgI=ah9M<&N+V~`o(=eUf{L>4;@DBsiQ|2XSL#x=0gboB{87@6Gr zUQqL+0Lk{F4$bR_{-O~c_ntZ#3tK8C@RIn#eB)lA(wVrd>bx^sHOWZz2bqy8+dy-^ zuodaP{&YLNkx(-B7mJ>h?uxUW1}v0dgoJfp?kV=Lbx{e!94$)? zbOgCn6)9{IIBf^V(I!0}e6s?B4el6auL>&ym-;DpUZISeL#6~vq9A5%R#)n$R2tM| z3&>iMH~RCiXX+(x>y;)$BYPXlQCWg5O3ieh-eTiy zZF;};3}5|p&RxYAEtm|aM6BZw@XyXQRl$*MB~v+R-k{d$rp+zz&Y~3ekmTw5h}*Eh z;S#r)3qdSJsSNSrv+|aV+6s0g>sEF2%=MALR=S4yl32ypSMJ?hwJ?un^>3I2B~$fb zJCp%%yrc~t$dIIDiLAYgd6rvKdP26)hCU8$#2Z&w(+_gPdKz@fp%YGF$0DT;dwG}k zR$$2SVqjE?115;TB_Y!IZq)i|O4L!A&Q^HH1|D5V9G;-R;!%-2+VIA-&ZuZiHcXJN zk7|utaQHaFK3!kzQM5*(YfwhLMi3drQ|aMuB)KIDq@FJ;;0kH05_!LUyA9{1_?o@v zVXByu$VQm*ZMF8BjADn&(G&2FKW5?g3QW2U(y@vM07#Jl00RHRJc9mfPC~!W$?t1f zik>kV2&1^Tzhxub?aXIFjqK(MQ}2?M?!iq=2$C1MW{rg>pRq+RjMFB*Ip_%B$uB5~ zJURn0RgSWIb+Xf_s`_DMh%dr>LRs7QEkFtw4N*Lk2))eiCD@uB>JUUVgnc&0jM+(tS2*lArOZUitB7nLzb?BxJJsH^2=r)mTPCP46EqX>YkO_?cvgrK4^A0+X^@;? z=RT?_jqXbORiGMb7PMeXmR=W|0qIS8es6Vjo1Y~7Eln@vbRQZ*VeS-#CEkPc_8D;t$1rsnY0rx{w@*I?B+?I-*H|Eyo^5m3 z3fE7)jSR~mRW(`{^q5qO;T{tKaYlV_hL{2scpN3uL}shs_hU4q1L>p zm2}&SmT2eoc;VK!rf9a*5~wG5#hN@D!D92BE)2Vvu=peAkSO8ULe!~j`FyVuyX447 zIBBRcQH7t9m1K`A9&xWTD{wIJ#z6kC#aQf>+-k{W8Nc|OM5%KN6OZmWkS?~y8}|v- zD2K-sS$KHvt|>Mzh%uOdfHZwD5L4|88My}Q)ju{0mZZ&hlzeCF7>Tl$eBR?pWVCZH z;kR@NdT&&o+N4v#GV>6PVZ5GRf!~^=O~mmQwWZC>fR5fRn}uc8G|NxLLVC~pm|cd8 zXSCqW%MPPmyRAY7MjVE*!j5!`;y$w~B`X|*R%=rPPnwD*+*H`(AcUwA}5w}-y z7jM||4S<%~20%$mA-0>ewW`p24of*&RyUqQjnFDy&W*rWo^W)`SQ}b&(Zfbl|yA0-|`E{kiS^SNM7q8VGvLhnOA8TzWGgK89McvMab3ijBy1BS#EZ%4hs3WY^gxtEIdaDm z<(}E$bf{>(#;cU;WmTdCRZk=LA2IQsNw~4!9@pTsqCzCAM0*7V$tXCf@D)Xt$+dp8 zEB#DgOe$LpmFY`pEsF$8Ejn9inJcM7C_je=8M40EVSbTKWwCSRMJ98QHufMBR(eXl z^CCq>bNF%r_hB#CuGSgYdorAS2xRg~GQ(_Yj8^!~srZB%O2jka_z=!2`+%l! zd~if?jLKhG`T#ZzQhd}3r;I**=3PT!rCKn@v|Py=mfnq<9-_f$Pj1t0y3=b1)MmC! zsh+D{05e@OeeiB1Avn(0W705=Onij(F z*r5N4_3TK}lm!a6BF-zjE#f3{J`CxT9wh38t;vrB8-}^vLQ6cz^s1F3mt>i+OYZ7D zwlJOhss+Kq2IBm)XL7lDTs8{8w#>KRKWvfj4$2ScuRWA+fN!lZnB(&M59q%+D*x%` z-)xER?c2@iE(`L1nG`>6`S())n@#Z(ApRZjhiUQ8xNo+_PaOPDxSuA*KjXjI7(emJ zzr=qxHGXjX+Sd5NQW)I(j~st7IezBv*9R{@DZMU_Vt#r!KZfHVgp zzPE4B