Jump to content
Sign in to follow this  
millerbryan10

Clicking an 'input type=file' Button

Recommended Posts

millerbryan10

Hello everyone...

As a last measure resort to my issue, I have signed up for these forums based on the great answers provided by the contributers when I get stuck using AutoIT. However, I am currently stuck on the following issue...

I am trying to click a button on an IE page which is a file input type. The script below shows how I find the button on the page, move to it, and click it.

$OCLECMDID_OPTICAL_ZOOM = 63
    $OCLECMDID_CONTPROMPTUSER = 2
    $oIE.execWB($OCLECMDID_OPTICAL_ZOOM, $OCLECMDID_CONTPROMPTUSER, 100)
    $oControl = _IEGetObjByName($oIE, "uploadFile")
    $MouseX = _IEPropertyGet ($oControl, "screenx") + _IEPropertyGet ($oControl, "width") - 10
    $MouseY = _IEPropertyGet ($oControl, "screeny") + _IEPropertyGet ($oControl, "height") / 2
    MouseMove ($MouseX, $MouseY)
    MouseClick ("left")
    WinWait ("Choose File to Upload")
    $hChoose = WinGetHandle ("Choose File to Upload")
    ControlSetText ($hChoose, "", "Edit1", "P:\" & @USERNAME & "\" & $file)
    Sleep(4000)
    ControlClick ($hChoose, "", "Button1")

This will only work if the PC screen resolution is 1280 x 1024 or higher. I have tried the following code to no luck...

$OCLECMDID_OPTICAL_ZOOM = 63
    $OCLECMDID_CONTPROMPTUSER = 2
    $oIE.execWB($OCLECMDID_OPTICAL_ZOOM, $OCLECMDID_CONTPROMPTUSER, 100)
    $oIE.document.parentwindow.scroll(0, $oIE.document.body.scrollHeight)
    $oControl = _IEGetObjByName($oIE, "uploadFile")
    $MouseX = _IEPropertyGet ($oControl, "screenx") + _IEPropertyGet ($oControl, "width") - 10
    $MouseY = _IEPropertyGet ($oControl, "screeny") + _IEPropertyGet ($oControl, "height") / 2
    MouseMove ($MouseX, $MouseY)
    MouseClick ("left")
    WinWait ("Choose File to Upload")
    $hChoose = WinGetHandle ("Choose File to Upload")
    ControlSetText ($hChoose, "", "Edit1", "P:\" & @USERNAME & "\" & $file)
    Sleep(4000)
    ControlClick ($hChoose, "", "Button1")

My assumption was that it would recalculate where the element was after scrolling down, which was not true. Basically, the element is not visible to be clicked unless it is visible on the screen, without scrolling.

1. What I would like to do is to basically scroll down the page and still be able to find the element and click it

2. Changing resolutions is not an option as our users can set their own resolution sizes

3. I have it set to automatically change the zoom of teh webpage to 100% (as shown above)

4. Any help would be greatly appreciated. Thank you!

Bryan

Edited by millerbryan10

Share this post


Link to post
Share on other sites
mLipok

welcome to the forum

next time try to use advanced search

http://www.autoitscript.com/forum/index.php?app=core&module=search&search_in=forums

 

but the best answer you can found here:

more precisely it is here:


Signature beginning:   Wondering who uses AutoIT and what it can be used for ?
* GHAPI UDF - modest begining - comunication with GitHub REST API *
ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2018-03-17

Share this post


Link to post
Share on other sites
trancexx

^^ That's the code he uses.

@millerbryan10, consider differen approach. Usually stuff like this can be done in much more sensible non-IE fashion.

If you give the address of that page I, or smeone else, can show you how to do what you want using simple WinHttp code.


♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites
millerbryan10

@mlipok ... the code you sent me is the same that I was using. The issue is that the button which needs to be pressed is not visible when calling the function to click it based on it's position. Scrolling down to the object does not solve this either. I have also done the code below...

$oControl = _IEGetObjByName($oIE, "uploadFile")
_IEAction($oControl, "click")
WinWait("Choose File to Upload")
$hChoose = WinGetHandle("Choose File to Upload")
ControlSetText($hChoose, "", "Edit1", "P:\" & @USERNAME & "\" & $file)
Sleep(4000)
ControlClick($hChoose, "", "Button1")

While this does work (and I have seen this on other forums), it will click the button I need but pause the macro. I need it to click the macro and continue running the rest of the script. I have also tried what is below...

$oControl = _IEGetObjById($oIE, "uploadFile")
$iBrowserX = _IEPropertyGet($oControl, "browserx")
$iBrowserY = _IEPropertyGet($oControl, "browsery")
$iWidth = _IEPropertyGet($oControl, "width")
$iHeight = _IEPropertyGet($oControl, "height")
ControlClick(_IEPropertyGet($oIE, "hwnd"), "", "", "left", 1, $iBrowserX + $iWidth/2, $iBrowserY + $iHeight/2)
 

And this also gave me no luck. The webpage cannot be shared, but here is the string of code I am trying to interact with

<input type="file" name="uploadFile" size="60" tabindex="11" id="UploadFile1" />

Share this post


Link to post
Share on other sites
mLipok
I'm sorry you're both right.
 
I searched my own scripts.
I found the way once I solved the problem.

The possibility that it will be useful.

Once, in my case it helped something like this:

$oControl = _IEGetObjByName($oIE, "uploadFile")
_IEAction($oControl, 'focus')
Send("{SPACE}")

Then using WinWait waiting for the appropriate file selection window.


Signature beginning:   Wondering who uses AutoIT and what it can be used for ?
* GHAPI UDF - modest begining - comunication with GitHub REST API *
ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2018-03-17

Share this post


Link to post
Share on other sites
trancexx

The webpage cannot be shared, but here is the string of code I am trying to interact with

<input type="file" name="uploadFile" size="60" tabindex="11" id="UploadFile1" />
Form identifier is missing for precise code but it would be something like this:

#include "WinHttp.au3"

Global Const $sAddress = "http://some.server.com/folder_there/upload.asp" ; set correct address

; $file = ... ; from the rest of your code
Local $sHTML = UploadYourFile($sAddress, "P:\" & @USERNAME & "\" & $file)

ConsoleWrite("!ERROR = " & @error & @CRLf)
ConsoleWrite($sHTML & @CRLf)


Func UploadYourFile($sSiteAddress, $sFile)
    ; Disassemble the address
    Local $aAddress = _WinHttpCrackUrl($sSiteAddress)
    If @error Then Return SetError(-1, 0,"")

    Local $sHost = $aAddress[2]
    Local $sURL = $aAddress[6] & $aAddress[7]

    ; Initialize and get session handle
    Local $hOpen = _WinHttpOpen()

    #cs
    ; Login here if you have to
    ; This is usually done by filling some form so it's first _WinHttpSimpleFormFill()
    ; When logged-on cookies are "saved" to $hOpen
    Local $hLoginConnect = _WinHttpConnect($hOpen, $sHost)
    Local $sLoginResult = _WinHttpSimpleFormFill($hLoginConnect, "/the_URL_of_the_page_with_login_form.asp", _
            Default, _ ; you should set form id, name or index here if there are more than one forms on the login page
            "name:user_name", "You", _ ; for example
            "name:user_pwd", "YourPassword") ; for example
    ; Now you check @error to see if there were any problems and maybe inspect $sLoginResult to see if login was success
    ;...
    ; Close handles (don't close it if you will use it below)
    _WinHttpCloseHandle($hLoginConnect)
    ; $hOpen has cookies now
    #ce

    ; Get connection handle
    Local $hConnect = _WinHttpConnect($hOpen, $sHost)
    ; ...or use the one you have already if you executed login
    ; Local $hConnect = $hLoginConnect

    ; Fill the form
    Local $sHTML = _WinHttpSimpleFormFill($hConnect, $sURL, _
            Default, _ ; you should set form id, name or index here if there are more than one forms on the page
            "name:uploadFile", $sFile) ; <- filling only this (the rest is left default)

    Local $iErr = @error ; collect error

    ; Close handles
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)

    ; Return whatever the result
    Return SetError($iErr, 0, $sHTML)
EndFunc
edit: You can find WinHttp.au3 in examples forum. Edited by trancexx

♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites
millerbryan10

I resolved this issue - basically just ensured that the macro activated the IE window to ensure that it was active, and used "Send({"TAB"})" until I got to the field I needed and clicked Enter. Unfortunately, it looks as if there is no way for that button to be clicked without A. pausing the macro or B. using mouse-moves/clicks or keyboard sends.

If anyone can find a way to do it without keyboard sends or mouse-clicks that does not pause the macro (to quote Bill Lumbergh) "that would be great"

Edited by millerbryan10

Share this post


Link to post
Share on other sites
mLipok

with A you can use Adlib

but I think i try this but this dont work


Signature beginning:   Wondering who uses AutoIT and what it can be used for ?
* GHAPI UDF - modest begining - comunication with GitHub REST API *
ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2018-03-17

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  

×