<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    關于安卓通過webservice訪問數據庫問題

     ============問題描述============
      訪問數據庫時,手機能增刪數據庫的數據就是顯示不了數據庫的里的數據不知道是哪里的問題,用的HTTP
      這是我webservice中的產看所有信息的方法:
    public List<string> selectAllCargoInfor()
    {
    List<string> list = new List<string>();
    try
    {
    string sql = "select * from C";
    SqlCommand cmd = new SqlCommand(sql,sqlCon);
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
    //將結果集信息添加到返回向量中
    list.Add(reader[0].ToString());
    list.Add(reader[1].ToString());
    list.Add(reader[2].ToString());
    }
    reader.Close();
    cmd.Dispose();
    }
    catch(Exception)
    {
    }
    return list;
    }
      接下來是安卓端的:
      這個是MainActivity中的設置LISTVIEW的方法
    private void setListView() {
    listView.setVisibility(View.VISIBLE);
    List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    list = dbUtil.getAllInfo();
    adapter = new SimpleAdapter(MainActivity.this, list, R.layout.adapter_item,
    new String[] { "Cno", "Cname", "Cnum" },
    new int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });
    listView.setAdapter(adapter);
    }
      這個是操作類:
    public List<HashMap<String, String>> getAllInfo() {
    List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    arrayList.clear();
    brrayList.clear();
    crrayList.clear();
    new Thread(new Runnable() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    crrayList = Soap.GetWebServre("selectAllCargoInfor", arrayList, brrayList);
    }
    }).start();
    HashMap<String, String> tempHash = new HashMap<String, String>();
    tempHash.put("Cno", "Cno");
    tempHash.put("Cname", "Cname");
    tempHash.put("Cnum", "Cnum");
    list.add(tempHash);
    for (int j = 0; j < crrayList.size(); j += 3) {
    HashMap<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("Cno", crrayList.get(j));
    hashMap.put("Cname", crrayList.get(j + 1));
    hashMap.put("Cnum", crrayList.get(j + 2));
    list.add(hashMap);
    }
    return list;
    }
    連接webservice的那個方法HttpConnSoap應該是沒問題的因為數據庫的增刪都是可以的,就是無法實現這個顯示所有信息到LISTVIEW中的這個功能不知道為什么,LOGCAT中也是一片綠沒什么問題
      LOGCAT中的信息:
    05-02 15:51:40.642: I/System.out(3678): <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><selectAllCargoInforResponse xmlns="http://tempuri.org/"><selectAllCargoInforResult><string>1</string><string>rice</string><string>100</string><string>2</string><string>dog</string><string>50</string><string>3</string><string>白癡</string><string>25</string></selectAllCargoInforResult></selectAllCargoInforResponse></soap:Body></soap:Envelope>
    05-02 15:51:40.647: I/System.out(3678): <?xml version="1.0" encoding="utf-8"?
    05-02 15:51:40.647: I/System.out(3678): soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    05-02 15:51:40.647: I/System.out(3678): soap:Body
    05-02 15:51:40.647: I/System.out(3678): selectAllCargoInforResponse xmlns="http://tempuri.org/"
    05-02 15:51:40.647: I/System.out(3678): selectAllCargoInforResult
    05-02 15:51:40.647: I/System.out(3678): 0
    05-02 15:51:40.647: I/System.out(3678): string>1</string
    05-02 15:51:40.647: I/System.out(3678): string>rice</string
    05-02 15:51:40.647: I/System.out(3678): string>100</string
    05-02 15:51:40.647: I/System.out(3678): string>2</string
    05-02 15:51:40.652: I/System.out(3678): string>dog</string
    05-02 15:51:40.652: I/System.out(3678): string>50</string
    05-02 15:51:40.652: I/System.out(3678): string>3</string
    05-02 15:51:40.652: I/System.out(3678): string>白癡</string
    05-02 15:51:40.652: I/System.out(3678): string>25</string
    05-02 15:51:40.652: I/System.out(3678): /selectAllCargoInforResult
    05-02 15:51:40.652: I/System.out(3678): 1
      ============解決方案1============
      分析原因就是在線程還沒有執行完時候,getAllInfo早已執行完畢以后,,所以在執行for (int j = 0; j < crrayList.size(); j += 3)時候, crrayList為零行。你取出的LOGCAT是執行請求以后的返回數據,這時候setListView方法早已經走完,所以只有一行數據。截圖中的一行數據來自
      HashMap<String, String> tempHash = new HashMap<String, String>();
      tempHash.put("Cno", "Cno");
      tempHash.put("Cname", "Cname");
      tempHash.put("Cnum", "Cnum");
      list.add(tempHash);
      使用Thread應該配合Handler來使用。
      我把代碼修改一下
    private final static int   REQUEST_SUCCESS = 1;
    private final static int   REQUEST_FALSE = 0;
    private void RequestData()
    {
    arrayList.clear();
    brrayList.clear();
    crrayList.clear();
    new Thread(new Runnable() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    crrayList = Soap.GetWebServre("selectAllCargoInfor", arrayList, brrayList);
    Message msg = new Message();
    if(crrayList.size()>0)
    {
    msg.what = REQUEST_SUCCESS;
    }
    else
    {
    msg.what = REQUEST_FALSE;
    }
    // 發送消息
    mHandler.sendMessage(msg);
    }
    }).start();
    }
    public Handler mHandler = new Handler(){
    // 接收消息
    @Override
    public void handleMessage(Message msg) {
    // TODO Auto-generated method stub
    super.handleMessage(msg);
    switch (msg.what)
    {
    case REQUEST_SUCCESS:
    setListView();
    break;
    case REQUEST_FALSE:
    // 做錯誤處理
    break;
    default:
    break;
    }
    }
    };
    private void setListView() {
    listView.setVisibility(View.VISIBLE);
    List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    list = dbUtil.getAllInfo();
    adapter = new SimpleAdapter(MainActivity.this, list, R.layout.adapter_item,
    new String[] { "Cno", "Cname", "Cnum" },
    new int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });
    listView.setAdapter(adapter);
    }
    public List<HashMap<String, String>> getAllInfo() {
    List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> tempHash = new HashMap<String, String>();
    tempHash.put("Cno", "Cno");
    tempHash.put("Cname", "Cname");
    tempHash.put("Cnum", "Cnum");
    list.add(tempHash);
    for (int j = 0; j < crrayList.size(); j += 3) {
    HashMap<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("Cno", crrayList.get(j));
    hashMap.put("Cname", crrayList.get(j + 1));
    hashMap.put("Cnum", crrayList.get(j + 2));
    list.add(hashMap);
    }
    return list;
    }
      執行RequestData就可以,我沒法編譯,細節自己再調整看一下,應該能解決問題了。
      你給的分數太少了,大牛們都不給你解答。如果解決問題就給分哈。
      另外,Java多線程的操作可以系統學習一下。工作中使用極為頻繁

    posted @ 2014-12-11 23:42 順其自然EVO 閱讀(881) | 評論 (0)編輯 收藏

    PLSQL Developer鮮為人知的快捷鍵

    注釋:
      使用PLSQL Developer的朋友們是否有遇到如下情況
      ① 不小心關閉了有用的窗口;
      ② 有意義的sql前幾分鐘不用了且關閉的情況;
      ③ PLSQL Developer界面中其中1個session 死掉了不得不關閉時,再重新開啟點擊恢復會話后可能不會和之前場景一摸一摸時;
      如上的情況都可以通過如下快捷鍵進行恢復.
      Ctrl+E【default】  ==> Edit / Recall Statement
      顯示結果:
      選中任意一行 雙擊 直接進入源編輯界面.
      更改該快捷鍵步驟:
      PLSQL Developer --> tools --> preferences --> key configuration

    posted @ 2014-12-11 23:40 順其自然EVO 閱讀(1391) | 評論 (0)編輯 收藏

    淘寶分布式配置管理服務Diamond

     在一個分布式環境中,同類型的服務往往會部署很多實例。這些實例使用了一些配置,為了更好地維護這些配置就產生了配置管理服務。通過這個服務可以輕松地管理這些應用服務的配置問題。應用場景可概括為:
      zookeeper的一種應用就是分布式配置管理(基于ZooKeeper的配置信息存儲方案的設計與實現)。百度也有類似的實現:disconf。
      Diamond則是淘寶開源的一種分布式配置管理服務的實現。Diamond本質上是一個Java寫的Web應用,其對外提供接口都是基于HTTP協議的,在閱讀代碼時可以從實現各個接口的controller入手。
      分布式配置管理
      分布式配置管理的本質基本上就是一種推送-訂閱模式的運用。配置的應用方是訂閱者,配置管理服務則是推送方。概括為下圖:
      其中,客戶端包括管理人員publish數據到配置管理服務,可以理解為添加/更新數據;配置管理服務notify數據到訂閱者,可以理解為推送。
      配置管理服務往往會封裝一個客戶端庫,應用方則是基于該庫與配置管理服務進行交互。在實際實現時,客戶端庫可能是主動拉取(pull)數據,但對于應用方而言,一般是一種事件通知方式。
      Diamond中的數據是簡單的key-value結構。應用方訂閱數據則是基于key來訂閱,未訂閱的數據當然不會被推送。數據從類型上又劃分為聚合和非聚合。因為數據推送者可能很多,在整個分布式環境中,可能有多個推送者在推送相同key的數據,這些數據如果是聚合的,那么所有這些推送者推送的數據會被合并在一起;反之如果是非聚合的,則會出現覆蓋。
      數據的來源可能是人工通過管理端錄入,也可能是其他服務通過配置管理服務的推送接口自動錄入。
      架構及實現
      Diamond服務是一個集群,是一個去除了單點的協作集群。如圖:

    服務之間同步
      Diamond服務集群每一個實例都可以對外完整地提供服務,那么意味著每個實例上都有整個集群維護的數據。Diamond有兩種方式保證這一點:
      任何一個實例都有其他實例的地址;任何一個實例上的數據變更時,都會將改變的數據同步到mysql上,然后通知其他所有實例從mysql上進行一次數據拉取(DumpService::dump),這個過程只拉取改變了的數據
      任何一個實例啟動后都會以較長的時間間隔(幾小時),從mysql進行一次全量的數據拉取(DumpAllProcessor)
      實現上為了一致性,通知其他實例實際上也包含自己。以服務器收到添加聚合數據為例,處理過程大致為:
    DatumController::addDatum // /datum.do?method=addDatum
    PersistService::addAggrConfigInfo
    MergeDatumService::addMergeTask // 添加一個MergeDataTask,異步處理
    MergeTaskProcessor::process
    PersistService::insertOrUpdate
    EventDispatcher.fireEvent(new ConfigDataChangeEvent // 派發一個ConfigDataChangeEvent事件
    NotifyService::onEvent // 接收事件并處理
    TaskManager::addTask(..., new NotifyTask // 由此,當數據發生變動,則最終創建了一個NoticyTask
    // NotifyTask同樣異步處理
    NotifyTaskProcessor::process
    foreach server in serverList // 包含自己
    notifyToDump // 調用 /notify.do?method=notifyConfigInfo 從mysql更新變動的數據
    DatumController::addDatum // /datum.do?method=addDatum
    PersistService::addAggrConfigInfo
    MergeDatumService::addMergeTask // 添加一個MergeDataTask,異步處理
    MergeTaskProcessor::process
    PersistService::insertOrUpdate
    EventDispatcher.fireEvent(new ConfigDataChangeEvent // 派發一個ConfigDataChangeEvent事件
    NotifyService::onEvent // 接收事件并處理
    TaskManager::addTask(..., new NotifyTask // 由此,當數據發生變動,則最終創建了一個NoticyTask
    // NotifyTask同樣異步處理
    NotifyTaskProcessor::process
    foreach server in serverList // 包含自己
    notifyToDump // 調用 /notify.do?method=notifyConfigInfo 從mysql更新變動的數據
      雖然Diamond去除了單點問題,不過問題都下降到了mysql上。但由于其作為配置管理的定位,其數據量就mysql的應用而言算小的了,所以可以一定程度上保證整個服務的可用性。
      數據一致性
      由于Diamond服務器沒有master,任何一個實例都可以讀寫數據,那么針對同一個key的數據則可能面臨沖突。這里應該是通過mysql來保證數據的一致性。每一次客戶端請求寫數據時,Diamond都將寫請求投遞給mysql,然后通知集群內所有Diamond實例(包括自己)從mysql拉取數據。當然,拉取數據則可能不是每一次寫入都能拉出來,也就是最終一致性。
      Diamond中沒有把數據放入內存,但會放到本地文件。對于客戶端的讀操作而言,則是直接返回本地文件里的數據。
      服務實例列表
      Diamond服務實例列表是一份靜態數據,直接將每個實例的地址存放在一個web server上。無論是Diamond服務還是客戶端都從該web server上取出實例列表。
      對于客戶端而言,當其取出了該列表后,則是隨機選擇一個節點(ServerListManager.java),以后的請求都會發往該節點。
      數據同步
      客戶端庫中以固定時間間隔從服務器拉取數據(ClientWorker::ClientWorker,ClientWorker::checkServerConfigInfo)。只有應用方關心的數據才可能被拉取。另外,為了數據推送的及時,Diamond還使用了一種long polling的技術,其實也是為了突破HTTP協議的局限性。如果整個服務是基于TCP的自定義協議,客戶端與服務器保持長連接則沒有這些問題。
      數據的變更
      Diamond中很多操作都會檢查數據是否發生了變化。標識數據變化則是基于數據對應的MD5值來實現的。
      容災
      在整個Diamond系統中,幾個角色為了提高容災性,都有自己的緩存,概括為下圖:
      每一個角色出問題時,都可以盡量保證客戶端對應用層提供服務。
      圖中可分為以下部分講解:

    posted @ 2014-12-11 23:39 順其自然EVO 閱讀(2244) | 評論 (0)編輯 收藏

    靜態自動檢查代碼缺陷與隱患

    代碼缺陷和代碼錯誤的最大區別是,代碼缺陷不影響游戲編譯,而代碼錯誤編譯都不通過。但是代碼缺陷會影響游戲發布后產生的一系列BUG。。我今天無意間逛外國論壇發現的一個方法,使用了一下感覺挺給力的第一時間分享給大家。 下載下來以后,它是一個文件夾把整個文件夾拷貝在你unity的工程里面就行了。
      然后下載最新的mono 它是跨平臺的,我用的是MAC所以我下載的就是一個 dmg文件, 下載完畢后安裝完成即可。
      如下圖所示, 選擇Assets->Gendarme Report Level 選項,將彈出Gendarme界面,你可以選擇它的優先級,然后點擊Start按鈕。如果報錯的話,請把Assets文件夾下的gendarme文件夾和gendarme-report.html文件刪除。
      如果你的項目比較大的話需要耐心的等待一下,大概1分鐘左右。Report生成完畢后會彈出如下窗口,點擊Open Report按鈕即可。
      如下圖所示,他會生成一個Html的頁面在本地,打開后寫的非常清晰,并且已經分好了類,他會告訴你那一行代碼有缺陷,如何來修改你的代碼。一不小心代碼就一大堆隱患,趕快一個一個修改吧~

    posted @ 2014-12-11 23:38 順其自然EVO 閱讀(458) | 評論 (0)編輯 收藏

    敏捷開發下平衡質量和進度

      敏捷軟件開發團隊必須確保他們開發出來的產品質量能夠滿足要求,管理團隊也經常希望開發團隊能夠提高速度以實現為客戶提供更多的功能。本篇文章中多個作者探討了質量和速度之間的關系,并提出了一些既能提高質量也能加快進度的方法。
      Bob Galen曾今在他的博客中發表了讀懂我的唇語-敏捷并不快速的文章,在其中寫到了追求軟件開發進度下質量的重要性。
      敏捷是一個“質量游戲”,如果你以正直,承諾以及平衡的心態來玩這個游戲的話,那么結果將會是非常好的“速度游戲”,但它(速度)卻并非沒有代價。。。
      如果你無法玩轉這個質量游戲,你所采納的敏捷開發方法甚至比你以前使用的開發方法更慢。
      團隊必須致力于把工作在一個迭代中完成,這也就意味著這些工作需要滿足定義工作完成的所有標準。
      很多敏捷團隊允許返工 – 修復漏洞,完成測試自動化,重構,或者設計不良導致sprint迭代的延誤。即使大多數的敏捷工具允許拆分用例故事以捕捉在sprint迭代中已經完成的工作對比延期的工作,我也還是認為這給團隊傳達了錯誤的信息,讓他們認為工作不在一個sprint迭代內完成是可以接受的。
      讀懂我的唇語 – 并不是把所有事情做完,做完,做完!
      正如Bob解釋的:一個組織不應該總是力圖讓進度變得更快,而應該更加注重質量。
      因此,下一次當你聽到有人在激情澎湃的談論著敏捷代表了更快的速度時,請打斷他們,嘗試向他們解釋敏捷并不是一個“速度游戲”,而是應該強調敏捷是一個“或許能夠快速運轉的質量游戲”。
      Tim Ottinger曾今寫過關于敏捷團隊進度的14個奇怪觀點,其中一個觀點中就提到了質量和速度之間的關系。
      盡管大家通常會降低質量要求以求在較短時間內盡快完成工作,但是如果團隊所開發的代碼質量不高的話,經過全部sprint迭代后的進度最終都還是會被降低。
      Stephen Haunts在他的題目為進度并不是目標或者目的博客帖子中,描述了當管理者設定團隊的進度目標后對質量會產生什么影響:
      (…)為了增加交付的功能點數目以滿足績效目標,團隊會犧牲掉系統的質量,但從長遠來看這樣最終還是會降低團隊的進度,并且會引入技術隱患。敏捷團隊最好關注正在開發系統的質量與流程過程(持續交付和集成等等),以及負責開發系統的團隊成員本身。
      軟件開發者必須在進度和質量之間掌握平衡,正如Blake Haswell在文章什么是代碼質量中解釋的那樣:
      雖然經常會有很多的外部壓力向進度方面傾斜,但是如果你不夠重視質量的話,進度最終還是會趨于緩慢以及停滯,以至最終整個項目走向顛覆。考慮到一個項目的代碼質量決定了它能夠在多大程度上適應需求的變化,一個可以持續改進的事情是你需要花費一部分時間來優化自己項目的代碼質量。
      Blake提供了一個可以用來檢查代碼質量的屬性列表:
      可理解性: 代碼需要在各個層面上能夠被容易地理解。理想情況下,軟件應該非常簡單,并沒有非常明顯的缺陷。
      可測試性: 代碼需要被編寫的非常容易被測試。
      正確性: 代碼需要滿足功能和非功能性的需求。
      有效性: 代碼需要有效的使用系統資源(內存,CPU,網絡連接,等)。
      Hugo Baraúna在他的博客文章名為內部質量低下軟件的癥狀中解釋了軟件是如何因為變更而“變得更糟”的,最終導致質量低下并且降低進度。
      假如你正在領導一家創業公司的技術或者產品團隊,你是首席技術官,并且已經推出了你們產品的第一個版本,做的還挺成功的。你們的業務模型已經得到了驗證,現在你們正處于快速發展期。這真是太棒了!但這也是有代價的,它帶來了一系列新的挑戰。
      你們產品的第一個版本工作的很好,但是代碼庫卻無法滿足持續發展的要求。或許你的團隊進度并沒有像以前那樣好了,團隊成員一直在抱怨代碼的質量問題,首席執行官和產品經理想要一些新的功能,但你現在代碼規劃根本無法滿足業務的需求。
      他提供了一個指示質量低下的癥狀列表,這個列表能夠幫助你來決定是否需要重寫或者重構:
      所有事情都很艱難
      進度慢
      測試套件運行緩慢
      無法避免的缺陷
      你的團隊是消極的
      知識缺乏共享
      新開發人員成長周期太長
      你又是如何平衡質量和進度的呢?

    posted @ 2014-12-11 23:37 順其自然EVO 閱讀(699) | 評論 (0)編輯 收藏

    Appium Inspector 真機定位元素

    對環境的需求:
      iOS
      Mac OSX 10.7+
      XCode 4.5+ 和 Command Line Tools
      npm 0.8 or greater
      Mac OS X 10.7 or higher, 10.8.4 recommended
      XCode >= 4.6.3
      檢查一下:
      發現兩個網址的說法不同,安全第一,弄個高版本的吧。
      我弄了一個Xcode5.0.2,安裝好了以后,繼續安裝Command Line Tools:
      好了,環境基本上弄好了,看看別人的帖子說法:
      1、安裝node.js
      2、安裝appium
      $ npm install -g appium@0.12.3
      注意appium的版本和os的兼容。
      3、啟動appium
      $appium &
      真機上測試,啟動時指定設備的UUID
      $appium -U xxxxxxxxxxxxxxxxxxxxxxxxxx
      appium啟動服務的參數詳細:
      https://github.com/appium/appium/blob/master/docs/server-args.md
     4、真機上運行,被測app必須是Developer版本。
      再看看官方網頁的說法:
      npm install -g appium
      npm install wd
      appium &
      node your-appium-test.js
      哇,好簡單呀!想得美,會者不難而已。
      開始吧:
      需要先安裝一個node,不過我的機器上沒有brew所以還得先安裝一下brew,brew類似于ubuntu下面的apt-get,就是用做聯網搜軟件然后幫你安裝上的一個管理工具,哎呀,這種描述好粗糙,能明白我的意思就行了 ^_^,先搜了一個方法:
      cd /usr/local
      mkdir homebrew
      cd homebrew
      curl -LsSf http://github.com/mxcl/homebrew/tarball/master | tar xvz -C/usr/local --strip 1
      cd bin
      ./brew -v
      file brew
      sudo ./brew update
      more brew
      自己做了一遍,大致是這個步驟,順利安裝上了:
      admins-Mac:local admin$ cd bin
      admins-Mac:bin admin$ ./brew -v
      Homebrew 0.9.5
      admins-Mac:bin admin$ file brew
      brew: POSIX shell script text executable
      cd
      vi .bash_profile
      export PATH=/usr/local/homebrew/bin:$PATH
      關閉后重新打開terminal,使.bash_profile被執行,使得PATH環境變量生效,當然你也可以source ./.bash_profile
      在這個安裝的過程中,唯一需要注意的是權限,我的作法是在所有步驟之前直接把/usr/local目錄都改為了admin所有,就不用每次安裝都用sudo來搞了
      sudo chown -Rf admin:staff /usr/local
      這下安裝node.js就簡單了,一行命令:
      brew install node
      然后就是看看node安裝的對不對,先vi hello_world.js,輸入以下內容(假定你會用vi,vim一類的編輯器)
      var sys = require('sys'),
      http = require('http');
      http.createServer(function(req, res) {
      setTimeout(function() {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.write('Hello World');
      res.end();//截至最新版 res.close(); 以替換為 res.end();
      }, 2000);
      }).listen(8000);
      執行命令:
      node hello_world.js
      下面這樣瀏覽器返回了Hello World字樣就是成功了。
      最后檢查一下:
      node -v
      v0.10.15
      npm -v
      1.4.6
      好了,全齊了。這下該正事了:
      npm install -g appium
      npm install wd
      運行appium-doctor來檢查一下appium是不是都徹底ok了:
      admins-Mac:bin admin$ pwd
      /usr/local/bin
      admins-Mac:bin admin$ ls -l
      total 39064
      lrwxr-xr-x  1 admin  staff        40 Apr 14 16:33 appium -> ../lib/node_modules/appium/bin/appium.js
      lrwxr-xr-x  1 admin  staff        47 Apr 14 16:33 appium-doctor -> ../lib/node_modules/appium/bin/appium-doctor.js
      lrwxr-xr-x  1 admin  staff        47 Apr 14 16:33 authorize_ios -> ../lib/node_modules/appium/bin/authorize-ios.js
      -rwxrwxr-x  1 admin  staff       813 Apr 14 08:53 brew
      -rwxr-xr-x  1 admin  staff  19975968 Jul 26  2013 node
      lrwxr-xr-x  1 admin  staff        38 Jul 31  2013 npm -> ../lib/node_modules/npm/bin/npm-cli.js
      lrwxr-xr-x  1 admin  staff        33 Jul 31  2013 weinre -> ../lib/node_modules/weinre/weinre
      因為這臺mac上沒有android環境,所以報錯,我也沒打算在這臺mac上測試android程序,所以不用搭理。Appium已經OK了。
      啟動appium(&的意思是后臺執行,不占用窗口):
      admins-Mac:appium admin$ appium &
      [1] 1886
      admins-Mac:appium admin$ info: Welcome to Appium v0.18.1 (REV d242ebcfd92046a974347ccc3a28f0e898595198)
      info: Appium REST http interface listener started on 0.0.0.0:4723
      info: socket.io started
      info: Non-default server args: {"merciful":true}
      檢查進程,順帶刪除掉這個后臺進程:
      admins-Mac:appium admin$ ps -ef|grep appium
      501  1886  1274   0  4:47PM ttys000    0:00.73 node /usr/local/bin/appium
      501  1892  1274   0  4:48PM ttys000    0:00.00 grep appium
      admins-Mac:appium admin$ kill 1886
      好了,環境部分差不多就這樣了。

    posted @ 2014-12-11 23:36 順其自然EVO 閱讀(2030) | 評論 (0)編輯 收藏

    Appium Inspector 真機定位元素

      自動化測試過程中,對被測試元素的定位是相當重要的。前面文章中也講到了一些兒定位方法。今天講解,如何用真機運行程序,用Appium Inspector,UI Automation Viewer來定位App的元素。
      一、Inspector定位
      平時我們定位元素的時候,通常是按下面的方式設置的。
      Device Name填寫的是模擬器的名稱,啟動模擬器,appium后,再啟動Inspector就能Reflesh啟動App,來進行操作。可是這存在一個問題:模擬器比較慢,而且多少和真機不一樣,比如說模擬器不能調出手機鍵盤等;所以如果我們要做自動化測試的時候,最好還是用真機來運行app,然后進行定位。
      真機運行Inspector的時候也非常簡單,首先將手機連接到電腦上。如果有91手機助手或是類似的軟件的時候,就會提示是否連接成功!一定要確保連接成功,然后將Device Name替換成手型號,如下所示:
      然后運行appium,啟動inspector,就可以在真機上安裝并啟動App,此時刷新就可以獲取最新的Screenshot,左邊就能展開對應的分支,你就可以大展拳腳,進行定位了。
      注:用Appium Inspector在真機上運行并定位元素的時候,不管你現在有沒有安裝這個App,它都會給你重新安裝一下,然后再打開,這個是很不爽的。不過運行測試用例的時候,如果有安裝,則直接打開,沒有安裝時才會安裝。
      二、UI Automation Viewer定位
      只要你用真機連接上電腦,并運行了要測試的App,打開UI Automation Viewer后,單擊“Device Screenshot”按鈕,就能刷新出手機上的界面,并能展示定位,如果有任何變動。再次刷新即可。

    posted @ 2014-12-11 23:36 順其自然EVO 閱讀(707) | 評論 (0)編輯 收藏

    Appium安裝教程

     一、適用操作系統
      Win7 旗艦版Sp1 64位操作系統 或 32位操作系統
      二、所需軟件
      jdk-7u45-windows-i586.exe
      node-v0.10.28-x86.msi (32位)下載地址:http://nodejs.org/download/
      adt-bundle-windows-x86-20140321.zip
      SDK下載地址:http://developer.android.com/sdk/index.html
      apache-ant-1.9.4-bin.zip ( 非必裝) http://ant.apache.org/bindownload.cgi
      apache-maven-3.1.1-bin.zip (非必裝) http://maven.apache.org/download.cgi
      ActivePython-2.7.5.6-win32-x86.msi
      三、安裝步驟
      1)安裝JDK,并進行環境變量配置
      JDK安裝很簡單,按默認安裝即可。
      環境變量配置:
      添加JAVA_HOME變量, 值:Jdk的安裝路徑,如:D:\Java\jdk1.7.0_45
      添加CLASSPATH變量,值 .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
      修改path變量,加上這句 %JAVA_HOME%\bin;
      檢查JAVA環境是否配置好,進入CMD命令行,輸入java或javac,可以看到好多的命令提示,說明成功了。
      2)安裝Node.js,按默認安裝即可,可以改變安裝的路徑。
      安裝完成以后,檢查Node版本安裝是否成功:進入CMD,輸入node -v, 可以看到版本號,說明成功了。
      3)安裝ADT,配置環境變量
      下載地址:http://developer.android.com/sdk/index.html?hl=sk
      下載 adt-bundle-windows-x86-20140321.zip,直接解壓即可。
      配置環境變量,設置ANDROID_HOME 系統變量為你的 Android SDK 路徑,并把tools和platform-tools兩個目錄加入到系統的 Path路徑里。
      變量名:ANDROID_HOME 值: D:\AutoTest\adt\sdk
      設置Path值: %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools
      4)聯網安裝Appium
      進入cmd命令行,輸入:
      npm install –g appium 或者
      npm --registry http://registry.cnpmjs.org install -g appium (推薦這種,npm的國內鏡像)
      注:-g全局參數
      多等幾分鐘,可以看到appium的版本1.1.0及安裝目錄
      5)檢查一下appium是否安裝成功。
      進入cmd命令行,輸入appium
      提示:socket.io started 說明安裝好了。
      6)檢查appium所需的環境是否OK(這步很重要)
      進入Cmd命令行,輸入appium-doctor ,出現以下提示,All Checks were successful ,說明環境成功。
      7)安裝Apache Ant (這一步可省)
      安裝Apache Ant(http://ant.apache.org/bindownload.cgi)。解壓縮文件夾,并把路徑加入環境變量。
      變量: ANT_HOME 值: D:\AutoTest\ant-1.9.4
      設置Path: %ANT_HOME%\bin;
      測試Ant是否安裝成功,進入cmd命令行:輸入ANT,如果沒有指定build.xml就會輸出:Buildfile: build.xml does notexist! Build failed
      8)安裝Apache Maven (這一步可省)
      下載Maven(http://maven.apache.org/download.cgi),并解壓縮文件夾,把路徑加入環境變量。
      變量M2_HOME 值:D:\AutoTest\maven-3.1.1
      設置Path: %M2_HOME%\bin;
      測試Maven是否成功,運行cmd,輸入mvn -version如果成功,則出現maven版本等環境信息。
      安裝:python+webdriver環境
      第一步:安裝active-python,雙擊可執行文件,直接默認安裝即可。
      第二步:安裝selenium webdriver
      1. 打開cmd
      2. 命令為:pip install selenium -i http://pypi.douban.com/simple (使用國內地址)
      3. 打開python的shell或者IDEL界面 ,輸入from selenium import webdriver 如果不報錯那就說明你已經安裝selenium for python成功了。
      4. 安裝appium-python-client:(這步很重要,必須)
      進入cmd,輸入:pip install Appium-Python-Client
      以上全部安裝好以后,最后就是執行實例來測試一下:
      1. 打開Adt,創建一個模擬器,并啟動android模擬器。
      2. 在cmd啟動appium
      輸入:appium
      3. 另開一個cmd終端窗口。切換到實例代碼路徑下,執行android_contacts.py文件。
    English »
     
    Text-to-speech function is limited to 100 characters

    posted @ 2014-12-11 23:34 順其自然EVO 閱讀(607) | 評論 (0)編輯 收藏

    Appium框架中Android下EditText內容清除

    在做手機自動化測試過程中 ,難免會對EditText的內容進行修改,通常我們對EditText輸入 內容的時候,用的是Send_key()函數。可是這個函數不會先清除原來的內容,只會在光標當前位置上輸入函數參數中的數據。如果我們需要修改,必須清除原來的內容,查看了一下clear()參數不好使用,只好去網上搜索了。
      找到了如下方法:
      “首先 clear(), send_keys(), set_text(),在android上不太好用是個已知的bug (在IOS上不清楚,沒有測試環境),會在Appium 1.2.3上修復。請參見github的issue:https://github.com/appium/python-client/issues/53
      在這之前我們可以用 press_keycode的方式實現刪除,刪除速度比忽略 clear()拋出的異常要快很多。
      大概思路是:
      1. 點擊要清除的edit field
      2. 全選
      3. 刪除
      element.click()
      sleep(1)   #waiting for 1 second is important, otherwise 'select all' doesn't work. However, it perform this from my view
      self.driver.press_keycode(29,28672)   # 29 is the keycode of 'a', 28672 is the keycode of META_CTRL_MASK
      self.driver.press_keycode(112)   # 112 is the keycode of FORWARD_DEL, of course you can also use 67“
      我試了一下上面的方法,沒有什么效果,只好繼續尋找了。搜了好多網頁,在一個網頁上看到了一個不錯的辦法,不過可以打開的網頁太多了,一忙忘記是哪兒個網頁了。具體的方案就是:
      先將光標移到文本框最后,然后取一下EditText中文本的長度,最后一個一個地刪除文本。
      具體示例如下:
      def edittextclear(self,text):
      '''
      請除EditText文本框里的內容
      @param:text 要清除的內容
      '''
      DRIVER.keyevent(123)
      for i in range(0,len(text)):
      DRIVER.keyevent(67)
      使用實例:
      adr=DRIVER.find_element_by_id('com.subject.zhongchou:id/edit_person_detailaddress') #找到要刪除文本的EditText元素
      adr.click()#激活該文本框
      context2=adr.get_attribute('text')#獲取文本框里的內容
      self.edittextclear(context2)#刪除文本框中是內容

    posted @ 2014-12-11 23:33 順其自然EVO 閱讀(2361) | 評論 (0)編輯 收藏

    JUnit:Hamcrest的使用

    hamcrest 是一款比較不錯的 JUnit 測試 jar 包,本文介紹 hamcrest 在 Java 語言的使用。
      如果你使用過 eclipse 和 JUnit4 的話,hamcrest 的使用會讓你如虎添翼。
      1. 下載hamcrest
      連接 Google,搜索 hamcrest 即可。
      下載列表:http://code.google.com/p/hamcrest/downloads/list
      選擇 Full Hamcrest distribution 版本,完整版。如果是在 linux 下面,可以下載tgz格式的。
      win 下面下載 zip 吧。其他系統的可以根據情況下載。
      2. 解壓縮
      tar   -zxvf   ×××.tgz
      解壓之后,將文件夾放到合適的目錄下面。假設路徑為 /home/mark/tools/hamcrest-1.2
      3. hamcrest 與 Eclipse
      假設你已經新建一個測試項目叫 TestHamcrest,并且已經導入了 JUnit4 這個包。
      如果沒有的話,請參考其他關于 JUnit 的使用的文章
      在 Eclipse 中,對項目 TestHamcrest 右鍵,選擇 Build Path / Add External Archives。
      選擇 /home/mark/tools/hamcrest-1.2 下面的 hamcrest-core-1.2.jar、hamcrest-library-1.2.jar 兩個 jar 文件。
      項目中可以:
      import static org.hamcrest.Matchers.*;
      那么,就可以直接使用其中的方法。更多關于 hamcrest 的使用,請參閱文檔!
      4. 遇到麻煩
      trouble:    SecurityException 異常
      methond:刪除 JUnit 包,然后在 Referenced  Library 中再導入 Junit 包。

    posted @ 2014-12-11 23:32 順其自然EVO 閱讀(466) | 評論 (0)編輯 收藏

    僅列出標題
    共394頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久www免费人成看片| 国产免费伦精品一区二区三区| 51在线视频免费观看视频| 亚洲av永久无码精品漫画 | 亚洲国语在线视频手机在线| 欧洲人免费视频网站在线| 亚洲日韩乱码中文无码蜜桃臀网站 | 中文字幕版免费电影网站| 亚洲精品国产福利一二区| 男人免费视频一区二区在线观看| 免费看美女被靠到爽| 亚洲AV成人精品日韩一区 | 亚洲线精品一区二区三区影音先锋 | 免费黄色一级毛片| 亚洲国产综合AV在线观看| 国产无遮挡色视频免费视频| 国产亚洲视频在线观看| 免费v片在线观看| 两性色午夜视频免费网| 久久亚洲AV成人出白浆无码国产| 国产成人免费午夜在线观看| 99999久久久久久亚洲| 国产99视频精品免费视频7| 产传媒61国产免费| 亚洲AV无码成人精品区蜜桃| 91免费人成网站在线观看18| 亚洲欧洲无码一区二区三区| 全黄a免费一级毛片人人爱| 中国国产高清免费av片| 亚洲欧洲精品视频在线观看| 日本免费一区二区三区最新| 国产国产人免费人成成免视频| 久久久久久a亚洲欧洲AV| 国产情侣激情在线视频免费看| 久久精品国产亚洲av品善| 中文字幕亚洲不卡在线亚瑟| 无码人妻丰满熟妇区免费| 亚洲色成人WWW永久在线观看| 亚洲欧洲一区二区三区| 91久久青青草原线免费| 精品久久亚洲一级α|