w3reference home
Expect Tutorial


    Bookmark and Share

    Expect Scripting

    Expect automates interaction and obviates the need for human effort in regression testing and conformance testing. With Expect skills, you can develop automated test suites to assure reliability and consistency with earlier software versions, or conformance with standards such as POSIX.


    Get Started...
    The three commands
    • send
    • expect
    • and spawn
    are the building power of Expect. The send command sends strings to a process, the expect command waits for strings from a process, and the spawn command starts a process.

    The send Command
    The send command takes a string as an argument and sends it to a process. For example:

    send "hello world"

    This sends the string "hello world" (without the quotes). If Expect is already interacting with a program, the string will be sent to that program. But initially, send will send to the standard output. Here is what happens when I type this to the Expect interpreter interactively:
    % expect 
    expect1.1>send "hello world" 
    hello worldexpect1.2>exit 
    % 
    

    The send command does not format the string in any way, so after it is printed the next Expect prompt gets appended to it without any space. To make the prompt appear on a different line, put a newline character at the end of the string. A newline is represented by "\\n". The exit command gets you out of the Expect interpreter.
    expect1.1>send "hello world\\n" 
    hello world 
    expect1.2>exit 
    % 
    

    If these commands are stored in a file, speak, the script can be executed from the UNIX command line:
    % expect speak 
    hello world 
    

    To execute the file as just "speak" rather than "expect speak", insert the line "#!./expect -f" and do "chmod +x speak" . The name of the interpreter must appear after the characters #! in the first line. The ./expect is the path where Expect is to be found; in this case, it is in the current working directory.
    % cat speak 
    #!./expect -f 
    send "hello world\\n" 
    % 
    % chmod +x speak 
    % speak 
    hello world 
    
    The expect Command
    The expect command waits for a response, usually from a process. expect can wait for a specific string or any string that matches a given pattern. Like send, the expect command initially waits for characters from the keyboard. To see how see how the expect command works, create a a file response.exp that reads:
    #!./expect -f
    expect "hi\\n" 
    send "hello there!\\n" 
    

    When I make response.exp executable and run it, the interaction looks like this:
    % chmod +x response.exp 
    % response.exp 
    hi 
    hello there! 
    

    If you get an error that goes like couldn't read file " ": No such file or directory, it may be because there are non-printable characters in your file. This is true if you do cut-and-paste from Netscape to your file. To solve this problem, try deleting trailing spaces at the end of each command line (even if there seems to be nothing there) in the script and follow the above steps again.

    What Happens When Input Does Not Match
    If expect reads characters that do not match the expected string, it continues waiting for more characters. If I had type hello instead of hi followed by a return, expect would continue to wait for "hi\n". Finding unexpected data in the input does not bother expect. It keeps looking until it finds something that matches. If no input is given, expect command eventually times out and returns. By default, after 10 seconds expect gives up waiting for input that matches the pattern. This default value can be changed by setting the variable timeout using the Tcl set command. For example, the following command sets the timeout to 60 seconds.

    set timeout 60

    A timeout of -1 signifies that expect should wait forever and a timeout of 0 indicates that expect should not wait at all.

    Anchoring
    To prevent expect from matching unexpected data, expect patterns can include regular expressions. The caret ^ is a special character that only matches the beginning of the input; it cannot skip over characters to find a valid match. For example, the pather ^hi matches if I enter "hiccup" but not if I enter "sushi" . The dollar sign ($) is another special character. It matches the end of the data. The pattern hi$ matches if I enter "sushi" but not if I enter "hiccup". And the pattern ^hi$ matches neither "sushi" nor "hiccup". It matches "hi" and nothing else.

    Patterns that use ^ or $ are said to be anchored. When patterns are not anchored, patterns match beginning at the earliest possible position in the string.

    Pattern-Action Pairs
    Expect also allows association between a command and a pattern. The association is made by listing the action (also known as command) immediately after the pattern in the expect command itself. Here is an example of pattern-action pairs:
    expect "hi"  { send "You said hi\\n" } \
    "hello"   { send "Hello yourself\\n" } \
    "bye"     { send "Good-bye cruel world\\n" }
    

    This command looks for "hi", "hello", and "bye". If any of the three patterns are found, the action immediately following it gets executed. If there is no match and the default timeout expires, expect stops waiting and execution continues with the next command in the script.

    The spawn Command
    The spawn command starts another program. The first argument of the spawn command is the name of a program to start. The remaining arguments are passed to the program. For example:

    spawn ftp ftp.mozilladownloads.net

    This command spawns an ftp process and ftp.mozilladownloads.net is the argument to the ftp process.
    Putting It All Together
    Now we're ready to use the three commands above to write a little script to do some automations. Normally when I do anonymous ftp by hand from a shell, this is what I see:
    % ftp ftp.mozilladownloads.net
      Connected to ftp.mozilladownloads.net.
      220 ftp.UU.NET FTP server (Version wu-2.4(3) 
      Fri Jun 25 16:08:40 EST 2008) ready.
      Name (ftp.mozilladownloads.net:dtly): anonymous
      331 Guest login ok, send your complete e-mail
          address as password.
      Password:
      230-    
      230-	Welcome to the mozilladownloads archive.
      230-  A service of mozilladownloads Technologies Inc
      230-  Guest login ok, access restrictions apply.
      ftp>
    

    To partially automate this action so that you don't have to supply an appropriate identification and then have control turn over to you, create a file aftp.exp that looks like this:
    #!./expect -f 
    spawn ftp $argv 
    expect "Name" 
    send "anonymous\\r" 
    expect "Password:" 
    send "mypasswd\\r" 
    interact 
    

    Notice that each send command in the script ends with \r and not \n (\r denotes a return character while \n denotes a linefeed character). Interact is an Expect command that turns control from the script over to you. When this command is executed, Expect stops reading commands from the script and instead begins reading from the keyboard.
    Code Validator
    Learn FTP
    Color finder
    Link Checker
    Free web designs
    Coming soon!
    Interview Questions...
    'w3reference : Learn by examples ... Advanced to beginner's tutorials ...'
    Ajax: AJAX tutorial1 | Apache: Apache HTTP Server | Restarting Apache | CSS: CSS Border | CSS Syntax | CSS Selector | CSS Comment | CVS: CVS Release | CVS Login | CVS Logout | CVS Annotate | Databases: Rolap Tutorial | OLAP Tutorial | OLTP Tutorial | data warehousing | Expect: HTML: html | Linux: Dot (.) conf files | Linux Mount Point | Linux Filesystem | SSH Tutorial | Linux Commands: cal | cat | cfdisk | chroot | MySQL: MySQL Commands | PHP: PHP Basics | PHP Variables | PHP Output (echo/print) | PHP String Concat | PL/SQL: PL/SQL Data Types | PL/SQL Control Structures | PL/SQL File Extensions | PL/SQL DBMS_OUTPUT package | Python: My first Python program | Shell: Starting Bash | Bash Redirection | Bash Pipes | Bash Variables | SQL: SQL Transactions | SQL Constraints | SQL Drop | SQL Union & Union All | SVN: svn architecture | SVN Repository | SVN Import | SVN Checkout | Tech: soap | Web Designing: Web Hosting | HTML/XHTML/CSS code validator | Learn FTP | Search Engine Optimization Tips | www: XML: XML vs HTML | XML Syntax | XML Tags, Elements and Attributes | XML Namespaces |
    Sitemap | Disclaim | Privacy Policy | Contact | ©2007-2009 w3reference.com All Rights Reserved.