Crt自動化 測試 SecureCrt腳本 JS腳本

- 1、引言
- 2、Screen屬性和方法
- 2.1、屬性
- 2.1.1、CurrentColumn
- 2.1.2、CurrentRow
- 2.1.3、Columns
- 2.1.4、Rows
- 2.1.5、IgnoreEscape
- 2.1.6、MatchIndex
- 2.1.7、Synchronous
- 2.2、方法
- 2.2.1、Clear()
- 2.2.2、get()
- 2.2.3、get2()
- 2.2.4、IgnoreCase()
- 2.2.5、Send()
- 2.2.6、SendKeys()
- 2.2.7、SendSpecial()
- 2.2.8、WaitForCursor()
- 2.2.9、WaitForKey()
- 2.2.10、WaitForString()
- 2.2.11、WaitForStrings()
- 2.2.12、ReadString()
- 3、總結
1、引言
本節開始講解Crt腳本中最常用,也是功能最強大的二級對象Screen的屬性和方法,凡是需要和遠程設備進行交互的部分都是需要使用Screen對象的屬性或方法的,因此本節將是重點。
2、Screen屬性和方法
屬性 方法 CurrentColumn Clear CurrentRow Get Columns Get2 Rows IgnoreCase IgnoreEscape Send MatchIndex SendKeys Synchronous SendSpecial WaitForCursor WaitForKey WaitForString WaitForStrings ReadString
2.1、屬性
2.1.1、CurrentColumn
解釋返回當前光標處的列坐標,如下圖所示的下面顯示的數字"9"就是當前光標位於第9列。
語法crt.Screen.CurrentColumn
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var curCol = crt.Screen.CurrentColumn; 5 crt.Dialog.MessageBox(curCol);
2.1.2、CurrentRow
解釋返回當前光標處的行坐標,如下圖所示的下面顯示的數字"35"就是當前光標位於第35行。但這個功能有個問題就是當滿屏輸出后這個值一直表示最大值,等同於底下要講的子屬性四:Rows的值。
語法
crt.Screen.CurrentRow
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var curRow = crt.Screen.CurrentRow; 5 crt.Dialog.MessageBox(curRow);
2.1.3、Columns
解釋返回當前屏幕的最大列寬。
語法crt.Screen.Columns
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var cols = crt.Screen.Columns; 5 crt.Dialog.MessageBox(cols);
2.1.4、Rows
解釋返回當前屏幕的最大行寬,這個行寬指的是可見區的,並不是指緩沖區的行寬
語法crt.Screen.Rows
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var rows = crt.Screen.Rows; 5 crt.Dialog.MessageBox(rows);
2.1.5、IgnoreEscape
解釋定義當使用WaitForString、WaitForStrings 和 ReadString這三個方法時是否獲取Escape字符(也就是特殊控制字符,如"\n"),默認是會獲取的。
語法crt.Screen.IgnoreEscape [ = True | False ]
參數:
true|false:當設置為true時不會獲取特殊字符,為false時會獲取,默認為false。
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 // 設置false,獲取ctrl+c 5 crt.Screen.IgnoreEscape = false; 6 crt.Dialog.MessageBox(crt.Screen.ReadString("\03")); 7 8 // 設置true,不獲取ctrl+c 9 crt.Screen.IgnoreEscape = true; 10 crt.Dialog.MessageBox(crt.Screen.ReadString("\03"));
2.1.6、MatchIndex
解釋當使用WaitForStrings 和 ReadString這兩個方法獲取字符串時,會根據參數的位置獲取返回值,而MatchIndex就是這個位置,從1開始計算,如果沒有一個匹配到則返回0,可以根據下面的例子來看。
語法crt.Screen.MatchIndex
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var outPut = crt.Screen.ReadString("error", "warning", "#", 10); 5 switch (crt.Screen.MatchIndex) { 6 case 0: 7 crt.Dialog.MessageBox("Timed out!") 8 break; 9 case 1: 10 crt.Dialog.MessageBox("Found 'error'") 11 break; 12 case 2: 13 crt.Dialog.MessageBox("Found 'warning'") 14 break; 15 case 3: 16 crt.Dialog.MessageBox("Found '#'") 17 break; 18 }
2.1.7、Synchronous
解釋設置屏幕的同步屬性,關於該屬性需要謹慎對待,若設置為false,則在腳本中使用WaitForString、WaitForStrings或ReadString函數時可能存在丟失一部分數據的現象,而設置為true時不會,但是設置為true后可能會存在屏幕卡頓的情況,出現這兩種現象的原因應該是和這幾個函數以及打印字符到Screen的機制有關系,具體內部原因不明,就具體使用而言,如果是跑腳本的話最好還是不要設置為true,大量的卡頓看着就會蛋疼了,還可能會造成CRT卡死。
語法crt.Screen.Synchronous [ = True | False ]
參數:
true|false :默認為false
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 crt.screen.Synchronous = true; 5 crt.screen.Send("\r\n"); 6 crt.screen.ReadString("#"); 7 crt.screen.Send("\r\n"); 8 crt.screen.WaitForString("#"); 9 crt.screen.Send("\r\n"); 10 crt.screen.WaitForStrings("#",">");
2.2、方法
2.2.1、Clear()
解釋清屏功能
效果類似下面這個屏幕:
語法
crt.Screen.Clear()
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 crt.Screen.Send("\r\n"); 5 crt.Screen.Send("\r\n"); 6 crt.Screen.Send("\r\n"); 7 crt.Screen.Send("\r\n"); 8 crt.Screen.Clear();
2.2.2、get()
解釋按照坐標取出一個矩形框內的屏幕上的字符(即從某行某列開始到其它行其它列),不包含字符串中的回車換行符,所以這個多用於獲取無格式的光標處字符串或某小段特定區域字符串。
語法crt.Screen.Get(row1, col1, row2, col2)
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var getScr = crt.Screen.Get(31,50,31,56); 5 crt.Dialog.MessageBox(getScr);
這段代碼獲取的是(31,50,31,56)這個矩陣內的字符串,即下圖中紅色框中所示的7483052。
2.2.3、get2()
解釋按照坐標取出一個矩形框內的屏幕上的字符(即從某行某列開始到其它行其它列),包含字符串中的回車換行符,所以這個多用於獲取大段帶格式的字符串。
語法crt.Screen.Get2(row1, col1, row2, col2)
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var getScr = crt.Screen.Get2(29,1,35,20); 5 crt.Dialog.MessageBox(getScr);
這段代碼獲取的是(29,1,35,20)這個矩陣內的所有帶回車換行的字符串,即下圖中紅色框中文字。
2.2.4、IgnoreCase()
解釋使用全局參數設置控制在使用WaitForString、WaitForStrings和ReadString這三個函數時是否對大小寫敏感,默認為false指大小寫敏感即大小寫字符串都會檢查,設置為true時則不會檢測大小寫。
語法crt.Screen.IgnoreCase
請注意,語法中並沒有帶(),根據語法來看,這個不像是方法,但是在CRT的使用說明中標注為了方法而不是屬性,且在python的腳本中是當做方法使用的,因此這里先歸類為方法,但是在JS腳本中是不帶()使用的。
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 crt.Screen.IgnoreCase = true; 5 crt.Screen.Send("show memory\r\n"); 6 crt.Screen.WaitForString("more"); 7 crt.Screen.Send("\r\n"); 8 crt.Screen.WaitForStrings("more","#"); 9 crt.Screen.Send("\r\n"); 10 crt.Screen.ReadString("more","#");
2.2.5、Send()
解釋向遠端設備或者向屏幕(向屏幕發送的功能是CRT7.2以后版本才提供的)發送字符串。如語法中所表示的,string是待發送的字符串,這個字符串可以包含轉碼字符比如"\r","\n","\03"(ctrl+c),當向屏幕上發送字符串時需要指定第二個參數為true。有了向屏幕發送字符串的功能,我們就可以很方便的和用戶進行交互了。可以打印出一些我們需要的報錯信息之類的。
語法crt.Screen.Send(string, [, bSendToScreenOnly])
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 // 向遠程設備發送英文命令"show memory" 5 crt.Screen.Send("show memory\r\n"); 6 7 // 向屏幕上發送字符串 8 crt.Screen.Send("hello,world!\r\n",true);可是運行了這段代碼后很可能會發現,底下的向屏幕發送的字符串先打印到屏幕上了,效果如下,原因是Crt發送到屏幕的字符串可能先於遠程設備返回的字符串,因此會先打印下面的。解決辦法就是可以在發送屏幕的這一段前面加一個延時,這樣就不會先打印下面的了。
2.2.6、SendKeys()
解釋向當前窗口發送按鍵,包含組合按鍵,比如可以發送類似"CTRL+ALT+C"等這樣的組合鍵,這樣寫即可:
crt.screen.sendkeys("^%c");這個功能需要語言本身支持,目前只有VBS和JS腳本可以使用,Python和Perl都不可以。
語法crt.Screen.SendKeys(string)
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 crt.Screen.Clear(); 5 crt.screen.sendkeys("mc~"); 6 crt.Sleep(2000); 7 crt.screen.sendkeys("{f1}"); 8 crt.Sleep(2000); 9 crt.screen.sendkeys("{esc}0"); 10 crt.Sleep(2000); 11 crt.screen.sendkeys("{esc}0"); 12 crt.Sleep(2000); 13 crt.screen.sendkeys("y");具體可以有哪些按鍵,參照下表,修改對應參數即可,可以根據需要自由組合:
Key(按鍵)
Argument(參數)
SHIFT
+
CTRL
^
ALT
%
BACKSPACE
{BACKSPACE}, {BS}, or {BKSP}
BREAK
{BREAK}
CAPS LOCK
{CAPSLOCK}
DEL or DELETE
{DELETE} or {DEL}
DOWN ARROW
{DOWN}
END
{END}
ENTER
{ENTER} or ~
ESC
{ESC}
HELP
{HELP}
HOME
{HOME}
INS or INSERT
{INSERT} or {INS}
LEFT ARROW
{LEFT}
NUM LOCK
{NUMLOCK}
PAGE DOWN
{PGDN}
PAGE UP
{PGUP}
PRINT SCREEN
{PRTSC}
RIGHT ARROW
{RIGHT}
SCROLL LOCK
{SCROLLLOCK}
TAB
{TAB}
UP ARROW
{UP}
F1, F2, ... F16
{F1}, {F2}, ... {F16}
0, 1, ... 9 on number pad
{NUM_0}, {NUM_1}, ... {NUM_9}
. on number pad
{NUM_.}
/ on number pad
{NUM_/}
* on number pad
{NUM_*}
- on number pad
{NUM_-}
+ on number pad
{NUM_+}
ENTER on number pad
{NUM_ENTER}
HOME on number pad
{NUM_HOME}
PAGE UP on number pad
{NUM_PGUP}
END on number pad
{NUM_END}
PAGE DOWN on number pad
{NUM_PGDN}
UP ARROW on number pad
{NUM_UP}
DOWN ARROW on number pad
{NUM_DOWN}
LEFT ARROW on number pad
{NUM_LEFT}
RIGHT ARROW on number pad
{NUM_RIGHT}
2.2.7、SendSpecial()
解釋可以發送特殊控制碼,這個控制碼是Crt內置的功能,具體可以包含的有Menu、Telnet、VT functions功能列表中提供的所有功能,即下圖中的這些,有興趣可以調出new button后看到這些:
Menu Function:
Telnet:
VT functions:
語法
crt.Screen.SendSpecial(string)
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 // 以下是Crt文檔中舉的例子,具體還有什么我也沒有試過,各位可以自己試試 4 crt.screen.SendSpecial("MENU_PASTE"); 5 crt.screen.SendSpecial("TN_BREAK"); 6 crt.screen.SendSpecial("VT_PF1");
2.2.8、WaitForCursor()
解釋等待光標移動,當移動時返回值為true,當有超時時間參數且超時時返回false,否則會一直等待光標移動。利用這個功能可以用來判斷一個命令的輸出是否結束,只不過超時時間是以秒為單位的,對於腳本當中,這個時間還是略顯久了。
語法crt.Screen.WaitForCursor([timeout])
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 // 每5秒內光標有移動時即發送一個命令 5 while (1) { 6 if ( crt.Screen.WaitForCursor(5) ) { 7 crt.Screen.Send("show version\r\n"); 8 } 9 }
2.2.9、WaitForKey()
解釋檢測有鍵盤按鍵時返回true,當有超時時間參數且超時時返回false,否則會一直等待按鍵。只可惜這個函數不知道輸入的鍵是什么,否則就可以針對性的判斷了,它只能檢測到有輸入而已。
語法crt.Screen.WaitForKey([timeout])
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 // 每5秒內有輸入時發送一個命令 5 while (1) { 6 if ( crt.Screen.WaitForKey(5) ) { 7 crt.Screen.Send("show version\r\n"); 8 } 9 }
2.2.10、WaitForString()
解釋一般用於發送命令后等待某字符串,這個字符串只要是屏幕上出現的即可,哪怕是粘貼上去的命令也會同樣被檢測到,也可以用於等待屏幕的輸出打印,不需要先發送命令。不過一般我們使用它來檢測的都是發送命令后出現的標識符。
語法crt.Screen.WaitForString(string,[timeout],[bCaseInsensitive])
參數:
1、string,必選參數,等待的字符串,可以是特殊字符比如:\r\n;
2、timeout,可選參數,超時時間,當檢測不到對應字符串時會返回false,沒有此參數時會一直等待;
3、bCaseInsensitive,可選參數,大小寫不敏感,默認值是false,表示將檢測字符串的大小寫,當為true時不檢測大小寫。
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 // 發送命令,並在5秒內獲取到對應的字符串后發送一條命令 5 crt.Screen.Send("\r\n"); 6 if ( crt.Screen.WaitForString("#",5) ) { 7 crt.Screen.Send("show version\r\n"); 8 } 9 crt.Screen.Send("\r\n"); 10 if ( crt.Screen.WaitForString(">",5) ) { 11 crt.Screen.Send("who\r\n"); 12 } 13 crt.Screen.Send("\r\n"); 14 if ( crt.Screen.WaitForString("$",5) ) { 15 crt.Screen.Send("ls -l\r\n"); 16 }
2.2.11、WaitForStrings()
解釋和WaitForString是同樣的功能,只不過可以等待多個字符串,如果有匹配到某個字符串,則返回值該字符串在這些字符串中的位置,位置值從1開始。若在超時時間內沒有匹配到則返回false,沒有超時時間時會一直等待。
語法crt.Screen.WaitForStrings([string1,string2..],[timeout],[bCaseInsensitive])
參數:
1、string,必選參數,等待的字符串,最少有一個,可以是特殊字符比如:\r\n;
2、timeout,可選參數,超時時間,當檢測不到對應字符串時會返回false,沒有此參數時會一直等待;
3、bCaseInsensitive,可選參數,大小寫不敏感,默認值是false,表示將檢測字符串的大小寫,當為true時不檢測大小寫。
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 var outPut = crt.Screen.WaitForStrings("error", "warning", "#", 10); 5 var waitIndex = crt.Screen.MatchIndex 6 switch (waitIndex) { 7 case 0: 8 crt.Dialog.MessageBox("Timed out!") 9 break; 10 case 1: 11 crt.Dialog.MessageBox("Found 'error'") 12 break; 13 case 2: 14 crt.Dialog.MessageBox("Found 'warning'") 15 break; 16 case 3: 17 crt.Dialog.MessageBox("Found '#'") 18 break; 19 }上面也用到了crt.Screen.MatchIndex功能,具體可以見上面的2.1.6節。
2.2.12、ReadString()
解釋這個功能和上面的WaitForStrings函數有些類似,都是等待某幾個字符串出現,不過不同的是,ReadString函數還會讀取字符串之前的所有出現的字符,這個功能可以很方便的用於發送一個命令后獲取這個命令的輸出結果,不過這個函數也不是特別穩定,因為很可能存在命令的輸出結果很快,而屏幕又沒有捕捉到時,要么會由於超時而返回false,要么會一直等待,最終返回的都是空值,因此完全依靠該函數獲取命令的輸出的話並不是很把穩(如果程序對於穩定性要求很高的話,那么最好還是不要依賴這個函數。)
語法crt.Screen.ReadString([string1,string2..],[timeout],[bCaseInsensitive])
參數:
1、string,必選參數,等待的字符串,最少有一個,可以是特殊字符比如:\r\n;
2、timeout,可選參數,超時時間,當檢測不到對應字符串時會返回false,沒有此參數時會一直等待;
3、bCaseInsensitive,可選參數,大小寫不敏感,默認值是false,表示將檢測字符串的大小寫,當為true時不檢測大小寫。
代碼
- JS
1 # $language = "JScript" 2 # $interface = "1.0" 3 4 // 發送命令並根據提示符獲取命令的輸出。 5 crt.Screen.Send("show version\r\n"); 6 crt.Screen.WaitForString("show version",2); 7 var outPut = crt.Screen.ReadString("error", "warning", "#", 10); 8 var waitIndex = crt.Screen.MatchIndex 9 switch (waitIndex) { 10 case 0: 11 crt.Dialog.MessageBox("Timed out!") 12 break; 13 case 1: 14 crt.Dialog.MessageBox("Found 'error'") 15 break; 16 case 2: 17 crt.Dialog.MessageBox("Found 'warning'") 18 break; 19 case 3: 20 crt.Dialog.MessageBox("命令的輸出時:"+outPut); 21 break; 22 }在這個舉例中的第6行可以看到還使用了WaitForString,為什么要使用這個,有兩個方面原因,一是確定命令已經被發送到了遠端設備,二是確保命令的輸出結果中沒有改命令,而僅僅是該命令的輸出結果。
3、總結
以上就是Screen這個二級屬性的所有子屬性和子方法了,這里面的功能都是CRT系列中最最重要的功能,也是最常用的功能,大家可以平時在寫腳本時多琢磨這些函數的用法和奇妙之處。