Jump to content
Omnitica

Problems with _IEFormElementSetValue and javascript

Recommended Posts

Omnitica

Hello!

I'm new to the forums! Couldn't find any threads covering this issue. Sorry if I'm wrong.


I'm having problems changing the text/value of a input box. The particular box doesn't have a name or id, just: class="jq_hotkeys_enabled form-control".
This class appears multiple times throughout the source, so I don't think It's right to reference that object. 
See image 1.

However, I've managed to find a object with the name "ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper" which contains the value of the input box, and the id for the person in the dropdown/combobox left of it. (with "dummy-1" selected).
See image 2.

As you can see the value is 3982,4545     ( name , time )

But when I try to change the value of it by doing:

#include <IE.au3>

Local $oIE = _IEAttach(WinGetHandle("[CLASS:IEFrame]"),"embedded")
Local $oForm = _IEFormGetObjByName($oIE, "aspnetForm")
Local $oInput = _IEFormElementGetObjByName($oForm, "ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper")
_IEFormElementSetValue($oInput, "3982,1337")

The box doesn't get its new value. I  can see in the source that it's changed though.
See image 3.

 

However, if I do: 

#include <IE.au3>

Local $oIE = _IEAttach(WinGetHandle("[CLASS:IEFrame]"),"embedded")
Local $oForm = _IEFormGetObjByName($oIE, "aspnetForm")
Local $oInput = _IEFormElementGetObjByName($oForm, "ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper")
_IEFormElementSetValue($oInput, "3982,1337")

$oIE.document.parentwindow.execScript("theForm.submit()") ; But it needs to reload the page

The box gets its new value after the page reloads by the theForm.submit() function. 
This is a bit unfortunate as I want the changes to happen instantly like when I type in the box with the keyboard... or select in the combobox.

Maybe someone knows how I can do this? Looking forward to an answer! 
Thanks in advance.

 

Note: Unfortunately I can't provide with the real URL as it is constricted to employees in the company I work for, but let me know If I should provide anything else.

 

1.PNG

2.PNG

3.PNG

Share this post


Link to post
Share on other sites
Danp2

The site is likely using a Javscript framework, such as Node.js or React. These will obscure the code, use hidden objects, etc like you are seeing. This is probably going to be difficult for us to assist you with since the site is private.

First step would be to identify the framework being used.

  • Like 1

Share this post


Link to post
Share on other sites
Omnitica
18 minutes ago, Danp2 said:

The site is likely using a Javscript framework, such as Node.js or React. These will obscure the code, use hidden objects, etc like you are seeing. This is probably going to be difficult for us to assist you with since the site is private.

First step would be to identify the framework being used.

Thanks for the quick reply! 

Sent you a P.M

Share this post


Link to post
Share on other sites
Omnitica
21 minutes ago, Danp2 said:

There are jQuery events attached to the element. You will need to trigger the Change event via jQuery. I'll get back to you if I come up with a workable solution.

Thank you Danp2. I appreciate the effort.

Share this post


Link to post
Share on other sites
Danp2

This (possible) solution came from this prior discussion. I'm unable to get this page to render properly in IE. Therefore, I'm unable to test the following code and you will likely need to adjust or adapt it to fit your actual environment --

#include <ie.au3>

Local $oIE = _IEAttach(WinGetHandle("[CLASS:IEFrame]"),"embedded")
Local $oDocument = _IEDocGetObj($oIE)
Local $oWindow = $oDocument.ParentWindow

$oWindow.setTimeout("document.body.JSeval = eval; ", 0) ; a reference to the eval method

Sleep(2000) ; give a little time to the browser to create above variables within the javascript environment.

$JSeval = $oIE.Document.body.JSeval ; a reference to the eval javascript method from within AutoIt

$JSeval('$(".input-group .form-control:not(:first-child):not(:last-child)")[0] = 10')
$JSeval('$(".input-group .form-control:not(:first-child):not(:last-child)").change()')

 

Share this post


Link to post
Share on other sites
Omnitica
13 hours ago, Danp2 said:

This (possible) solution came from this prior discussion. I'm unable to get this page to render properly in IE. Therefore, I'm unable to test the following code and you will likely need to adjust or adapt it to fit your actual environment --

#include <ie.au3>

Local $oIE = _IEAttach(WinGetHandle("[CLASS:IEFrame]"),"embedded")
Local $oDocument = _IEDocGetObj($oIE)
Local $oWindow = $oDocument.ParentWindow

$oWindow.setTimeout("document.body.JSeval = eval; ", 0) ; a reference to the eval method

Sleep(2000) ; give a little time to the browser to create above variables within the javascript environment.

$JSeval = $oIE.Document.body.JSeval ; a reference to the eval javascript method from within AutoIt

