Author Message bacon117
Joined: 26 May 2010
Posts: 18Posted: Thu Jun 03, 2010 8:54 pm Post subject: Com_invoke to login Hello erbody.
Hopefully someone can help me with this. By studying tanks awesome com tutorial (http://www.autohotkey.com/forum/topic34972.html) I have learned a few things.
I have figured out how to push the username and pw into the website, and I can click buttons on other websites, but I cannot figure out how to click the "Log in" button on my particular site. I can make it work with Focus-> {enter}, but I would like to leave the page hidden until it is logged in. Here is the DOM of http://www.covisint.com/web/guest/login-manufacturing : Code (Expand):
<SCRIPT type="text/javascript">
/*<![CDATA[*/jQuery(function(){var a="p_p_id_56_INSTANCE_q44R_";tmpFm=jQuery("form[name="+a+"tmpLogin]"),loginFm=jQuery("form[name="+a+"login]"),tmpUser=jQuery("input[name=user]",tmpFm),tmpPw=jQuery("input[name=password]",tmpFm),user=jQuery("input[name=user]",loginFm),pw=jQuery("input[name=password]",loginFm),time=jQuery("input[name=submitTime]",loginFm);tmpUser.focus();tmpFm.submit(function(c){if(tmpUser.val().length==0){alert("Please enter a User Name");tmpUser.focus()}else{if(tmpPw.val().length==0){alert("Please enter Password");tmpPw.focus()}else{user.val(tmpUser.val().toUpperCase());pw.val(tmpPw.val());time.val((new Date).getTime());var b=new Cookie("defaultLogin");b.industry="manufacturing";b.store(90,"/");loginFm.submit()}}return false})});/*]]>*/
</SCRIPT>
</P>
<FORM method="post" name="p_p_id_56_INSTANCE_q44R_login" action="https://us.sso.covisint.com/sso?cmd=LOGIN">
<INPUT type="hidden" name="auth_mode" value="basic" /><INPUT type="hidden" name="user" value="" /><INPUT type="hidden" name="password" value="" /><INPUT type="hidden" name="submitTime" value="" />
</FORM>
<DIV class="portalLogin">
<H2>
Secure Login
</H2>
<DIV class="portalLoginPanel">
<DIV class="portalLoginPanelContent">
<FORM name="p_p_id_56_INSTANCE_q44R_tmpLogin" jQuery1275595950703="9">
<FIELDSET>
<LEGEND>Manufacturing <SPAN>Login</SPAN></LEGEND>
<OL>
<LI>
<LABEL for="p_p_id_56_INSTANCE_q44R_user">User Name</LABEL> <INPUT id="p_p_id_56_INSTANCE_q44R_user" class="field" name="user" jQuery1275595950703="8" index="1" value="" />
</LI>
<LI>
<LABEL for="p_p_id_56_INSTANCE_q44R_password">Password</LABEL> <INPUT id="p_p_id_56_INSTANCE_q44R_password" class="field" type="password" name="password" index="2" value="" />
</LI>
<LI>
<LABEL> </LABEL> <INPUT class="loginButton" type="submit" index="3" value=" " />
</LI>
</OL>
</FIELDSET>
</FORM>
<!-- Manufacturing -->
Using this information, I have come up with these two entries to push the user name and PW to this site (both work): Code:
COM_Invoke(item62:=COM_Invoke(all2:=COM_Invoke(document:=COM_Invoke(pwb,"Document"),"All"),"item","p_p_id_56_INSTANCE_q44R_password"),"value",covpw)
But now, how do I click the link. This seems to be the code for the button:
<LABEL> </LABEL> <INPUT class="loginButton" type="submit" index="3" value=" " />
but there is no name or id for me to select and then "click".
I have tried these with no luck: Code:
COM_Invoke(itemsubmit:=COM_Invoke(all3:=COM_Invoke(document:=COM_Invoke(pwb,"Document"),"All"),"item","submit"),"submit")
;2.) ;COM_Invoke(document, "p_p_id_56_INSTANCE_q44R_tmpLogin", "click")
;3.)
; pbuttons := COM_Invoke(document, "getElementsByTagName", "submit")
; ; use loop to find the right button ->pbutton
; COM_Invoke(pbutton, "click")
;
;4.)
; COM_Invoke(itemsubmit:=COM_Invoke(all3:=COM_Invoke(document:=COM_Invoke(pwb,"Document"),"All"),"getElementsbytagname","submit"),"click")
Any ides or other clarification? bacon117
Joined: 26 May 2010
Posts: 18Posted: Thu Jun 03, 2010 9:20 pm Post subject: I have had some moderate sucess using the name of the input form. But when I run the script, it submits nothing to the website, and I get "invalid user name or password": Code:
Again, here is the code of the form: Code (Expand):
<form method="POST" action="https://us.sso.covisint.com/sso?cmd=LOGIN" name="p_p_id_56_INSTANCE_q44R_login">
<input type="hidden" value="basic" name="auth_mode" /><input type="hidden" name="user" /><input type="hidden" name="password" /><input type="hidden" value="" name="submitTime" />
</form><div class="portalLogin">
<h2>Secure Login</h2>
<div class="portalLoginPanel">
<div class="portalLoginPanelContent">
<form name="p_p_id_56_INSTANCE_q44R_tmpLogin">
<fieldset> <legend>Manufacturing <span>Login</span></legend>
<ol>
<li><label for="p_p_id_56_INSTANCE_q44R_user">User Name</label> <input type="text" index="1" name="user" id="p_p_id_56_INSTANCE_q44R_user" class="field" /></li><li><label for="p_p_id_56_INSTANCE_q44R_password">Password</label> <input type="password" index="2" name="password" id="p_p_id_56_INSTANCE_q44R_password" class="field" /></li><li><label> </label> <input type="submit" index="3" value=" " class="loginButton" /></li></ol>
</fieldset>
</form><!-- Manufacturing --> sinkfaze
Joined: 18 Mar 2008
Posts: 3612
Location: the tunnel(?=light)Posted: Thu Jun 03, 2010 10:30 pm Post subject: tank's tutorials are a little dated, as the syntax for using COM has been greatly simplified by using the "dotted path": Code:
COM_Invoke(pwb,"document.all.item[p_p_id_56_INSTANCE_q44R_user].value",covuser) ; <~ new method
COM_Invoke(item62:=COM_Invoke(all2:=COM_Invoke(document:=COM_Invoke(pwb,"Document"),"All"),"item","p_p_id_56_INSTANCE_q44R_password"),"value",covpw) ; <~ old method
COM_Invoke(pwb,"document.all.item[
p_p_id_56_INSTANCE_q44R_password].value",covpw) ; <~ new method
Using that will cut down on a great deal of confusion for you and for others trying to assist you. But alas, I digress...
You could of course submit the form directly, but the key to making the button work is to find out information about your button: Code:
You'll notice that the button doesn't have anything readily identifiable for it like a name or id, which will allow us the easiest access to it. The next easiest thing to do will be to determine how many buttons are on the page. We can't immediately distinguish buttons but we can distinguish how many page elements with its root HTML tag 'input' exist by using the length collection: Code:
Saving the result of that function call to a variable will tell you how many elements with the input tag are on the page: Code:
MsgBox, %p% input elements.
This is valuable information because we can now create a loop that will only run for as many input elements as there are on the page. But what do we look for? We know this particular input element's type is submit: Code:
So that's how we'll look for it, look at only input elements whose type is submit: Code:
Loop %p%
{
t := COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].type") ; item collections are zero-based indices (first item is item 0, second is 1, etc.)
. . .
The problem is that there may be multiple input items of type 'submit', so what else can uniquely match our button? The next likely suspect is the class: Code:
Now the class is kind of tricky because there is no class property of an item per se, but a className property: Code:
Loop %p%
{
c := COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].className")
. . .
So now we have two items which should reasonably identify our button, so we just have to use the loop to search for them! Code:
Loop %p%
{
t := COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].type")
c := COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].className")
if (t="submit") AND (c="loginButton") { ; if both things about the input element match
COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].click") ; click on the element
break ; and break the loop
}
}
Having worked with COM in this way for a while I write it slightly differently: Code:
if (COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].type")="submit")
&& (COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].className")="loginButton") {
COM_Invoke(pwb,"document.all.tags[input].item[" A_Index-1 "].click")
break
}
}
HTH
_________________
Try Quick Search for Autohotkey or see the tutorial for newbies. bacon117
Joined: 26 May 2010
Posts: 18