Connecting to Internet Explorer instance and getting form values


Anybody knows how to connect to an open Intenet Explorer instance and get its forms' values. (Not using a TWeBrowser component).

Who is Participating?
Eddie ShipmanAll-around developerCommented:
Get the IE EventSink demo here:
Then modify to catch the OnNavigate2 event and get the vars.

Wim ten BrinkSelf-employed developerCommented:
Would be difficult if you have multiple IE instances... :-)
nanyAuthor Commented:
Just one
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

Eddie ShipmanAll-around developerCommented:
You can get you to the IHTMLDocument2 of each instance.

See this example:

Then you can iterate the Document's elements and obtain the values.

Now, if you want to get what the user has put in BEFORE submitting the form,
could be another story because I don't think the values are modified in the document
at all but sent via the GET or POST.
I was just about to post the exact same question.
 I tried out and modified it to get the value from a form. But the process consumption went through the roof (a constant 100%) and I kept getting an error (Automation 'form' object not possible)?!?, or something along those lines.

Anyway to cut a long story short, it kept going wrong.

If I find the solution some time i'll email it to you if you want, my email is jgreen_188{a.t} ({a.t} = @).
Send me a email so I know your e-mail address.

Eddie ShipmanAll-around developerCommented:
I took the code on the site you just mentioned and modified it to work with any form AND without using the stupid ExecuteScript function.

I tested this on a login for to an InvisionBoard that I maintain. This will work with any form that you have defined correctly in the
parameters. MAKE SURE you even include the hidden form variables, I had one and one radio and one check that I didn't care about.
You can not set the "value" for a radio or check, you have to use the Checked property. So this could be further modified to check for
radio and check types and set the checked property based upon the passed value.

This will not work, however, when you don't have a submit button. This is a case when you have an image that acts as a submit but calls
form.submit in it's onClick method. I am working on a modification to handle this as well as radio/checkboxes now

function FormSubmit(AFormTitle: String; AFields: Array of string; AFieldValues: array of string): Boolean;
  ShellWindow: IShellWindows;
  WB: IWebbrowser2;
  spDisp: IDispatch;
  IDoc1: IHTMLDocument2;
  Document: Variant;
  k, m: Integer;
  ovElements: OleVariant;
  i: Integer;
  IEFieldsCounter: Integer;
  btnElement: Integer;
  ShellWindow := CoShellWindows.Create;
  // get the running instance of Internet Explorer
  for k := 0 to ShellWindow.Count do
    spDisp := ShellWindow.Item(k);
    if spDisp = nil then Continue;
    // QueryInterface determines if an interface can be used with an object
    spDisp.QueryInterface(iWebBrowser2, WB);
    if WB <> nil then
      WB.Document.QueryInterface(IHTMLDocument2, iDoc1);
      if iDoc1 <> nil then
        WB := ShellWindow.Item(k) as IWebbrowser2;
        Document := WB.Document;
        // if correct document...
        if Pos(AFormTitle, Document.Title) <> 0 then
          // count forms on document and iterate through its forms
          IEFieldsCounter := 0;
          for m := 0 to Document.forms.Length - 1 do
            ovElements := Document.forms.Item(m).elements;

            // iterate through elements
            for i := 0 to ovElements.Length -1 do
              // if input fields found, try to fill them out
                if (UpperCase(ovElements.item(i).type) = 'SUBMIT') then
                    btnElement := i;
                if (LowerCase(ovElements.item(i).name) = LowerCase(AFields[i])) then
                    ovElements.item(i).Value := AFieldValues[i];
                // failed...
            end; { for i...}
            if btnElement > -1 then
              btnElement := -1;
          end;  { for m }
        end; {if Pos(AFormTitle...}
      end;  { idoc <> nil }
    end; { wb <> nil }
  end;  { for k }

procedure TForm1.Button1Click(Sender: TObject);
  FormSubmit('Log In',                                                                               {FormTitle}
             ['referer', 'UserName', 'PassWord', 'CookieDate', 'Privacy', 'submit'], {AFields}
             ['', sUser, sPass, '', '', '']                                                                {AFieldValues}

But what about getting the value from a form.

The problem with getting the value from an IE instance form field with the code above ^ is that you don't know when the user has finished typing in a form so you have to constantly get the value of the form.

But when you put the code in a timer to repeatedly get the value the program uses up all 100% of the processer. Which can get a bit anoying
Eddie ShipmanAll-around developerCommented:
Another way would be to sink the OnNavigate2 event and examine the POST or GET vars. But you want to know what they are typing
in BEFORE the form is submitted, right?
yeah, soz i am being anoying :D
Eddie ShipmanAll-around developerCommented:
[quote]when you put the code in a timer to repeatedly get the value the program uses up all 100% of the processer[/quote]

Not if you place it in a separate thread.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.