$JSeval('$(".input-group .form-control:not(:first-child):not(:last-child)")[0] = 10')
$JSeval('$(".input-group .form-control:not(:first-child):not(:last-child)").change()')

 

Hey, thank you for your help. Again, much appreciated.

I'm guessing I need to add Local $oDocument = _IEDocGetObj($oIE)  to get a reference.

I'm having trouble understanding the java functions: 

$JSeval('$(".input-group .form-control:not(:first-child):not(:last-child)")[0] = 10')
is this the function that sets the value of the box?

 

$JSeval('$(".input-group .form-control:not(:first-child):not(:last-child)").change()')
And this is the function that trigger the change?

Share this post


Link to post
Share on other sites
Danp2

Yes, the first call sets the value of the input element. This could also be done with _IEFormElementSetValue if you can get a reference to the element. The second call triggers the change event for all matching elements.

Did you try running the code as posted? If so, what was the outcome?

Share this post


Link to post
Share on other sites
Omnitica
2 minutes ago, Danp2 said:

Yes, the first call sets the value of the input element. This could also be done with _IEFormElementSetValue if you can get a reference to the element. The second call triggers the change event for all matching elements.

Did you try running the code as posted? If so, what was the outcome?

I tried running the script, but no success . The value doesn't change. However I'm curious if the 
$JSeval('$(".input-group .form-control:not(:first-child):not(:last-child)")[0] = 10')
refers to the actual input box. As there are many boxes with the same class. Maybe I'm wrong.

Share this post


Link to post
Share on other sites
Danp2

You could try this yourself if you can open the page in a non-embedded IE. Hit F12 to open the developers tools. Then try entering the command

$(".input-group .form-control:not(:first-child):not(:last-child)")[0] = 10

from the console. If that doesn't work, then perhaps the page is rendering differently under IE (I used FF to come up with the CCS selector).

Share this post


Link to post
Share on other sites
Omnitica

$(".input-group .form-control:not(:first-child):not(:last-child)").change()

Strangely enough this sets the value of the

<input type="hidden" name="ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper" id="content_ctrl_ucServiceTime_rpServicetimes_edtHiddenResourceHelper_0" value="4448,6767">

to the value that is in the input box, which is 6767. Kind of opposite of what we're trying to do.

 

Also,

$(".input-group .form-control:not(:first-child):not(:last-child)")[0] = 10

Doesn't change the value for me, somehow. But I can still use  _IEFormElementSetValue which I know works.

Edited by Omnitica

Share this post


Link to post
Share on other sites
Danp2

Which element are you updating with IEFormElementSetValue? If you mean,

ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper

then that probably isn't the optimal solution and may not work as expected.

Try this one from the developer console --

$('.input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child)')[0].value=10

 

Share this post


Link to post
Share on other sites
Omnitica
7 minutes ago, Danp2 said:

Which element are you updating with IEFormElementSetValue? If you mean,

ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper

then that probably isn't the optimal solution and may not work as expected.

Try this one from the developer console --

$('.input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child)')[0].value=10

 

Yes! Now we're getting somewhere. The value changes. But now, how to change the first part of the value,  value="4448,6767">. Or rather the combobox that is before the inputbox.

Note: I was previously using the 

ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper

for  _IEFormElementSetValue 

Edited by Omnitica

Share this post


Link to post
Share on other sites
Danp2

Now try entering

$('.input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child)').change()

This should cause the change event to trigger, force the value to reflect properly as if you had typed it in manually.

What have you tried with the combobox?

Share this post


Link to post
Share on other sites
Omnitica
27 minutes ago, Danp2 said:

Now try entering

$('.input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child)').change()

This should cause the change event to trigger, force the value to reflect properly as if you had typed it in manually.

What have you tried with the combobox?

With this the:


<input type="hidden" name="ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper" id="content_ctrl_ucServiceTime_rpServicetimes_edtHiddenResourceHelper_0" value="4448,6767">

Changes accordingly whats was changed into the box. Great!

 

But now I'm looking for a way to change the option in the combobox, which is defined by  value="4448,6767">   (4448)
4448 is the id of a user.

I just used  _IEFormElementSetValue  on the  ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper.
And set the value to "4448,6767" But then I need to reload the page for the changes to happen.

A similar approach like the 

$('.input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child)')[0].value=10

perhaps.

Edited by Omnitica

Share this post


Link to post
Share on other sites
Danp2

Try the following and let me know if it works --

#include <ie.au3>

Local $oIE = _IEAttach("UR-000000")
Local $oDocument = _IEDocGetObj($oIE)
Local $oWindow = $oDocument.ParentWindow

$oWindow.setTimeout("document.body.JSeval = eval; ", 0) ; a reference to the eval method

Sleep(2000) ; give a little time to the browser to create above variables within the javascript environment.

