Sign in to follow this  
Followers 0
twostars

ControlSend() not working as expected?

2 posts in this topic

#1 ·  Posted (edited)

First of all, hi guys, I've been using AutoIt on and off for various projects for a while now, never got around to registering here.. so now I have!

Moving onto the main point of the thread: ControlSend().

The script I was working on, basically logs into a website, navigates to the form page, then fills out an application form with values from an INI.

Pretty simple really, however there's one field I've never had to deal with before: an FILE input element. (<input type="file" />).

So of course, I attempt to set it with the usual _IEFormElementSetValue(), thinking it would be no different to a text field.. and receive the "securuty" error.

Check out the "help", find out why, and implement an alternative.

; Get IE's hwnd property
    $hIE = _IEPropertyGet( $oIE, "hwnd" );
    
; Put together the filename
    $filename = $folder & $name & ".pdf";

; Send the text to the filename field
    ControlSend( $hIE, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", $filename, 1 );

(PS: Excuse the ";" at the end of each line, it is just a habit that I don't want to break with over-use of AutoIt).

All good, right? Wrong.

This decides to send the text "hit and miss" style.

For example, the filename: C:\Directory\filename.pdf

First attempt may send: C:\Diretory\filename.pdf

Second attempt may send: C:\irectory\filename.pdf

Third attempt may send: C:Directory\fename.pdf

Point being, it randomly misses characters.

So I try setting the key delay slower with Opt(), however this only achieves it outputting slower, there is no change in the hit & miss results. Sleep() in between? Still nothing, as it's in ControlSend().

I tried this to see how many times it did hit and miss until it got it:

$i = 0;
    While _IEFormElementGetValue( $oFilename ) <> $filename 
        ControlSend( $hIE, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "^a{DEL}" );
        ControlSend( $hIE, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", $filename, 1 );
        $i = $i + 1;
    WEnd

    MsgBox( 0, "Result", "Took " & $i & " attempts to get it correct." );

The results were shocking -- took AutoIt 18 times to get it all in one piece, and even that number I cannot count on.

However, if I focus the control and Send() to it, it appears all in one piece, the first time.

This isn't a perfect method though, this counts on the window being visible -- which for my case is fine, however for other cases (and for this case in future) requiring it to be visible is not an option.

Is it possible I am doing something wrong here, or is this a bug with ControlSend().

Thanks,

twostars.

Edited by twostars

Share this post


Link to post
Share on other sites



From helpfile at _IEFormElementSetValue()

Note: You cannot use _IEFormElementSetValue to set the value of an INPUT TYPE=FILE element. Browser security restrictions prevent this element from being scripted. See the example below for a workaround.

; *******************************************************
; Example 5 - Set the value of an INPUT TYPE=FILE element
;               Same as previous example, but with invisible window
;               (security restrictions prevent using _IEFormElementSetValue)
; *******************************************************
;
#include <IE.au3>

$oIE = _IE_Example("form")

; Hide the browser window to demonstrate sending text to invisible window
_IEAction($oIE, "invisible")

$oForm = _IEFormGetObjByName($oIE, "ExampleForm")
$oInputFile = _IEFormElementGetObjByName($oForm, "fileExample")

; Assign input focus to the field and then send the text string
_IEAction($oInputFile, "focus")
$hIE = _IEPropertyGet($oIE, "hwnd")
ControlSend($hIE, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "C:\myfile.txt")

MsgBox(0, "Success", "Value set to C:\myfile.txt")
_IEAction($oIE, "visible")

Important is

_IEAction($oInputFile, "focus")

From your description I think something may (javascript?) steal focus from your file input type field for a small piece of time.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0