============問題描述============
訪問
數據庫時,
手機能增刪數據庫的數據就是顯示不了數據庫的里的數據不知道是哪里的問題,用的HTTP
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多線程的操作可以系統學習一下。工作中使用極為頻繁
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
注釋:
使用PLSQL Developer的朋友們是否有遇到如下情況
① 不小心關閉了有用的窗口;
③ PLSQL Developer界面中其中1個session 死掉了不得不關閉時,再重新開啟點擊恢復會話后可能不會和之前場景一摸一摸時;
如上的情況都可以通過如下快捷鍵進行恢復.
Ctrl+E【default】 ==> Edit / Recall Statement
顯示結果:
選中任意一行 雙擊 直接進入源編輯界面.
更改該快捷鍵步驟:
PLSQL Developer --> tools --> preferences --> key configuration
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
在一個
分布式環境中,同類型的服務往往會部署很多實例。這些實例使用了一些配置,為了更好地維護這些配置就產生了
配置管理服務。通過這個服務可以輕松地管理這些應用服務的配置問題。應用場景可概括為:
zookeeper的一種應用就是分布式配置管理(基于ZooKeeper的配置信息存儲方案的設計與實現)。
百度也有類似的實現:disconf。
Diamond則是淘寶開源的一種分布式配置管理服務的實現。Diamond本質上是一個Java寫的Web應用,其對外提供接口都是基于HTTP協議的,在閱讀代碼時可以從實現各個接口的controller入手。
分布式配置管理
分布式配置管理的本質基本上就是一種推送-訂閱模式的運用。配置的應用方是訂閱者,配置管理服務則是推送方。概括為下圖:
其中,客戶端包括管理人員publish數據到配置管理服務,可以理解為添加/更新數據;配置管理服務notify數據到訂閱者,可以理解為推送。
配置管理服務往往會封裝一個客戶端庫,應用方則是基于該庫與配置管理服務進行交互。在實際實現時,客戶端庫可能是主動拉取(pull)數據,但對于應用方而言,一般是一種事件通知方式。
Diamond中的數據是簡單的key-value結構。應用方訂閱數據則是基于key來訂閱,未訂閱的數據當然不會被推送。數據從類型上又劃分為聚合和非聚合。因為數據推送者可能很多,在整個分布式環境中,可能有多個推送者在推送相同key的數據,這些數據如果是聚合的,那么所有這些推送者推送的數據會被合并在一起;反之如果是非聚合的,則會出現覆蓋。
數據的來源可能是人工通過管理端錄入,也可能是其他服務通過配置管理服務的推送接口自動錄入。
架構及實現
Diamond服務是一個集群,是一個去除了單點的協作集群。如圖:
圖中可分為以下部分講解:
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
代碼缺陷和代碼錯誤的最大區別是,代碼缺陷不影響游戲編譯,而代碼錯誤編譯都不通過。但是代碼缺陷會影響游戲發布后產生的一系列BUG。。我今天無意間逛外國論壇發現的一個方法,使用了一下感覺挺給力的第一時間分享給大家。 下載下來以后,它是一個文件夾把整個文件夾拷貝在你unity的工程里面就行了。
然后下載最新的mono 它是跨平臺的,我用的是MAC所以我下載的就是一個 dmg文件, 下載完畢后安裝完成即可。
如下圖所示, 選擇Assets->Gendarme Report Level 選項,將彈出Gendarme界面,你可以選擇它的優先級,然后點擊Start按鈕。如果報錯的話,請把Assets文件夾下的gendarme文件夾和gendarme-report.html文件刪除。
如果你的項目比較大的話需要耐心的等待一下,大概1分鐘左右。Report生成完畢后會彈出如下窗口,點擊Open Report按鈕即可。
如下圖所示,他會生成一個Html的頁面在本地,打開后寫的非常清晰,并且已經分好了類,他會告訴你那一行代碼有缺陷,如何來修改你的代碼。一不小心代碼就一大堆隱患,趕快一個一個修改吧~
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
敏捷軟件開發團隊必須確保他們開發出來的產品質量能夠滿足要求,管理團隊也經常希望開發團隊能夠提高速度以實現為客戶提供更多的功能。本篇
文章中多個作者探討了質量和速度之間的關系,并提出了一些既能提高質量也能加快進度的方法。
Bob Galen曾今在他的博客中發表了讀懂我的唇語-敏捷并不快速的文章,在其中寫到了追求軟件開發進度下質量的重要性。
敏捷是一個“質量游戲”,如果你以正直,承諾以及平衡的心態來玩這個游戲的話,那么結果將會是非常好的“速度游戲”,但它(速度)卻并非沒有代價。。。
如果你無法玩轉這個質量游戲,你所采納的
敏捷開發方法甚至比你以前使用的開發方法更慢。
團隊必須致力于把
工作在一個迭代中完成,這也就意味著這些工作需要滿足定義工作完成的所有標準。
很多敏捷團隊允許返工 – 修復漏洞,完成
測試自動化,重構,或者設計不良導致sprint迭代的延誤。即使大多數的敏捷工具允許拆分用例故事以捕捉在sprint迭代中已經完成的工作對比延期的工作,我也還是認為這給團隊傳達了錯誤的信息,讓他們認為工作不在一個sprint迭代內完成是可以接受的。
讀懂我的唇語 – 并不是把所有事情做完,做完,做完!
正如Bob解釋的:一個組織不應該總是力圖讓進度變得更快,而應該更加注重質量。
因此,下一次當你聽到有人在激情澎湃的談論著敏捷代表了更快的速度時,請打斷他們,嘗試向他們解釋敏捷并不是一個“速度游戲”,而是應該強調敏捷是一個“或許能夠快速運轉的質量游戲”。
Tim Ottinger曾今寫過關于敏捷團隊進度的14個奇怪觀點,其中一個觀點中就提到了質量和速度之間的關系。
盡管大家通常會降低質量要求以求在較短時間內盡快完成工作,但是如果團隊所開發的代碼質量不高的話,經過全部sprint迭代后的進度最終都還是會被降低。
Stephen Haunts在他的題目為進度并不是目標或者目的博客帖子中,描述了當管理者設定團隊的進度目標后對質量會產生什么影響:
(…)為了增加交付的功能點數目以滿足績效目標,團隊會犧牲掉系統的質量,但從長遠來看這樣最終還是會降低團隊的進度,并且會引入技術隱患。敏捷團隊最好關注正在開發系統的質量與流程過程(持續交付和集成等等),以及負責開發系統的團隊成員本身。
軟件開發者必須在進度和質量之間掌握平衡,正如Blake Haswell在文章什么是代碼質量中解釋的那樣:
雖然經常會有很多的外部壓力向進度方面傾斜,但是如果你不夠重視質量的話,進度最終還是會趨于緩慢以及停滯,以至最終整個項目走向顛覆。考慮到一個項目的代碼質量決定了它能夠在多大程度上適應需求的變化,一個可以持續改進的事情是你需要花費一部分時間來優化自己項目的代碼質量。
Blake提供了一個可以用來檢查代碼質量的屬性列表:
可理解性: 代碼需要在各個層面上能夠被容易地理解。理想情況下,軟件應該非常簡單,并沒有非常明顯的缺陷。
可測試性: 代碼需要被編寫的非常容易被測試。
正確性: 代碼需要滿足功能和非功能性的需求。
有效性: 代碼需要有效的使用系統資源(內存,CPU,網絡連接,等)。
Hugo Baraúna在他的博客文章名為內部質量低下軟件的癥狀中解釋了軟件是如何因為變更而“變得更糟”的,最終導致質量低下并且降低進度。
假如你正在領導一家創業公司的技術或者產品團隊,你是首席技術官,并且已經推出了你們產品的第一個版本,做的還挺成功的。你們的業務模型已經得到了驗證,現在你們正處于快速發展期。這真是太棒了!但這也是有代價的,它帶來了一系列新的挑戰。
你們產品的第一個版本工作的很好,但是代碼庫卻無法滿足持續發展的要求。或許你的團隊進度并沒有像以前那樣好了,團隊成員一直在抱怨代碼的質量問題,首席執行官和產品經理想要一些新的功能,但你現在代碼規劃根本無法滿足業務的需求。
他提供了一個指示質量低下的癥狀列表,這個列表能夠幫助你來決定是否需要重寫或者重構:
所有事情都很艱難
進度慢
測試套件運行緩慢
無法避免的缺陷
你的團隊是消極的
知識缺乏共享
新開發人員成長周期太長
你又是如何平衡質量和進度的呢?
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
對環境的需求:
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 &
$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
好了,環境部分差不多就這樣了。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
自動化測試過程中,對被測試元素的定位是相當重要的。前面
文章中也講到了一些兒定位方法。今天講解,如何用真機運行程序,用
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”按鈕,就能刷新出手機上的界面,并能展示定位,如果有任何變動。再次刷新即可。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
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
進入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
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
在做
手機自動化測試過程中 ,難免會對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)#刪除文本框中是內容
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
如果你使用過 eclipse 和 JUnit4 的話,hamcrest 的使用會讓你如虎添翼。
1. 下載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 包。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters