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
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
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
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>
+-----------------------------------------------------
<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();
}
}
</script>
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;
}
font-family: arial;
}
background: white;
width: 98%;
border: 2px solid black;
}
width: 100%;
height: 60px;
position: relative;
left: 20px;
}
padding-left: 40px;
font-size: 9pt;
color: #606060;
text-align: left;
}
font-size: 9pt;
color: black;
text-align: left;
font-weight: bold;
}
font-family: Arial, Helvetica, sans-serif;
border: rgb(138,138,138) solid 1px;
opacity: 1.0;
border-radius: 5px;
-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));
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;
}
border: rgb(165,172,178) 1px solid;
}
h3 {
color: rgb(67,67,67);
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
font-weight: bold;
}
color: #D0D0D0;
font-size: 16pt;
padding: 0px;
padding-bottom: 5px;
text-align: center;
text-shadow: black 1px 1px 1px;
}
color: #808080;
font-size: 10pt;
padding-top: 2px;
text-shadow: #6374AB 1px 1px 1px;
}
position: static;
padding: 10px;
padding-bottom: 4px;
padding-right: 30px;
text-align: center;
}
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>
<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 </td>
</tr>
</table>
</div>
</td>
<td width="10%" align="right" valign="top">
<div class="portalLogoBox">
<div class="portalLogo" title="Powered by Zen">Caché</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">
<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> </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
Bouncing off of @Robert.Cemper 's hints, if you are using a default SMP (system management portal) login you can just pass in the arguments for the username and password fields as follows:
https://mytest.myserver.com/csp/sys/UtilHome.csp?CacheUserName=tech&CachePassword=demo
I just tested this and it worked like a charm :) (use your own credentials of course)
Social networks
InterSystems resources
To leave a comment or answer to post please log in
Please log in
To leave a post please log in