Page 1 of 1

VbScript to FWH translation ( login to a website follow up )

Posted: Tue Apr 26, 2011 12:42 pm
by Rick Lipkin
To All

I have been working on a Vbscript to login to a website, pass a login and click a submit button. I have successfully completed a working script I now wish to translate to xHarbour and FWH.

Here is the Vbscript code .. I have searched the forum and see where you can use active x and James posted some code to my above previous thread .. my problem now is to be able to navigate the site using the DOM id's or name of the fields I wish to populate .. logins and searches for parts .. etc

Any help would be appreciated.

Thanks
Rick Lipkin

Code: Select all

Option Explicit

Dim IE, WshShell
Set IE = CreateObject("InternetExplorer.Application")


With IE
  .Visible = True
  .Navigate "http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1253879194&rver=6.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1033&id=64855&mkt=en-us"
  Do While .Busy
    WScript.Sleep 200
  
  Loop
  
  ' use the web page dom names to fill in the proper fields

  .Document.getElementsByName("login").Item(0).Value = "myuserid"
  .Document.getElementsByName("passwd").Item(0).Value = "mypassword" 
  wscript.sleep (100)
 
  ' set up the submit button click 

  set WshShell = WScript.CreateObject("WScript.Shell")
  wscript.sleep (100)
  WshShell.SendKeys "{Enter}"

End With
 

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Tue Apr 26, 2011 2:04 pm
by lailton.webmaster

Code: Select all

#include "FiveWin.ch"

Function Main()
LOcal IE, WshShell

IE       := CreateObject("InternetExplorer.Application")
WshShell := CreateObject("WScript.Shell")

IE:Visible := .t.
IE:Navigate( "http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1253879194&rver=6.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1033&id=64855&mkt=en-us" )
While IE:Busy
      WshShell :Sleep( 200 )
      SysRefresh() // To Refresh
      Loop
End
WshShell:sleep( 100 )
WshShell:SendKeys "{Enter}"

Return Nil

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Wed Apr 27, 2011 2:37 pm
by Rick Lipkin
Lailton

Thank you for your reply .. and your code works with the following modifications to insert my credentials into the DOM fields 'login' and 'passwd' ..

However, once I get the automated login .. the page changes to my e-mail and I want to insert some 'text' into the search which has a DOM name of 'query'.

I realize the IE page and IE object has now changed and as you see I have attempted a EI:Refresh() .. but that does not seem to refresh the object holding the DOM .. and when I reference the search ( dom name is 'query' ) I get a run-time error on line 31 class: NIL meaning the dom name I am referencing does not exist ( see screen shot of the DOM )

Any help here would be appreciated.

Thanks
Rick Lipkin

Image

Image

Code: Select all

#include "fivewin.ch"

//--------------------------

Func Main()
Local IE, WshShell

IE       := CreateObject("InternetExplorer.Application")
WshShell := CreateObject("WScript.Shell")

IE:Visible := .t.
IE:Navigate( "http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1253879194&rver=6.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1033&id=64855&mkt=en-us" )

Do While IE:Busy
   SysWait(5)
   SysRefresh() // To Refresh
   Loop
Enddo

IE:Document:getElementsByName("login"):Item(0):Value = "*******@live.com"
IE:Document:getElementsByName("passwd"):Item(0):Value = "********"

SysWait(2)
WshShell:SendKeys( "{Enter}" )
SysWait(10)

IE:Refresh()
SysRefresh()
SysWait(3)

IE:Document:getElementsByName("query"):Item(0):Value = "rick"

Syswait(2)
WshShell:SendKeys( "{Enter}" )


Return Nil
 

Code: Select all

Application
===========
   Path and name: C:\Fox\WebCrawl\Hotmail.Exe (32 bits)
   Size: 1,873,920 bytes
   Time from start: 0 hours 0 mins 25 secs 
   Error occurred at: 04/27/11, 10:20:24
   Error description: Error BASE/1005  Class: 'NIL' has no property: VALUE
   Args:
     [   1] = U   
     [   2] = C   rick

