Question
· Dec 11, 2018

How to mimic selenium in cache object Script

Is it possible to mimic what selenium does like navigating to a site and logging in  and filling out a form then logout in COS.I am trying to do that in COS using %Net.HttpRequest class or should I be using a different class the idea is to be able to call a web app login into it and fill out form and log out

Discussion (7)2
Log in or sign up to continue

@Robert.Cemper  Is it possible to have an example as I do not know where to start so far using the %Net.HttpRequest I have been able to navigate to the Log in page and would like to locate the user inputs and insert some credentials

set oReq = ##class(%Net.HttpRequest).%New()
set oReq.Server =..Server
set oReq.Location =..location
set oReq.SSLConfiguration =..SSlConfig 
set oReq.Https=1

 

I did something similar in past.  %Net.HttpRequest is the right way

You have to mimic a browser and have to find the right Form and Input tags to fill USER and PW typically.
The risk you have:
- you may get a awfull amount of JS and CSS stuff.
- If it isn't a classic form  you may need to reverse engineer all the dynamics behind (like a browser).

It may end up with a very tricky coding exercise.

I used Caché default login page as an example as it is a very easy one to serve.
http://localhost:57772/csp/sys/%25CSP.Login.cls

Take a look to YOUR login page to see if you really want to do this.

First, you do the Get() to fetch your login page

USER>Write oReq.Get("csp/sys/%2525CSP.Login.cls"),! ZWRITE oReq

1
oReq=<OBJECT REFERENCE>[1@%Net.HttpRequest]
+----------------- general information ---------------
|      oref value: 1
|      class name: %Net.HttpRequest
| reference count: 2
+----------------- attribute values ------------------
|         AcceptGzip = 1  <Set>
|    (BinaryContent) = 1
|(Cookies("127.0.0.1","/","CSPWSERVERID")) = $lb("144BiVjd","",0)
|(Cookies("127.0.0.1","/","CacheBrowserId")) = $lb("fCl8qBvDJnIKcns4iOsFlw--","",0)
|(Cookies("127.0.0.1","/csp/sys","CSPSESSIONID-SP-57772-UP-csp-sys-")) = $lb("001000010000G5M1GDe9SeGk57MvZN91AeLNZ1wkcwbfb5gBQs","",0)
|           (Device) = "|TCP|36057801"
|      (DeviceState) = $lb("127.0.0.1",57772,"",8080,"","0","",0)
|  (ErrorOnNextOpen) = 0
|     FollowRedirect = ""
|   ForceReuseDevice = 0
|        HTTPVersion = 1.1
|          (Headers) = 5
|(Headers("ACCEPT-ENCODING")) = "gzip"
|(Headers("ACCEPT-ENCODING",0)) = "Accept-Encoding"
|(Headers("ACCEPT-ENCODING",1)) = 3
|(Headers("ACCEPT-ENCODING",2)) = ""
|  (Headers("HOST")) = "127.0.0.1"
|(Headers("HOST",0)) = "Host"
|(Headers("HOST",1)) = 2
|(Headers("HOST",2)) = ""
|(Headers("REFERER")) = "http://127.0.0.1:57772/csp/sys/%2525CSP.Login.cls"
|(Headers("REFERER",0)) = "Referer"
|(Headers("REFERER",1)) = 4
|(Headers("REFERER",2)) = ""
|(Headers("USER-AGENT")) = "Mozilla/4.0 (compatible; Cache;)"
|(Headers("USER-AGENT",0)) = "User-Agent"
|(Headers("USER-AGENT",1)) = 1
|(Headers("USER-AGENT",2)) = ""
|              Https = 0
|     LocalInterface = ""
|           Location = "csp/sys/%2525CSP.Login.cls"  <Set>
|NoDefaultContentCharset = 0
|        OpenTimeout = ""
|           Password = ""
|               Port = 57772  <Get>
|           PostGzip = 0
|         ProxyHTTPS = 0
|          ProxyPort = 8080
|        ProxyServer = ""
|        ProxyTunnel = 0
|        ReadRawMode = 0
|           RecChars = 2262
|       (RedirectNo) = 0
|RequestHeaderCharset = "UTF-8"
|     ResponseStream = ""
| ReturnGzipResponse = 1
|      SOAPBuffering = ""
|SSLCheckIdentityInternal = ""
|SSLCheckServerIdentity = 1
|   SSLConfiguration = ""
|           SSLError = ""
|          SentChars = 354
|      SocketTimeout = 115
|               TTFC = .00366
|               TTLC = .005715
|     (TimeLastUsed) = 5615429668.294
|            Timeout = 30
|           Username = ""
|       WriteRawMode = 0
|       WriteTimeout = -1
+----------------- swizzled references ---------------
|       i%EntityBody = ""  <Set>
|       r%EntityBody = "2@%Library.GlobalBinaryStream"  <Set>
|     i%HttpResponse = ""
|     r%HttpResponse = "3@%Net.HttpResponse"
+--------------- calculated references ---------------
|      Authorization   <Get,Set>
|     ContentCharset   <Get,Set>
|    ContentEncoding   <Get,Set>
|      ContentLength   <Get>
|        ContentType   <Get,Set>
|               Date   <Get,Set>
|               From   <Get,Set>
|    IfModifiedSince   <Get,Set>
|             Pragma   <Get,Set>
| ProxyAuthorization   <Get,Set>
|            Referer   <Get,Set>
|             Server   <Get,Set>
|          UserAgent   <Get,Set>
+-----------------------------------------------------