$JSeval = $oIE.Document.body.JSeval ; a reference to the eval javascript method from within AutoIt

$oSelect = $JSeval('$(".bootstrap-select > select")[0]')
_IEFormElementOptionSelect($oSelect, "4673")

 

Share this post


Link to post
Share on other sites
Omnitica

Hmm, did not work to change in the actual combobox, but the value changes in

<input name="ctl00$content$ctrl$ucServiceTime$rpServicetimes$ctl00$edtHiddenResourceHelper" id="content_ctrl_ucServiceTime_rpServicetimes_edtHiddenResourceHelper_0" type="hidden" value="4673,5656">

 

Edited by Omnitica

Share this post


Link to post
Share on other sites
Omnitica

However, doing a

#include <ie.au3>

Local $oIE = _IEAttach("UR-000000")
Local $oDocument = _IEDocGetObj($oIE)
Local $oWindow = $oDocument.ParentWindow

$oWindow.setTimeout("document.body.JSeval = eval; ", 0) ; a reference to the eval method

Sleep(2000) ; give a little time to the browser to create above variables within the javascript environment.

$JSeval = $oIE.Document.body.JSeval ; a reference to the eval javascript method from within AutoIt

$oSelect = $JSeval('$(".bootstrap-select > select")[0]')
_IEFormElementOptionSelect($oSelect, "4673")
$JSeval('$(".bootstrap-select > select").change()')

solved it!

Share this post


Link to post
Share on other sites
Omnitica

Yes indeed.

 

Thank you so much for your effort Danp2, you really helped me out here :)

Now I can get back to finishing my script!

Have a good day / evening.

 