Stack Calls
===========
   Called from:  => _VALUE(0)
   Called from: main1.prg => MAIN(31)
 

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Wed Apr 27, 2011 4:28 pm
by lailton.webmaster
Try this way

Code: Select all

Try
 IE:Document:getElementsByName("UIFrame"):contentWindow:document: ( way frame and form here ) :getElementsByName("fieldname"):Item(0):Value = "rick"
Catch
 MsgInfo("It's Fail ...")
End
 

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Wed Apr 27, 2011 5:14 pm
by Rick Lipkin
Lailton

You mentioned ( way frame and form ) .. I guess you meant the entire UIFrame line in the DOM inspector .. hi-lited in the screen shot and in the code below ?

If so .. the code did not work see the following error... did I not interpret your suggestion correctly ?

Thanks
Rick Lipkin
Try
IE:Document:getElementsByName("UIFrame"):contentWindow:document: ( way frame and form here ) :getElementsByName("fieldname"):Item(0):Value = "rick"
Catch
MsgInfo("It's Fail ...")
End

Code: Select all

#include "fivewin.ch"

//--------------------------

Func Main()
Local IE, WshShell

IE       := CreateObject("InternetExplorer.Application")
WshShell := CreateObject("WScript.Shell")

IE:Visible := .t.
IE:Navigate( "http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1253879194&rver=6.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1033&id=64855&mkt=en-us" )

Do While IE:Busy
   SysWait(5)
   SysRefresh() // To Refresh
   Loop
Enddo

IE:Document:getElementsByName("login"):Item(0):Value = "r2.1955@live.com"
IE:Document:getElementsByName("passwd"):Item(0):Value = "nov@1955"

SysWait(2)
WshShell:SendKeys( "{Enter}" )
SysWait(10)

*TRY       // failed also with getElementById
   IE:document:getElementsByName("UIFrame"):contentWindow:document:;
   forms:aspnetForm:c_search_psb_box:getElementsByName("query"):;
   Item(0):Value = "rick"
*CATCH
 *  MsgInfo("It Failed ...")
*END TRY

Syswait(2)
*WshShell:SendKeys( "{Enter}" )


Return Nil
 

Code: Select all

Application
===========
   Path and name: C:\Fox\WebCrawl\Hotmail.Exe (32 bits)
   Size: 1,873,920 bytes
   Time from start: 0 hours 0 mins 21 secs 
   Error occurred at: 04/27/11, 13:07:37
   Error description: Error InternetExplorer.Application:DOCUMENT:GETELEMENTSBYNAME/0  S_OK: CONTENTWINDOW
   Args:

Stack Calls
===========
   Called from: source\rtl\win32ole.prg => TOLEAUTO:CONTENTWINDOW(0)
   Called from: main1.prg => MAIN(30)
 
Image

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Wed Apr 27, 2011 5:28 pm
by lailton.webmaster
How you see. the search of Live.com is a FRAME, so you need set value to object inside of frame. and not set to 'query'.

you need get object inside of frame to set value. and later send a submit to form inside of frame.
:)

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Wed Apr 27, 2011 8:56 pm
by Rick Lipkin
Lailton

I appreciate your help and advice .. I was able to get the DOM inside the search field and I tried it with the entire line including the iframe as well as just the id without success ..

Included is the DOM of the frame and the second is the DOM of the inside of the frame .. any ideas on what I should reference in my code .. as you can see I have tried several DOM strings ?

Rick Lipkin

Code: Select all

#include "fivewin.ch"

//--------------------------

Func Main()
Local IE, WshShell

IE       := CreateObject("InternetExplorer.Application")
WshShell := CreateObject("WScript.Shell")

IE:Visible := .t.
IE:Navigate( "http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1253879194&rver=6.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1033&id=64855&mkt=en-us" )

Do While IE:Busy
   SysWait(5)
   SysRefresh() // To Refresh
   Loop
Enddo

IE:Document:getElementsByName("login"):Item(0):Value = "******@live.com"
IE:Document:getElementsByName("passwd"):Item(0):Value = "*******"

SysWait(2)
WshShell:SendKeys( "{Enter}" )
SysWait(10)

