Thursday, April 3, 2014

Java配置环境变量

JAVA_HOME: C:\Program Files\Java\jdk1.7.0_51
Classpath: %JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
Path: %JAVA_HOME%\bin;

Wednesday, April 2, 2014

UiAutomator简介(3) - external jar

所有步骤参考改链接的最后一帖:
http://stackoverflow.com/questions/16026355/adding-external-jars-to-an-android-uiautomator-project/19500480#19500480

1. 在项目(UiAutomator)下建立libs文件夹,把所有第三方JARs放入该文件夹(mysql-connector-java-5.1.18-bin.jar)
2. 创建custom_rules.xml from this link in same directory with build.xml (这是build.xml的扩展 in    
     C:\Users\KK\Documents\Coding\Java\UiAutomator):
     https://github.com/xiaocong/android-uiautomator-jsonrpcserver/blob/master/custom_rules.xml
3. Ant Build
4. In ./bin folder, an extra JAR生成为bundle.jar
5. Push & Run
adb push C:\Users\KK\Documents\Coding\Java\UiAutomator\bin\bundle.jar /data/local/tmp/
adb push C:\Users\KK\Documents\Coding\Java\UiAutomator\bin\UiAutomator.jar /data/local/tmp/
adb shell uiautomator runtest UiAutomator.jar bundle.jar -c com.Runner

6. Pull
adb -s emulator-5554 pull /mnt/sdcard/abc.txt C:\



References:
[1]Last posting: http://stackoverflow.com/questions/16026355/adding-external-jars-to-an-android-uiautomator-project/19500480#19500480
[2]

UiAutomator简介(2)

在这篇,会详细介绍UiAutomator怎么获取app的信息


首先,用uiautomator分析页面元素(uiautomatorviewer.bat under tools in android sdk)



旧版uiautomator用class来定位,新版更准确,可以用resourceId来定位


下面说说代码

package com;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class Runner extends UiAutomatorTestCase {

  public void testDemo() throws UiObjectNotFoundException {
   
     // Simulate a short press on the HOME button.
     getUiDevice().pressHome();
   
     UiScrollable appViews = new UiScrollable(new UiSelector()
        .scrollable(true));
   
     UiObject carmaxApp = appViews.getChildByText(new UiSelector()
        .className(android.widget.TextView.class.getName()),
        "CarMax",true);
     carmaxApp.clickAndWaitForNewWindow();
     try
     {
     Thread.sleep(3000);
     }
     catch (InterruptedException e1) {
       e1.printStackTrace();
     }
   
     //getUiDevice().click(721,589);
     new UiObject(new UiSelector().className("android.widget.EditText")).setText("Blue");
     //new UiObject(new UiSelector().description("loginButton")).click();
 

     try
     {
     Thread.sleep(3000);
     }
     catch (InterruptedException e1) {
       e1.printStackTrace();
     }
     getUiDevice().pressEnter();
     getUiDevice().pressEnter();
   
     UiObject listCars = new UiObject(new UiSelector().className("android.widget.ListView"));
   
     for(int j=0;j<listCars.getChildCount()-1;j++)
  {
  //System.out.println("index:"+j);
  UiObject objName = new UiObject(new UiSelector().className("android.widget.TextView").instance(j));
        String name = objName.getText();
        System.out.println(name);

  }

 }

}



这里是打开carmax这个app,然后输入blue关键字进行搜索,再打印第一页的汽车名字。
uiautomator api的reference: http://developer.android.com/tools/help/uiautomator/index.html

reference:
androd key events:
http://developer.android.com/reference/android/view/KeyEvent.html

UiAutomator简介(1)

UiAutomator也是用于Android testing的工具并且是Android亲生的,语言是JAVA(不同于MonkeyRunner的python),功能也比MonkeyRunner强大,可以跨app测试。只是比起MonkeyRunner配置麻烦点。

具体步骤可参考:http://blog.csdn.net/u010961631/article/details/9616581
1. 新建Java Project叫UiAutomator
2. 添加JUnit库 (add library)
3. 添加Android库 (add external JARs:android.jar & uiautomator.jar under android-sdk platforms).  在2022年,android库已经绑定到android studio中,所以要先下载它,再在studio中下载API 19版本的SDK,
C:\Users\KK\AppData\Local\Android\Sdk\platforms\android-19
下载以后会看到
C:\Users\KK\AppData\Local\Android\Sdk\platform-tools\adb.exe
C:\Users\KK\AppData\Local\Android\Sdk\platforms\android-19\android.jar
C:\Users\KK\AppData\Local\Android\Sdk\platforms\android-19\uiautomator.jar