Cheers!

 

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

  • Similar Content

    • SkysLastChance
      By SkysLastChance
      I was wondering how I read data inside of a iframe. I would like to be able to click something inside a iframe. However, I can't even find the tag. 
      The id and name change all the time so I can't use those. 
      The code highlighted in blue is what I am trying to click. (second picture)
      Here is what I have tried.
      $target = "" $tags = $oIE.document.GetElementsByTagName("div") For $tag in $tags $class_value = $tag.GetAttribute("class") If string($class_value) = "s_92 altstyle s_93 s_94" Then $target = $tag ConsoleWrite("Tag Found " & $target.outerText&@CRLF) ExitLoop EndIf Next  

       
       

    • SkysLastChance
      By SkysLastChance
       
      WinActivate("MEDITECH - Internet Explorer") Sleep (500) $oIE = _IEAttach("MEDITECH") $oDiv1 = _IEGetObjById($oIE, "sysmenu-searchbarbutton") _IEAction($oDiv1, "click") I am just trying to click the little magnifying glass, next to the gear button with no luck. I was hoping someone might have an idea why this is not working?
       

    • SkysLastChance
      By SkysLastChance
      I am trying to type a name in patient summary search box. How should I go about doing this. I am clearly not doing it right. (Attached Picture of HTML code.)
      This is what I have tried. I assume this is not working because it is not a form? 
      WinActivate("MEDITECH - Internet Explorer")       Sleep (500)    $oIE = _IEAttach("MEDITECH")    $oForm = _IEFormGetObjByName($oIE, "systemMenu")    $oText = _IEFormElementGetObjByName($oForm, "sysmenu-searchbarinput") _IEFormElementSetValue($oText, "Hey! This works!")
    • aiter
      By aiter
      Just want to report a warning I get when using IE udf and running from F5 in scite

      -> IE.au3 T3.0-2 Warning from function internal function __IEIsObjType, Cannot register internal error handler, cannot trap COM errors (Use _IEErrorHandlerRegister() to register a user error handler)
      When I look at IE.au3 I see a comment that this function has been removed as there are no more fatal errors.
       
    • guinness
      By guinness
      Just trying out the latest version of AutoIt and thinking more functional
      #include <Array.au3> ; Example ; An example of filtering, mapping and reducing arrays, using a function reference. ; This is similiar to how it would be done in the likes of JavaScript ; i.e. more functional (declarative) than procedural (imperative) ; Filter example Local $aiFilteredBefore[] = [1, 2, 3, 50, 30, 40, 20, 30] Local $aiFilteredAfter = _ArrayFilter($aiFilteredBefore, GtrThan30) _ArrayDisplay($aiFilteredAfter, '_ArrayFilter::') ; Map example Local $aiMappedBefore[] = [1, 2, 3, 4, 5, 6, 7, 8, 9] Local $aiMappedAfter = _ArrayMap($aiMappedBefore, MultiplyByTwo) _ArrayDisplay($aiMappedAfter, '_ArrayMap::') ; Reduce example ; Sum all values in the array Local $aiReducedBefore[] = [1, 2, 3, 50, 30, 40, 20, 30] ConsoleWrite('_ArrayReduce:: ' & _ArrayReduce($aiReducedBefore, SumValues) & @CRLF) ; Passing an empty array, will return the initial value; otherwise, sets @error to 4 ; if no initial value is defined Local $aEmpty[] = [] ConsoleWrite('_ArrayReduce:: ' & _ArrayReduce($aEmpty, SumValues, 0) & @CRLF) ; Array callback functions (for the examples only) Func GtrThan30($iValue) Return $iValue > 30 EndFunc ;==>GtrThan30 Func MultiplyByTwo($iValue, $iIndex, $aiArray) ; Notice how the function is called with the optional arguments "index" and "original array" ConsoleWrite('Index:: ' & $iIndex & ', Array:: ' & _ArrayToString($aiArray) & @CRLF) Return $iValue * 2 EndFunc ;==>MultiplyByTwo Func SumValues($a, $b) Return $a + $b EndFunc ;==>SumValues ; Functions ; The callback function is invoked with fn(value, [index, [array]]) Func _ArrayFilter($avArray, $hFunc) If Not IsArray($avArray) Then ; Null is more appropriate than returning the likes of -1 or an empty array Return SetError(1, 0, Null) EndIf If Not IsFunc($hFunc) Then Return SetError(2, 0, Null) EndIf Local Const $iLength = UBound($avArray) Local $avFiltered[$iLength] If $iLength = 0 Then Return $avFiltered EndIf Local $iIndex = 0 For $i = 0 To $iLength - 1 Local $bIsFiltered = __ArrayCall($hFunc, 3, $avArray[$i], $i, $avArray) If @error Then Return SetError(@error, @extended, Null) ElseIf $bIsFiltered Then $avFiltered[$iIndex] = $avArray[$i] $iIndex += 1 EndIf Next ReDim $avFiltered[$iIndex] Return $avFiltered EndFunc ;==>_ArrayFilter ; The callback function is invoked with fn(value, [index, [array]]) Func _ArrayMap($avArray, $hFunc) If Not IsArray($avArray) Then ; Null is more appropriate than returning the likes of -1 or an empty array Return SetError(1, 0, Null) EndIf If Not IsFunc($hFunc) Then Return SetError(2, 0, Null) EndIf Local Const $iLength = UBound($avArray) Local $avMapped[$iLength] If $iLength = 0 Then Return $avMapped EndIf For $i = 0 To $iLength - 1 $avMapped[$i] = __ArrayCall($hFunc, 3, $avArray[$i], $i, $avArray) If @error Then Return SetError(@error, @extended, Null) EndIf Next Return $avMapped EndFunc ;==>_ArrayMap ; The callback function is invoked with fn(current, value, [index, [array]]) Func _ArrayReduce($avArray, $hFunc, $vInitial = Default) If Not IsArray($avArray) Then ; Null is more appropriate than returning the likes of -1 or an empty array Return SetError(1, 0, Null) EndIf If Not IsFunc($hFunc) Then Return SetError(2, 0, Null) EndIf Local $bHasInitial = @NumParams >= 3 Local $iLength = UBound($avArray) If $iLength = 0 Then If Not $bHasInitial Then Return SetError(4, 0, Null) EndIf Return $vInitial EndIf For $i = 0 To $iLength - 1 If $bHasInitial Then $vInitial = __ArrayCall($hFunc, 3, $vInitial, $avArray[$i], $i, $avArray) If @error Then Return SetError(@error, @extended, Null) EndIf Else $bHasInitial = True $vInitial = $avArray[$i] EndIf Next Return $vInitial EndFunc ;==>_ArrayReduce Func __ArrayCall($hFunc, $iError, $vArg1 = Default, $vArg2 = Default, $vArg3 = Default, $vArg4 = Default) Local Const $CALL_ERROR = 0xDEAD Local Const $CALL_EXTENDED = 0xBEEF Local $vRet = Call($hFunc, $vArg1) If @error = $CALL_ERROR And @extended = $CALL_EXTENDED Then $vRet = Call($hFunc, $vArg1, $vArg2) If @error = $CALL_ERROR And @extended = $CALL_EXTENDED Then $vRet = Call($hFunc, $vArg1, $vArg2, $vArg3) If @error = $CALL_ERROR And @extended = $CALL_EXTENDED Then $vRet = Call($hFunc, $vArg1, $vArg2, $vArg3, $vArg4) If @error = $CALL_ERROR And @extended = $CALL_EXTENDED Then ; The function exists, but there is no appropriate function signature Return SetError($iError, 0, Null) EndIf EndIf EndIf EndIf Return SetError(@error, @extended, $vRet) EndFunc ;==>__ArrayCall  
×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.