*TRY
*IE:document:frames:UIFrame:getElementById("c_search_psb_f"):;
* Item(0):Value = "rick"

IE:document:getElementById("UIFrame"):contentWindow:document:;
   getElementById("c_search_psb_f"):Item(0):Value = "rick"

*IE:document:getElementById("c_search_psb_f"):Item(0):Value = "rick"

    * IE:document:getElementById("UIFrame"):contentWindow:document:;
    * getElementById("c_search_psb_f"):Item(0):Value = "rick"

*CATCH
*   MsgInfo("It Failed ...")
*END TRY

Syswait(2)
*WshShell:SendKeys( "{Enter}" )


Return Nil
 
Image

Image

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Wed Apr 27, 2011 9:05 pm
by lailton.webmaster
I'll do test and report my result for you.

Cya.

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Thu Apr 28, 2011 2:15 pm
by Rick Lipkin
Lailton

Thank you for your help .. I am thinking it might be a refresh issue with the IE object .. As the page changes perhaps the IE object needs to be refreshed somehow so the DOM can be addressed correctly.

Rick Lipkin
r1.1955@live.com

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Fri Apr 29, 2011 5:12 am
by lailton.webmaster
Rick,

What you want do ? a outlook ? :D

Re: VbScript to FWH translation ( login to a website follow up )

Posted: Fri Apr 29, 2011 1:51 pm
by Rick Lipkin
Lailton

What I am ultimately trying to accomplish is to be able to login to a part vendors website and search for an item and return the results.

The first part of that is almost done .. I am just having problems with the DOM object ID which you should be able to reference by GetElementByID as in this code .. however, I can never seem to get that method to work either for a field or a control ..

Code: Select all

//----------------------------
Static Func Ebay()
Local IE, WshShell, fields, button

IE       := CreateObject("InternetExplorer.Application")
WshShell := CreateObject("WScript.Shell")

IE:Visible := .t.
IE:Navigate( "http://www.ebay.com/" )

Do While IE:Busy
   SysWait(1)
   SysRefresh() // To Refresh
   Loop
Enddo

buttons := nil
fields  := nil

fields  := IE:Document:getElementsByName("_nkw")
buttons := IE:Document:getElementById("ghSearch")

try
   fields[0]:value = "HMDX-GO"
   SysReFresh()
catch
   Msginfo("Could not find DOM element '_nkw'")
   IE:Quit()
   return(nil)
end try

try
   buttons[0]:click()
   SysReFresh()
catch
   Msginfo("Could not find DOM element 'ghSearch'")
   IE:Quit()
   return(nil)
end try

SysWait(2)

// use this to force an enter key for search button
*WshShell:SendKeys( "{Enter}" )

Return Nil
 
In the above example the id ghSearch is in the DOM .. but the GetElementByID method fails and I have had to resort to the work around by forcing a keystroke

// use this to force an enter key for search button
*WshShell:SendKeys( "{Enter}" )

to activate the search button control ..

Image

Image


It seams with all my tests with various websites including BestBuy .. even the GetElementByName for button controls either fail or do not work as in this example

Code: Select all

Static Func BestBuy()
Local IE, WshShell,field1,buttons

IE       := CreateObject("InternetExplorer.Application")
WshShell := CreateObject("WScript.Shell")

IE:Visible := .t.
IE:Navigate( "http://www.bestbuy.com/" )

Do While IE:Busy
   SysWait(1)
   SysRefresh() // To Refresh
   Loop
Enddo

field1  := ie:document:getelementsbyname("st")
buttons := ie:document:getelementsbyname("goButton")

try
   field1[0]:value = "computers"
   SysReFresh()
catch
   Msginfo("Could not find DOM element 'st'")
   IE:Quit()
   return(nil)
end try

try
   buttons[0]:click()
   SysReFresh()
catch
   Msginfo("Could not find DOM element 'goButton'")
   IE:Quit()
   return(nil)
end try


SysWait(2)
//WshShell:SendKeys( "{Enter}" )

Return Nil
 
Image

Feel free to cut, paste and compile the above examples and you can test the results for yourself ..

Any advice or help would be appreciated.

Rick Lipkin
r1.1955@live.com