之前我們玩過一些手機(jī)自動(dòng)化軟件,比如Airtest,ADB,通過這些軟件我們可以和自己的手機(jī)進(jìn)行關(guān)聯(lián),并且使用程序來代替我們本人來操作手機(jī),今天我們要說的是另一款給力的自動(dòng)化APP,這里要介紹的并不是Windows平臺(tái)上的可執(zhí)行文件哦,而是Android平臺(tái)上的JavaScript IDE,更重要的一點(diǎn)就是這個(gè)工具是國(guó)人開發(fā)的,必須支持一個(gè)不是。而且AutoJs兼容性更好,傳統(tǒng)的按鍵精靈,腳本精靈,雖然上手快,門檻低,但是他們是以坐標(biāo)為基礎(chǔ),很容易出現(xiàn)分辨率的問題,而AutoJs則是以控件為基礎(chǔ),因而更強(qiáng)大,并且我們?cè)谕孀詣?dòng)化時(shí)是不需要Root的;那么,廢話不多說,趕快讓我們一睹為快這款強(qiáng)大的IDE吧。
為了運(yùn)行Autojs腳本,我們需要使用Android平臺(tái),這里小編選擇的是夜神模擬器,將我們下載好的AutoJs.apk安裝到夜神模擬器中,下載地址:
https://u062.com/file/7715018-454641893
然后我們開啟無障礙服務(wù),即可打開Autojs并正常運(yùn)行,如圖:
要想進(jìn)行腳本的編寫,我們需要點(diǎn)擊藍(lán)色圓圈里的加號(hào)創(chuàng)建一個(gè)腳本文件,下面我們來創(chuàng)建一個(gè)簡(jiǎn)單的腳本,如下:
因?yàn)锳utoJs有著JavaScript的部分特性,因此他也有選擇器可供我們選擇元素,總共有四種,如下:
ID 選擇器
Text 選擇器
ClassName 選擇器
Desc 選擇器
在打開之前我們需要對(duì)Autojs進(jìn)行授權(quán),很簡(jiǎn)單,如下:
auto();//授權(quán)auto.js
然后我們就可以打開對(duì)應(yīng)應(yīng)用,比如我想打開瀏覽器,如下:
launchApp('瀏覽器')#打開瀏覽器
如果我們想自定義打開的應(yīng)用了,通過輸入的方法,增加一個(gè)交互,可以這樣做,如下:
var app=rawInput("","");
launchApp(app);
我們還可以添加一個(gè)控制臺(tái),顯示我們操作的進(jìn)度,如下:
auto();
console.show() //顯示控制臺(tái)
log('hello') //控制臺(tái)輸出
console.log('開啟瀏覽器') //控制臺(tái)輸出
sleep(1000)//休眠
var app=rawInput("",""); //自定義輸入
launchApp(app);//運(yùn)行App
我們還可以檢查是否有Root權(quán)限,如下:
if(auto.waitFor()){
toastLog('有權(quán)限')
}
else{
toastLog('無權(quán)限')
}
setScreenMetrics(1080,1920); #屏幕大小
toast("歡迎大家來到我的世界,Helloworld ,520");#屏幕通知
toastLog(‘hello’) #屏幕通知+控制臺(tái)日志
images.requestScreenCapture() #向系統(tǒng)申請(qǐng)屏幕截圖權(quán)限
images.captureScreen() #截圖
swipe(100,200,130,320,230)#滑動(dòng)屏幕,只支持安卓7.0以上
img=images.load('讀取本地或者網(wǎng)絡(luò)圖片')#讀取
images.save('圖片來源','圖片名')#保存
var c=findColor(img.'顏色十六進(jìn)制')#尋找對(duì)應(yīng)顏色對(duì)象
c.x c.y #對(duì)應(yīng)顏色的橫縱坐標(biāo)
images.findColorEquals(img,color[, x, y, width, height]) #區(qū)域找色
images.findColorInRegion(img,color[, x, y, width, height])
device.width #取屏幕寬度
device.height #取屏幕高度
toast('歡迎光臨')
if(requestScreenCapture()){
console.log('截圖成功')
}
else{
console.log('截圖失敗')
}
我們還可以保存網(wǎng)絡(luò)上的圖片到設(shè)備中,如:
var pic=images.load('http://wnk5.fulitmm.cn/comm/2020053009318366378.jpg');
images.save(pic,'/sdcard/mm.jpg')
另外我們還可以通過找色來定位目標(biāo),如圖:
可以看到橫縱標(biāo)125。
back() #返回
exit() #退出
如果我們想讓程序等待一段時(shí)間,可以使用休眠功能,如下:
sleep(3000);#休眠
有時(shí)候我們進(jìn)入應(yīng)用需要進(jìn)行一些操作,這個(gè)時(shí)候我們可以通過找尋應(yīng)用中文本的位置來進(jìn)行精確操作,如下:
text('請(qǐng)輸入網(wǎng)址')#找文本
這里要說的是,雖然我們之前的操作比較方便,但是如果你想把這些操作做成一個(gè)界面的話,就需要用到UI了,這樣就會(huì)更方便了,像一些自動(dòng)化工具,比如自動(dòng)電擊器就是這個(gè)原理了,我們來看一個(gè)最簡(jiǎn)單的例子,如下:
"ui";
ui.layout(
<vertical foreground="#BBFFFF" bg='#F5F5F5'> #垂直布局加前景背景色設(shè)置
<input id="name" text="請(qǐng)輸入名字"/>#輸入框
<button id="one" text="按鈕1" alpha="0.6" w="200dp" textSize="10sp"/>#按鈕
<button class="two" w="100dp" text="按鈕2"/>
<horizontal>#水平布局
<button w="auto" alpha="0.8" text="按鈕3"/>
<button w="*" text="按鈕4"/>
</horizontal>
</vertical>
);
ui.one.click(function(){#元素點(diǎn)擊事件
var n=ui.name.getText();
toast(n)
})
其實(shí)UI控件中的方法基本大部分和JavaScript的方法一樣,掌握了JavaScript你就可以非常輕松的使用UI控件了。
Autojs主要就是用于我們的手機(jī)設(shè)備的腳本編寫,所以與ADB也會(huì)有很多相似之處,可以這么說,只要你掌握了ADB和JavaScript,掌握這就跟喝水那么簡(jiǎn)單。
對(duì)了,還要跟大家補(bǔ)充一句,那就是Autojs的在線官方文檔地址:
https://hyb1996.github.io/AutoJs-Docs/#/
上面介紹的有很多方面,如果你不方便每次都聯(lián)網(wǎng)查詢的話,可以結(jié)合咱們前幾天講的整站爬取方案哦。
ndroid 自動(dòng)化測(cè)試的工具非常多,但是目前主流使用的就那幾個(gè),我會(huì)詳細(xì)說明他們各自的情況,你可以根據(jù)自己的需要決定使用哪款工具。
Appium
Appium 是目前最主流的移動(dòng)測(cè)試自動(dòng)化框架,不僅支持 Android 應(yīng)用,而且適用于 iOS、混合和 Web 應(yīng)用程序。
它底層完全使用了 Selenium 和 WebDriver 的 API,所以如果你之前有用過 selenium, 幾乎不需要額外的學(xué)習(xí)成本就可以使用 appium。
appium 通過 uiautomator(API 級(jí)別 16 或更高)和 Seledroid(API 級(jí)別低于 16)支持 Android,但是你不需要具體懂這兩個(gè)框架的具體用法,appium 都已經(jīng)幫你封裝成了統(tǒng)一的使用規(guī)則。
Appium 的最大優(yōu)勢(shì)之一是幾乎可以使用任何編程語(yǔ)言(例如 Java、Objective-C、JavaScript、PHP、Ruby、Python 或 C# 等)編寫 Appium 腳本。
這意味這選擇權(quán)在你,你可以使用自己最擅長(zhǎng)的編程語(yǔ)言。如果你還熟悉 Selenium,那么不出意外,你可以在一天之內(nèi)上手使用。
另外 webdriver 是一個(gè)統(tǒng)一的標(biāo)準(zhǔn),已經(jīng)提交給了 w3c 組織,你可以基于它的協(xié)議做進(jìn)一步的擴(kuò)展。看看簡(jiǎn)單的代碼:
textFields = driver.find_elements_by_tag_name('textField')
assertEqual(textFields[0].get_attribute("value"), "Hello")
Airtest
第二個(gè)我要推薦國(guó)產(chǎn)之光 Airtest。Airtest 項(xiàng)目是由網(wǎng)易游戲推出的一款自動(dòng)化測(cè)試框架,項(xiàng)目有幾大組件:
使用 Airtest 的好處是中文文檔健全,對(duì)英文不好的同學(xué)支持優(yōu)化。官網(wǎng)也貼心的準(zhǔn)備了視頻教學(xué)和演示,幫助你快速上手。
Detox
這個(gè)框架非常低調(diào),但是你用過一定會(huì)愛上它。
Detox 一個(gè)非常強(qiáng)的 JavaScript 移動(dòng)測(cè)試框架,它的測(cè)試執(zhí)行非常快速和健壯,因?yàn)樵跍y(cè)試執(zhí)行期間不需要外部附加工具來編排和同步。
如果你優(yōu)先考慮以下因素,你可以直接選用 detox:
下面是具體的代碼,比較典型的代碼編寫方式:
describe('HelloDetoxTest', ()=> {
beforeEach(async ()=> {
await device.reloadReactNative();
});
it('應(yīng)該有歡迎屏幕', async ()=> {
await expect(element(by .id('welcome'))).toBeVisible();
});
it('should show hello Rect after tap', async ()=> {
await element(by.id('hello_react')).tap() ;
await expect(element(by.text('React!!!'))).toBeVisible();
});
it('點(diǎn)擊后應(yīng)該顯示屏幕', async ()=> {
await element(by.id ('detox_button')).tap();
await expect(element(by.text('Detox!!!'))).toBeVisible();
});
});
Espresso
Espresso 是新型的的 Android 測(cè)試自動(dòng)化框架,由 Google 開源,Espresso 的 API 體積小、可預(yù)測(cè)、易于學(xué)習(xí)。
你可以使用它快速編寫簡(jiǎn)潔可靠的 Android UI 測(cè)試。
它非常可靠,與 UI 線程同步并且速度很快,因?yàn)椴恍枰魏嗡撸ó?dāng)應(yīng)用程序空閑時(shí),測(cè)試在同一毫秒內(nèi)運(yùn)行)。
而且通過簡(jiǎn)單的配置,可以直接集成在 appium 中。
總結(jié)
這幾個(gè)工具幾乎涵蓋了所有的 Android 自動(dòng)化測(cè)試技術(shù)選型側(cè)重點(diǎn)。在掌握好這 4 個(gè)當(dāng)中的其中一個(gè)以后,有精力你可以去研究一下其他的工具,有上百種選擇,每種都有側(cè)重和具體的場(chǎng)景。
名稱:本屬性用于標(biāo)識(shí)一個(gè)取樣器,建議使用一個(gè)有意義的名稱。
注釋:對(duì)于測(cè)試沒有任何作用,僅用戶記錄用戶可讀的注釋信息。
協(xié)議:向目標(biāo)服務(wù)器發(fā)送HTTP請(qǐng)求時(shí)的協(xié)議,可以是http或者是https或者File ,默認(rèn)值為http 。
服務(wù)器名稱或IP :HTTP請(qǐng)求發(fā)送的目標(biāo)服務(wù)器名稱或IP地址(注意:此處不可帶http:/或者h(yuǎn)ttps:/)。
端口號(hào):目標(biāo)服務(wù)器的端口號(hào),默認(rèn)值為80 。
方法:發(fā)送HTTP請(qǐng)求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
路徑:目標(biāo)URL路徑(不包括服務(wù)器地址和端口);也可以直接寫完整路徑(上面的IP+端口就可以省略了)。
Content encoding :內(nèi)容的編碼方式(當(dāng)PUT、POST、File和PATCH方式有效),默認(rèn)值為iso8859(所以常用為UTF-8減少亂碼)。
自動(dòng)重定向:如果選中該選項(xiàng),當(dāng)發(fā)送HTTP請(qǐng)求后得到的響應(yīng)是3xx時(shí),JMeter 會(huì)自動(dòng)重定向到新的頁(yè)面,但是Jmeter是不記錄重定向的過程內(nèi)容。查看結(jié)果集中無法查看轉(zhuǎn)發(fā)請(qǐng)求結(jié)果。
跟隨重定向:Http Request取樣器的默認(rèn)選項(xiàng),當(dāng)響應(yīng)code是3xx時(shí),自動(dòng)跳轉(zhuǎn)到目標(biāo)地址。與自動(dòng)重定向不同,Jmeter會(huì)記錄重定向過程中的所有請(qǐng)求響應(yīng),在查看結(jié)果樹時(shí)可以看到服務(wù)器返回的內(nèi)容,如有多個(gè)跳轉(zhuǎn)則多個(gè)請(qǐng)求都會(huì)被記錄下來,此為默認(rèn)選項(xiàng)。
備注:自動(dòng)重定向和跟隨重定向的區(qū)別只在于是否記錄多個(gè)跳轉(zhuǎn)的請(qǐng)求上
Use keep Alive : 當(dāng)該選項(xiàng)被選中時(shí),jmeter 和目標(biāo)服務(wù)器之間使用 Keep-Alive方式進(jìn)行HTTP通信,默認(rèn)選中。
Use multipart/from-data for HTTP POST :當(dāng)發(fā)送HTTP POST 請(qǐng)求時(shí),使用Use multipart/from-data方法或者application/x-www-form-urlencoded方法發(fā)送,默認(rèn)不選中。
Browser-compatible headers:當(dāng)勾選multipart/form-data時(shí),勾選此項(xiàng)會(huì)截掉http請(qǐng)求頭中的Content-Type和Content-Transfer-Encoding,而只發(fā)送Content-Disposition部分;
參數(shù) : 在請(qǐng)求中發(fā)送URL參數(shù)。用戶可以將URL中所有參數(shù)設(shè)置在本表中,表中的每一行是一個(gè)參數(shù)值對(duì)(對(duì)應(yīng)URL中的 名稱=值)。
-名稱:參數(shù)名
-值:參數(shù)值
-否是編碼:選中時(shí),對(duì)值進(jìn)行URL編碼;建議勾選,因?yàn)楫?dāng)參數(shù)值內(nèi)含有ASCII Control Chars或者Non-ASCII characters或者其他符號(hào)的話,如果不勾選會(huì)導(dǎo)致發(fā)送失敗。
消息體:放置消息體,如:post請(qǐng)求時(shí),json內(nèi)容等
文件上傳:在請(qǐng)求中發(fā)送文件,HTTP文件上傳可以通過這種方式模擬,參數(shù)名稱就是發(fā)送文件對(duì)應(yīng)的參數(shù),MINE Type為資源媒體類型
Implementation(實(shí)現(xiàn)):發(fā)送http請(qǐng)求的方式,可選項(xiàng)為java和HttpClient4,默認(rèn)為HttpClient4;
Connect:連接超時(shí)時(shí)間,單位為毫秒;
Response:響應(yīng)等待超時(shí)時(shí)間,單位為毫秒;
從HTML文件獲取所有內(nèi)含的資源:當(dāng)該選項(xiàng)被選中時(shí),jmeter在發(fā)出HTTP請(qǐng)求并獲得響應(yīng)的HTML文件內(nèi)容后,還對(duì)該HTML進(jìn)行解析 并獲取HTML中包含的所有資源(圖片、flash等),默認(rèn)不選中,如果用戶只希望獲取頁(yè)面中的特定資源,可以在下方的Embedded URLs must match 文本框中填入需要下載的特定資源表達(dá)式,這樣,只有能匹配指定正則表達(dá)式的URL指向資源會(huì)被下載。
Parallel downloads.:是否使用自設(shè)資源池,勾選后可設(shè)置大小;
Number:資源池大小,默認(rèn)為6。
URLs must match:URL匹配過濾,填寫此項(xiàng)則只會(huì)下載與此內(nèi)容項(xiàng)匹配的url的資源,例如要獲取http://test.com/下的所有資源,使用正則表達(dá)式http://test.com/.*;
Source address:只用于http協(xié)議且Implementation為HttpClient4的情況。
此屬性用于啟用IP欺騙。會(huì)重寫了這個(gè)http請(qǐng)求使用的默認(rèn)本地IP地址。用于Jmeter主機(jī)具有多個(gè)IP地址(即IP別名、網(wǎng)絡(luò)接口、設(shè)備)的情況。該值可以是主機(jī)名、IP地址或網(wǎng)絡(luò)接口設(shè)備,如“ey0”或“l(fā)0”或“wlan0”。
- IP/Hostname:IP /主機(jī)名以使用特定的IP地址或(本地)主機(jī)名
- Device:選擇設(shè)備以選擇該接口的第一個(gè)可用地址,該設(shè)備可以是IPv4或IPv6。
- Device IPV4:選擇IPv4設(shè)備來選擇名稱設(shè)備的IPv4地址(如eth0, lo, em0);
- Device IPV6:選擇IPv6設(shè)備來選擇名稱設(shè)備的IPv4地址(如eth0, lo, em0);
服務(wù)器名稱或IP:代理服務(wù)器的名稱或者IP地址;
端口號(hào):該代理的端口號(hào);
用戶名:使用該代理的用戶名;
密碼:用戶密碼;
Save response as MD5 hash:選中該項(xiàng),在執(zhí)行時(shí)僅記錄服務(wù)端響應(yīng)數(shù)據(jù)的MD5值,而不記錄完整的響應(yīng)數(shù)據(jù)。在需要進(jìn)行數(shù)據(jù)量非常大的測(cè)試時(shí),建議選中該項(xiàng)以減少取樣器記錄響應(yīng)數(shù)據(jù)的開銷;
(1)當(dāng)get有帶參數(shù),勾中編碼時(shí)
設(shè)置如下:
測(cè)試結(jié)果:
分析中文有進(jìn)行編碼轉(zhuǎn)化
中文有編碼轉(zhuǎn)化,“張三”轉(zhuǎn)碼為“%E5%BC%A0%E4%B8%89”。
(2)當(dāng)get有帶參數(shù),不勾選編碼
設(shè)置如下
測(cè)試結(jié)果:
中文沒有轉(zhuǎn)化。
post http請(qǐng)求
測(cè)試結(jié)果:
請(qǐng)求
響應(yīng)
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。