Question
Thembelani Mlalazi · 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

00
2 0 7 350
Log in or sign up to continue

Replies

Can you tell us more about what do you want to achieve?

It could be easier just to log what client serves to a server in a form and do the same in objectscript.

@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));
        font-family: arial;
        overflow: hidden;
}
input {
    font-family: arial;
}
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     {
        font-family: Arial, Helvetica, sans-serif;
        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-family: Arial, Helvetica, sans-serif;
        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-family: Arial, Helvetica, sans-serif;
        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-family: Arial, Helvetica, sans-serif;
        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.
 

@Robert.Cemper  thank you for the guidance