Question:
I use TWebBrowser to automate some data retrieval from a web server. How can I simulate a click on SUBMIT in a form? If submitting the form would cause a GET request, then I could assemble a URL containing the parameters, but unfortunately the receiving script only handles POST requests - thus my question 'how can I create a POST request with TWebBrowser?'
Answer:
You need to create the proper header for your request, which means that the data is sent form encoded (application/x-www-form-urlencoded).
Your form data needs to be encoded with HTTPEncode() and stored in an array of variants.
The code below shows how to do this, you only need to modify the field names and values and of course the domain and path to the script. You need unit HTTPApp for function HTTPEncode().
uses
SHDocVw, Httpapp;
procedure TForm1.Button1Click(Sender: TObject);
var
EncodedDataString: string;
PostData: OleVariant;
Headers: OleVariant;
i: integer;
begin { TForm1.Button1Click }
// First, create a URL encoded string of the data
EncodedDataString := 'UserName='+HTTPEncode('MyName')+'&'+
'UserPass='+HTTPEncode('MyPassword');
// The PostData OleVariant needs to be an array of bytes
// as large as the string (minus the 0 terminator)
PostData := VarArrayCreate([0, length(EncodedDataString)-1], varByte);
// Now, move the Ordinal value of the character into the PostData array
for i := 1 to length(EncodedDataString) do
PostData[i-1] := ord(EncodedDataString[i]);
Headers := 'Content-type: application/x-www-form-urlencoded'#10#13;
// Parameters 2 and 3 are not used, thus EmptyParam is passed.
WebBrowser1.Navigate('http://www.mydomain.com/scripts/login.asp',
EmptyParam, EmptyParam, PostData, Headers);
end; { TForm1.Button1Click }