Sign in to follow this  
Followers 0
Jury

javascript and _IEGetObjById

2 posts in this topic

A search of a web page can retrieve 1 to 20 (or more) links split into 20 per page I can go on to the second page by using:

If $x = 20 Then
Sleep(2000) ;two seconds
$oNext = _IEGetObjById($oIE, "pager1")
_IEAction($oNext, "click")
_IELoadWait($oIE)

where $x is the count of links on the previous page but how do I get to the next page given the next page object is in javascript as seen here:

<a id="pager1" href="javascript:__doPostBack('pager1','2')">2</a> -

<a id="pager1" href="javascript:__doPostBack('pager1','3')">3</a> -

<a id="pager1" href="javascript:__doPostBack('pager1','4')">4</a> -

<a id="pager1" href="javascript:__doPostBack('pager1','5')">5</a>

<a id="pager1" href="javascript:__doPostBack('pager1','2')">Next ></a>

is there a way of sending the doPostBack('pager1','3') information? BTW I just thought (I.m not at my own PC) can I get IEGetObjById by index so somthing like that?

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Looks like this isn't doable within the confines of Autoit - below is what I've ended up with. I'm curious though if the javascript had been given different id like pager1, pager2, pager3... or been given name="pager1" so I could have used index would it have worked? Oh and I know this only works on some PC & IE combinations - I only have the one PC.