另一种方法是用以前的安装包,保留在C:\Users\KK\Documents\MyFiles\Coding\Java\UiAutomator2022
System environment加入到path中:
C:\Users\KK\Downloads\platform-tools_r33.0.2-windows\platform-tools (adb) 
C:\Users\KK\Downloads\tools_r22.6.1-windows\tools (android.bat)
C:\Users\KK\Downloads\apache-ant-1.9.16\bin (ant)
第二个https://dl-ssl.google.com/android/repository/tools_r22.6.1-windows.zip中下载 (ref)

4. 在src中添加包com,然后添加HelloWorld.java文件
代码如下:

package com.jctech.uiautomator;  
import com.android.uiautomator.core.UiObject;  
import com.android.uiautomator.core.UiObjectNotFoundException;  
import com.android.uiautomator.core.UiScrollable;  
import com.android.uiautomator.core.UiSelector;  
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class HelloWorld extends UiAutomatorTestCase {   


  public void testDemo() throws UiObjectNotFoundException {   

     
     // Simulate a short press on the HOME button.
     getUiDevice().pressHome();
       getUiDevice().pressHome();
     
     UiScrollable appViews = new UiScrollable(new UiSelector()
        .scrollable(true));
     
     UiObject carmaxApp = appViews.getChildByText(new UiSelector()
        .className(android.widget.TextView.class.getName()), 
        "CarMax",true);
     carmaxApp.clickAndWaitForNewWindow();

 }   



}



5. 获得Android ID
    cd C:\Users\KK\AppData\Local\Android\Sdk\tools
    Run android list and get id=1 for "android-19"
    2022年android命令已经被deprecated,所以需要从release notes里面下载。
    下载完毕后,到tools目录,此时跑android list没有任何目标,因为没有安装任何android api (version),所 
    以先要type android,这是SDK UI就会出现,安装android 19。安装完毕后,再type android list, 就会出现
    id=1 (如果只装了一个API的话)
6. 生成build.xml
C:\Users\KK\Downloads\tools_r22.6.1-windows\tools>android create uitest-project -t 1 -p C:\Users\KK\Documents\MyFiles\Coding\Java\UiAutomator2022 -n UiAutomator

7. Install ant
    Download the latest zip file from http://ant.apache.org/bindownload.cgi
    Unzip it
    Put this directory\bin in path (C:\Users\KK\Documents\Coding\apache-ant-1.9.3\bin)

    Open Cmd and type ant. If output is good, installation is sucessful.
8. 用ant Build项目
cd C:\Users\KK\Documents\MyFiles\Coding\Java\UiAutomator2022
ant build

生成的UiAutomator.jar在项目root文件中的bin文件夹
ant需要JDK的系统参数,所以要加入到系统变量中。
JAVA_HOME: C:\Program Files\Java\jdk1.8.0_111

9. build成功后,把刚生成的jar Deploy到手机
cd C:\Users\KK\Documents\MyFiles\Coding\Java\UiAutomator2022

adb push C:\Users\KK\Documents\MyFiles\Coding\Java\UiAutomator2022\bin\UiAutomator.jar /data/local/tmp/
adb shell uiautomator runtest UiAutomator.jar -c com.jctech.uiautomator.HelloWorld >> file.txt

这个例子是跳到Home页面,然后打开carmax这个app,所以要确保carmax在home页面里。最后的结果输出到cmd控制台或者file.txt

蓝色三个步骤是在cmd进行,如果java文件数量不变,生成build.xml这步可以忽略

10. 如果更改代码, 需要重复8 - 9步的三个命令。

adb对某设备: adb -s <serialNumber> <command>
adb devices

可以在path加入$android-sdk\platform-tools这样可以在任意路径 运行adb

其他可以和UIAutomator结合用的emulator包括BlueStacks, BlueStack不支持proxy
调用adb connect localhost即可连上emulator
http://diveshblog.weebly.com/blog/working-with-uiautomator
如果公司网络用的是proxy可能需要安装ProxyCap来连接internet
http://www.inforaid.com/change-bluestacks-proxy-settings-use-proxy-server/

References:
[0] https://www.softwaretestinghelp.com/uiautomator-tutorial/
[1] http://blog.csdn.net/u010961631/article/details/9616581
[2] http://developer.android.com/tools/testing/testing_ui.html
[3] http://blog.chengyunfeng.com/?p=504














Tuesday, April 1, 2014

Java连接MySQL (本地+远程)

1. 下载MySQL driver for Java (jar): mysql conector-java.jar
2. 加入到项目的external JARs
2.  Local MySQL是用wamp的服务,而服务器MySQL是godaddy的服务

本地连接:
代码如下:

package rename;

import java.sql.*;