-

Next you refer to the response and get all Headers and Cookies

USER>s oRes=oReq.HttpResponse  ZW oRes

oRes=[3@%Net.HttpResponse]
+----------------- general information ---------------
|      oref value: 3
|      class name: %Net.HttpResponse
| reference count: 3
+----------------- attribute values ------------------
|    ContentBoundary = ""
|        ContentInfo = "charset=utf-8"
|      ContentLength = 1841
|        ContentType = "text/html; charset=utf-8"
|               Data = "4@%Stream.FileCharacterGzip"
|Headers("CACHE-CONTROL") = "no-cache"
|Headers("CONTENT-ENCODING") = "gzip"
|Headers("CONTENT-LENGTH") = 1841
|Headers("CONTENT-TYPE") = "text/html; charset=utf-8"
|    Headers("DATE") = "Tue, 11 Dec 2018 09:34:28 GMT"
| Headers("EXPIRES") = "Thu, 29 Oct 1998 17:04:19 GMT"
|  Headers("PRAGMA") = "no-cache"
|  Headers("SERVER") = "Apache"
|Headers("SET-COOKIE") = "CSPSESSIONID-SP-57772-UP-csp-sys-=001000010000G5M1GDe9SeGk57MvZN91AeLNZ1wkcwbfb5gBQs; path=/csp/sys/;  httpOnly;,CSPWSERVERID=144BiVjd; path=/; httpOnly;"
|        HttpVersion = "HTTP/1.1"
|       ReasonPhrase = "OK"
|         StatusCode = 200
|         StatusLine = "HTTP/1.1 200 OK"
+-----------------------------------------------------

Finally you access the page you got (a GZ Stream)

USER>set oData=oRes.Data ZW oData

oData=<OBJECT REFERENCE>[4@%Stream.FileCharacterGzip]
+----------------- general information ---------------
|      oref value: 4
|      class name: %Stream.FileCharacterGzip
|           %%OID: $lb("C:\InterSystems\Cache\mgr\Temp\7KrzEUaFJT0zvA.http","%Stream.FileCharacterGzip","")
| reference count: 3
+----------------- attribute values ------------------
|     (%Concurrency) = 1
|          %Location = ""  <Set>
|         (%LockRef) = ""
|          (%Locked) = 0
|              AtEnd = 0
|                BOM = ""
|         (CurrFile) = ""
|                 Id = "C:\InterSystems\Cache\mgr\Temp\7KrzEUaFJT0zvA.http"  <Set>
|     LineTerminator = $c(13,10)  <Set>
|      (MakePermLoc) = 0
|             (Mode) = 1
|(NormalizedDirectory) = "C:\InterSystems\Cache\mgr\Temp\"
|(OidTranslateTable) = "UTF8"
|         (ReadMode) = 0
|           ReadSize = ""
|      RemoveOnClose = 1
|        (StoreFile) = "7KrzEUaFJT0zvA.http"
|  StreamFormatWrite = 1
|         (TempFile) = ""
|     TranslateTable = "UTF8"  <Set>
|      UseVMSVersion = 0
|   (VariableRecord) = 0
+--------------- calculated references ---------------
|  CanonicalFilename   <Get>
|           Filename   <Get,Set>
|       LastModified   <Get>
|               Size   <Get>
+-----------------------------------------------------
and this is your page 
USER>do oData.OutputToDevice()
<html>
<head>
        <title>Anmeldung 'LOCAL'</title>
<script language="javascript">
        // called when page is loaded
        function pageLoad()
        {
                // see if we can give focus to the UserName field:
                if (self.document.Login && self.document.Login.CacheUserName) {
                        self.document.Login.CacheUserName.focus();
                        self.document.Login.CacheUserName.select();
                }
                return true;
        }
        </script>
        <style type="text/css">