#include <IE.au3>
#include <Array.au3>
#include <Date.au3>
Global $getdate[1]
$file = FileOpen(@MyDocumentsDir & "AIT_count.txt", 2)
If $file = -1 Then
MsgBox(0, "Error", "Unable to open file: " & "C:Documents and Settingsjoe.uryMy DocumentsAutoIt_codegetterprocessingAIT_count.txt")
Exit
EndIf
;get working days in date range
;yyyy/mm/dd
$daysearch = HowManyWorkDays("2003/05/21", "2003/05/23") ;2003/07/01
MsgBox(0, "Number of Weekdays", "There are " & $daysearch & " weekdays between the given dates")
For $i = 1 To $daysearch
;open and fill in the search form
$oIE = _IECreate("www.ait.gov.uk/Public/Searchunreported.aspx")
$oForm = _IEGetObjByName($oIE, "Form1")
_IEAction($oForm, "focus")
$oQuery = _IEFormElementGetObjByName($oForm, "txtDate")
_IEFormElementSetValue($oQuery, $getdate[$i] & @CRLF)
_IEFormElementCheckBoxSelect($oForm, 0, "", 1, "byIndex")
Sleep(2000)
$oNext = _IEGetObjById($oIE, "cmdSearch")
_IEAction($oNext, "click")
_IELoadWait($oIE)
;grab results into memory
$filewhole = _IEDocReadHTML($oIE)
;get required links for page 1
$oLinks = _IELinkGetCollection($oIE)
$iNumLinks = @extended
For $oLink In $oLinks
If StringInStr($oLink.href, ".doc") Then
;ConsoleWrite($oLink.href & @CRLF)
FileWrite($file, $oLink.href & " " & $getdate[$i] & @CRLF)
EndIf
Next
Sleep(2000)
;get page 2 if exists (the problem exists here because they've only given an Id (no name)
;and they've used the same Id to every instance of a new page.
If StringRegExp($filewhole, "('pager1','2')", 0) Then
$oNext = _IEGetObjById($oIE, "pager1")
_IEAction($oNext, "click")
_IELoadWait($oIE)
EndIf
;get required links for page 2
$oLinks = _IELinkGetCollection($oIE)
$iNumLinks = @extended
For $oLink In $oLinks
If StringInStr($oLink.href, ".doc") Then
;ConsoleWrite($oLink.href & @CRLF)
FileWrite($file, $oLink.href & " " & $getdate[$i] & @CRLF)
EndIf
Next
;guess I'll have to go to each date page over 2 long and do it manually so I'll get that information:
If StringRegExp($filewhole, "('pager1','9')", 0) Then
FileWrite($file, $getdate[$i] & " has 9 pages" & @CRLF)
ElseIf StringRegExp($filewhole, "('pager1','8')", 0) Then
FileWrite($file, $getdate[$i] & " has 8 pages" & @CRLF)
ElseIf StringRegExp($filewhole, "('pager1','7')", 0) Then
FileWrite($file, $getdate[$i] & " has 7 pages" & @CRLF)
ElseIf StringRegExp($filewhole, "('pager1','6')", 0) Then
FileWrite($file, $getdate[$i] & " has 6 pages" & @CRLF)
ElseIf StringRegExp($filewhole, "('pager1','5')", 0) Then
FileWrite($file, $getdate[$i] & " has 5 pages" & @CRLF)
ElseIf StringRegExp($filewhole, "('pager1','4')", 0) Then
FileWrite($file, $getdate[$i] & " has 4 pages" & @CRLF)
ElseIf StringRegExp($filewhole, "('pager1','3')", 0) Then
FileWrite($file, $getdate[$i] & " has 3 pages" & @CRLF)
EndIf
Sleep(2000)
_IEQuit($oIE)
Next
FileClose($file)

;what a good function this is!
Func HowManyWorkDays($sStartDate, $sEndDate)
Dim $MyDate
Dim $MyTime
$myStartDate = $sStartDate
$myEndDate = $sEndDate
$countWeekDay = 0
$CountDays = _DateDiff("d", $myStartDate, $myEndDate)
For $inc = 0 To $CountDays
$TempDate = _DateAdd('D', $inc, $myStartDate)
_DateTimeSplit($TempDate, $MyDate, $MyTime)
$FileYear = $MyDate[1]
If $MyDate[2] < 10 Then
$FileMonth = "0" & $MyDate[2]
Else
$FileMonth = $MyDate[2]
EndIf
If $MyDate[3] < 10 Then
$FileDay = "0" & $MyDate[3]
Else
$FileDay = $MyDate[3]
EndIf
;Returns Day of the Week Range is 1 to 7 where 1=Sunday
$iWeekday = _DateToDayOfWeek($FileYear, $FileMonth, $FileDay)
If $iWeekday > 1 And $iWeekday < 7 Then
If StringLen($FileDay) = 2 Then
_ArrayAdd($getdate, $FileDay & '-' & $FileMonth & '-' & $FileYear)
EndIf
$countWeekDay = $countWeekDay + 1
EndIf
Next
Return $countWeekDay
EndFunc ;==>HowManyWorkDays
Edited by Jury

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

  • Similar Content

    • Patryk
      By Patryk
      Dear Colleagues,
      I have no idea how to refer to style.display in my loop. There is a button like: 
      <input name="ctl00$bodyPlaceholder$btnFecharProcessamento" class="button" id="bodyPlaceholder_btnFecharProcessamento" style="display: none;" onclick="FecharJanelaProcessamento();return false;" type="submit" value="Fechar"> I want it to be clicked as soon as button's style change from style="display: none;" to  style= ="display: inline-block;" 
      This is what I got, but it's not working...
      Func GetButtons() $oButtons = _IEGetObjByName($oForm,"ctl00$bodyPlaceholder$btnFecharProcessamento",-1) $i = 0 While $i <> 1 For $oBtn In $oButtons If _IEFormElementGetValue($oBtn) = "Fechar" And $oBtn.document.style.display = "display: inline-block;" Then $i = 1 _IEAction($oBtn, "focus") _IEAction($oBtn, "click") ExitLoop EndIf Next WEnd EndFunc  
      I will really appreciate if you could help me with these loop!
    • Omnitica
      By 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.
       



    • milos83
      By milos83
      How can I check if element is focused in Firefox using FF.au3 UDF?
      This is my try:
      I have prepared a function that checks if the object is focused:
       
      _FFCmd('FFau3.isfocused=function isfocused(a){try{return (a === document.activeElement)}catch(e){return}}') $oElm = _FFXPath("//*[@id='someId']") ConsoleWrite(_FFIsFocused($oElm)) Func _FFIsFocused($sElement = "") Local $isFoc = _FFCmd("FFau3.isfocused(" & $sElement & ")") Return $isFoc EndFunc ;==>_FFIsFocused Now, the javascript part is tested and it does return successfully.
      After a lot of try/fails I inserted an alert box in order to display the object being compared.
      Here is what I got
       
      The focused object is: [object XULElement]
      The object that I send for comparing is [object HTMLInputElement]
      Why is that?
       
       
    • SkysLastChance
      By SkysLastChance
      I am not sure on how to grab the innertext I want. Is there a way I can just grab the second line, or is there a better way to do it all together? 
      #include <IE.au3> $oIE = _IEAttach("Form Details") $oDiv = _IEGetObjById($oIE, "Col3") ;Phone MsgBox (0,"Oops",$oDiv.outertext) When I use this code I get

       


       
      html.au3
    • Chimp
      By Chimp
      Hi all.
      I'm playing a bit with the ScriptControl object using as base this example by @genius257.
      here is a very simple try, ... but it fails. what I'm doing wrong?
      Local $oSC = ObjCreate("ScriptControl") $oSC.Language = "JScript" $oSC.ExecuteStatement('alert("I am a javascript alert box!");') MsgBox(0,'AutoIt','Pause') Thanks