public class Rename {
public static void main(String[] args){

        Connection conn = null;
         try
         {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mymenu", "root", "");
            //System.out.print("Conn Succeed");        
         
            String sql = "select * from dishes";  
            Statement st = (Statement) conn.createStatement();  
            ResultSet rs = st.executeQuery(sql);  

            if(rs.next()) {
                String name = rs.getString("DishName");
                String tags = rs.getString("Tags");
                int count = rs.getInt("ClickCount");
                System.out.println(name + " " + tags + " " + count);
           
            }
            conn.close();
           
         }
         catch (Exception e)
        {
                  System.out.println("Db conn failed" + e.getMessage());
         }

}
}


这个例子是连接本地MySQL的数据库(dbname) mymenu,wamp的用户名默认是root,密码默认为空。然后是连接Table dishes,这个表含有Columns: DishName, Tags, ClickCount.

远程服务器连接:
把上述conn改为:
conn = DriverManager.getConnection("jdbc:mysql://<hostname>:3306/<dbname>", "<username>", "<pw>");

<hostname>也可以为db server的ip







安装apk到虚拟机emulator

1. 下载apk(可以用apk finder网下载或者结合apk extrator&ES file explorer下载)
2. 打开虚拟机(电脑不能用proxy上网,否则虚拟机没法上网)
2. 到android sdk里面的adb目录,比如C:\Users\KK\AppData\Local\Android\android-sdk\platform-tools,然后输入命令adb install C:\Users\KK\Documents\Coding\Python\Pandora_apkfiles.com.apk
过一会会出现如下信息:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
263 KB/s (5357476 bytes in 19.864s)
        pkg: /data/local/tmp/Pandora_apkfiles.com.apk
Success
表示成功安装


不过,大部分apk安装过程都会出现如下错误:
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
这是因为apk需要重新签名,可以按以下步骤完成:

1. 从http://selendroid.io/下载selendroid jar并配置系统变量(非用户)
2. ANDROID_HOME=c:\Android\sdk, 加入到path: %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools(非必要步骤)

3.
java -jar C:\selendroid-standalone-0.10.0-with-dependencies.jar -app C:\Mobile\com.carmax_1.7.3.apk

新生成的apk将会生成在原apk同一文件夹下并且加入前缀resigned-, 此例中为resigned-com.carmax_1.7.3.apk.

4. 安装
adb install -r C:\Mobile\resigned-com.carmax.carmax_1.7.3.apk
adb -s emulator-5554 install -r C:\Mobile\resigned-com.carmax.carmax_1.7.3.apk

有时还会出现以下错误:
[INSTALL_FAILED_MISSING_SHARED_LIBRARY]
这个表示缺少Google maps,在Android SK manager中安装Google APIs (ARM System Image)
然后emulator配置中选target: Google APIs (not Android 4.4.2), 选上Use Host GPU(为界面响应加速)
这个可以解决以上错误或者target用最新的4.4.2的API,这个是自带google maps


Use proxy on emulator:

in CMD, enter emulator -avd test -http-proxy http://168.192.1.2:3300


Wednesday, March 26, 2014

Fiddler简介与Firebug

Fiddler contains web sessions (left), request (right top) and response windows (right bottom).
Sometimes, it can only capture traffic in IE
   

           1. Build a POST request

HTTP method: POST
URL: http://www.choicehotels.com/ires/en-US/html/Availability
Request Header (Required for POST): Content-Type: application/x-www-form-urlencoded
Request Body (Post data):
month=3&day=28&depart_month=3&depart_day=30&srp=RACK&hotel=NY618&sid=&nadult=1&nchild=0&xtrabed=none&count=1&dates_rqd=true&createarrivalcookie=yes


/*Booking data range: 3/28-3/30*/

Then Click Execute and the result will show up in the web session


  2. Analyze a POST request

Click the web session (left in Fiddler)

Request (right top):
I.                    Check the request headers here:

II.                  Check the request body here:



Response (right bottom):



3. How to find out the HTTP request to get the info we want

Take choice hotels for example: http://www.choicehotels.com/. The target is to get the rates for specific hotels given a data range.
a)      Search the hotels by zipcode (07302) at homepage
b)      Click one hotel in the result page
c)       In the detail page for that hotel, click Rates tab
d)      Update the check-in & check-out dates

You will see the http://www.choicehotels.com/ires/en-US/html/Availability with POST data by Fiddler.

Fiddler还可以用于捕捉http request,具体参见Fiddler捕捉手机app的http request

Firebug

与Fiddler很类似的工具就是Firefox,步骤是
1. 安装插件Firebug
2. 按firebug钮
,出现firebug窗口





3. 按Net tab并且enable
4. 最后可以在搜索可能出现在para或者response中的关键字