body {
        background: rgb(232,231,226);
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType='0', startColorstr='#e8e7e2', endColorstr='#e0d9d9');
        background: -webkit-gradient(linear, left top, left bottom, color-stop(0.0,rgb(232,231,226)), color-stop(0.5,rgb(242,241,236)), color-stop(1.0,rgb(232,231,226)));
        background: -moz-linear-gradient(top, rgb(232,231,226), rgb(242,241,236),rgb(222,221,216));
        background: linear-gradient(top, rgb(232,231,226), rgb(242,241,236),rgb(222,221,216));
        ;
        overflow: hidden;
}
input {
    ;
}
table.LayoutTable {
        background: white;
        width: 98%;
        border: 2px solid black;
}
.portalTitle {
        width: 100%;
        height: 60px;
        position: relative;
}
.portalTitleInfoBox {
        left: 20px;
}
.portalTitleInfoLabel {
        padding-left: 40px;
        font-size: 9pt;
        color: #606060;
        text-align: left;
}
.portalTitleInfoVal {
        font-size: 9pt;
        color: black;
        text-align: left;
        font-weight: bold;
}
table.login     {
        ;
        border: rgb(138,138,138) solid 1px;
        opacity: 1.0;
        border-radius: 5px;
        background: rgb(237,236,228);
        -moz-border-radius: 5px;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType='0', startColorstr='#e8e7e2', endColorstr='#e0d9d9');
        background: -webkit-gradient(linear, left top, left bottom, color-stop(0.0,rgb(232,231,226)), color-stop(0.5,rgb(242,241,236)), color-stop(1.0,rgb(232,231,226)));
        background: -moz-linear-gradient(top, rgb(232,231,226), rgb(242,241,236),rgb(222,221,216));
        background: linear-gradient(top, rgb(232,231,226), rgb(242,241,236),rgb(222,221,216));
}
table.login td.loginCaption {
        filter:alpha(opacity=100);
        opacity: 1.0;
        color: rgb(67,67,67);
        ;
        font-size: 11px;
        text-align: left;
        padding-left:20px;
}
table.login td.loginInput {
        border: rgb(165,172,178) 1px solid;
}
/* Logout message */
h3 {
        color: rgb(67,67,67);
        ;
        font-size: 12px;
        font-weight: bold;
}
div.loginPrompt {
        color: #D0D0D0;
        font-size: 16pt;
        padding: 0px;
        padding-bottom: 5px;
        text-align: center;
        text-shadow: black 1px 1px 1px;
}
div.isc {
        color: #808080;
        font-size: 10pt;
        padding-top: 2px;
        text-shadow: #6374AB 1px 1px 1px;
}
.portalLogoBox {
        position: static;
        padding: 10px;
        padding-bottom: 4px;
        padding-right: 30px;
        text-align: center;
}
.portalLogo {
        color: rgb(53,107,141);
        position: relative;
        font-weight: bold;
        font-size: 12pt;
        top: 0px;
        right: 0px;
        border: 2px solid rgb(53,107,141);
        padding: 2px;
        padding-left: 5px;
        padding-right: 5px;
        -moz-border-radius: 4px;
        border-radius: 4px;
        background: #E0E0F0;
}
.portalLogoSub {
        position: relative;
        color: #808080;
        font-size: 8pt;
        top: 3px;
        right: 0px;
}
.loginlink {
        color: rgb(52,108,141);
}
.button {
        background: rgb(52,108,141);
        color: white;
        ;
        font-size:10px;
        text-transform: uppercase;
        text-decoration: none;
        font-weight: bold;
        padding: 3px;
        padding-left: 8px;
        padding-right: 8px;
        -moz-border-radius: 5px;
        border-radius: 5px;
        border-top: 1px solid lightgray;
    border-left: 1px solid lightgray;
    border-right: 1px solid gray;
    border-bottom: 1px solid gray;
    cursor: pointer;
}
.button:hover {
        background: rgb(53,107,141);
        color: white;
        background-image: url(portal/button_hover.png);
        background-repeat: repeat-x;
}
</style>
</head>
                <body style="background-color:rgb(232,231,226);" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onload="pageLoad();">
<table class="portalTitle" id="group_1" width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr valign="bottom">
        <td width="99%" align="left">
                <div class="portalTitleInfoBox">
                <table border="0">
                <tr>
                <td class="portalTitleInfoLabel">Instanz:</td><td class="portalTitleInfoVal">LOCAL&nbsp;</td>
                </tr>
                </table>
                </div>
        </td>
        <td width="10%" align="right" valign="top">
        <div class="portalLogoBox">
        <div class="portalLogo" title="Powered by Zen">Cach&eacute;</div>
        <div class="portalLogoSub">by InterSystems</div>
        </div>
        </td>
        </tr>
        </table>
<tr><td><table border="0" cellpadding="10" align="center" class="LayoutTable">
        <tr>
        <td align="center">
        <table border="0" class="LayoutMain" width="100%" cellpadding="5" cellspacing="0">
<tr><td style="height:90px;"><br/></td></tr>
<tr><td><center>

        <form name="Login" method="post" action="/csp/sys/%2525CSP.Login.cls">
        <table class="login" style="background-color:rgb(232,231,226);" border="0" cellspacing="6" cellpadding="2" >
        <tr valign="bottom">
        <td nowrap class="loginCaption">User Name</td>
        <td style="padding-top:18px;padding-right:20px;"><input type="text" size="30" name="CacheUserName" class="loginInput" value=""/>
        </td>
        </tr>
        <tr valign="bottom">
        <td nowrap class="loginCaption">Kennwort</td>
        <td><input type="password" size="30" name="CachePassword" class="loginInput"/>
        </td>
        </tr>
        <tr><td>&nbsp;</td>
         <td style="padding-bottom:10px;"><input type="submit" name="CacheLogin" class="button" value="Anmeldung"></td>
        </tr>
        </table>
        </form></center>
</td></tr><tr><td style="height:180px;"><br/></td></tr></table></body></html>

-

I have marked "CacheUserName" , "CachePassword" that you have to submit for Login.