Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- COMDOM(pwb, pGetby, pElemtext, pAction = "", pShowerrors = true, exitonfail := true) ;6/6/17 ----------------------------------------
- /* Function allow easy set manipulation of IE COM DOM elements with error checking with suppressible error dialogs.
- it is not all inclusive for DOM manipulation and concentrates mostly on Set functions for form elements
- In particular, it keeps me from re-learning more complex manipulations of things like selects/options
- Auto blurs (removes focus) after setting values allowing native form errorchecking, etc.
- Auto enables disabled controls, bypassing native JS blocking
- returns element object if error free which can be further manipulated (style, etc), or false if error
- EXAMPLES:
- COMDOM(wb, "id", "login", "srhamy")
- COMDOM(wb, "name[1]", "login", "srhamy")
- COMDOM(wb, "text[a], "Download", "click") ; assumes 1st match
- COMDOM(wb, "id", "Optionals", "check[2,3]")
- ARGUMENTS
- pWb : IE web browser COM object
- pGetby : method to conduct search for <elemtext>
- - id : default, same a getElementByID()
- - name : same as getElementsByName(), default to [0] or can specify array element like name[1]
- - class : same as getElementsByClass(), defaults to [0] or can specify array element like class[2]
- - tagname : same as getElementsByTagName(), defaults to [0] or specify array element like tagname[3]
- - query : same as querySelectorAll(), defaults to [0] or can specify array element like query[4]
- - form : same as form[x], defaults to [0] or can specify array element form[5]
- - text[tagname] : find HTML element by value/placeholder or HTML Text node by innerText, tagname
- defaults to * or better/faster to filter by element tag type examples: a,div,input, button
- pElemtext : identifier used for finding desired element
- pAction : action to perform on found element (exist,click,focus,select,submit,check/uncheck,placeholder) ; set is default
- - customtext : set element value to <customtext>
- - click : click element
- - focus : set focus to element
- - check/select : checks/selects option(s) for checkboxes, dropdowns, selects, and mult-selects
- - uncheck/unselect : unchecks/unselect option(s) in checkboxes, dropdowns, selects, and mult-selects
- - submit : submits form
- - exist : determine if control exists, aborts remainder of commands if not
- - placeholder : set placeholder text of element
- - enable : enable control (note this is done automatically before issing other commands)
- - disable : disable control
- - hide : hide element
- - show/unhide : show element
- showerrors:
- - TRUE : popup errors
- - FALSE : silent errors
- Examples
- Instead of wb.document.getElementByID("login") := "me"
- IECOMDOM(wb, "id", "login", "me") ; finds element by id "login" and with fills with "me"
- Instead of wb.document.getElementsByClassName("password")[2].Focus()
- IECOMDOM(wb, "class", "password[2]", "focus) ; finds elements by classname of "password" and focuses on 1st one (zero based index)
- Instead of a long set of commands...
- IECOMDOM(wb, "id", "location", "check[index1,index2]") ; finds input with id "location" and checks 2nd and 3rd option (zero based index)
- IECOMDOM(wb, "text['a']", "Download", "click") ; click link with HTML showing "Download"
- COMDOM(wb, "tag","*[17]","hide") - hides 17th element on page
- */
- {
- try
- {
- if (Not IsObject(pWb))
- throw Exception("pWb Object not defined.", -1)
- if (Not InStr(pWb.FullName, "iexplore.exe"))
- throw Exception("pWb Object in not IE Object.", -1)
- if (Not pGetby)
- throw Exception("pGetby argument cannot be blank.", -1)
- if (Not pElemtext)
- throw Exception("pElemText argument cannot be blank.", -1)
- if (Not pAction)
- throw Exception("Action argument cannot be blank.", -1)
- arrelemtext := StrSplit(pElemtext,"|",A_Space) , arrgetby :=StrSplit(pGetby,"|",A_Space), arraction :=StrSplit(pAction,"|",A_Space)
- if (arrelemtext.Length != arrgetby.Length and arrgetby.Length != 1)
- throw Exception("Unmatched array lengths for pGetby ( " . arrgetby.Length . ") and pElemtext (" . arrelemtext.Length . ") arguments `r`n`r`n pGetBy= """ . pGetBy . """`r`n`r`npElemtext=""" . pElemtext . """", -1)
- if (arrelemtext.Length != arraction.Length)
- throw Exception( "Unmatched array lengths for pElemtext (" . arrElemtext.Length . ") and pAction (" . arrAction.Length . ") arguments`r`n`r`npElemtext= """ . pElemtext . """`r`n`r`npAction=""" . pAction . """ arguments", -1)
- Loop, % arraction.MaxIndex()
- { ; SPLITS ====================================================================================
- ; Split GetBy[]
- StringLower, getby, % (arrgetby.MaxIndex() = 1) ? trim(arrgetby[1]) : trim(arrgetby[A_Index]) ; if 1 getby apply to all, and lowerase normalize/trim leading/trailing ws
- if selpos := RegExMatch(getby, "\[([a-zA-Z0-9 '" . """" . "]*)\]",elemsearchtype)
- {
- StringReplace,elemsearchtype, elemsearchtype1, "", , All ; remove double quotes
- StringReplace, elemsearchtype, elemsearchtype, ', , All ; remove single quotes
- getby := SubStr(getby,1,selpos-1) ; simplify getby w/o [??]
- }
- ; Split ElemText[]
- elemtext := trim(arrelemtext[A_Index])
- if selpos := RegExMatch(elemtext, "\[([0-9 '" . """" . "]*)\]",elemindex) ; optional enclosing ' or " s
- {
- StringReplace,elemindex, elemindex1, "", , All ; remove double quotes
- StringReplace, elemindex, elemindex, ', , All ; remove single quotes
- elemtext := SubStr(elemtext,1,selpos-1) ; simplify elemtext w/o [??]
- }
- else
- elemindex = 0
- ; Split Action[]
- action := trim(arraction[A_Index])
- if selpos := RegExMatch(action, "\[([a-zA-Z0-9, '" . """" . "]*)\]",sels)
- {
- arrsels := StrSplit(sels1,",", "'" . """") ; strips enclosing single and double quotes
- action := SubStr(action,1,selpos-1) ; simply action w/o [??]
- }
- if RegExMatch(action,"i)(click|focus|select|submit|check|uncheck|enable|disable|hide|unhide|show|exist|placeholder|value)") ; normalize to lower case & avoiding others (ie sent text)
- StringLower, action, action
- if (action = "exist")
- ComObjError(false)
- else
- ComObjError(pShowerrors)
- ; TARGET ========================================================
- if (getby = "name") ; same as getElementsByName, COMDOM(wb, "tag[0]","username","focus")
- target := pWb.document.getElementsByName(elemtext)[elemindex]
- else if (InStr(getby, "class")) ; same as getElementsByClassName, COMDOM(wb, "class","edit-new","focus")
- target := pWb.document.getElementsByClassName(elemtext)[elemindex]
- else if (InStr(getby, "tag") or getby = "index") ; same as GetElementsByTagName
- target := pWb.document.GetElementsByTagName(elemtext)[elemindex]
- else if (InStr(getby,"query")) ; same as get elements by querySelectorAll
- target := pWb.document.querySelectorAll(elemtext)[elemindex]
- else if (InStr(getby,"form"))
- target := pWb.document.forms[elemindex]
- else if (getby = "text") ; get element by HTML text, COMDOM(wb,"text['a'],"Download","click")
- {
- if elemsearchtype =
- elemsearchtype := "*"
- nodes := pWb.document.GetElementsByTagName(elemsearchtype)
- debugbytext := true
- if debugbytext
- out("Matches (type=" . elemsearchtype . ") = " . nodes.Length)
- Loop % nodes.Length
- {
- StringLower, nodetype, % nodes[A_Index-1].tagname
- if (nodetype = "input") {
- if (nodes[A_Index-1].value = trim(elemtext)) or (nodes[A_Index-1].placeholder = trim(elemtext) ) {
- if debugbytext
- out("(" . A_Index - 1 . ") " . Quote(nodes[A_Index-1].Value) . " (type=" . nodetype . ") ?= " . Quote(elemtext))
- target := nodes[A_Index-1]
- break
- }
- } else { ; examples buttons span p div
- if debugbytext
- out("(" . A_Index - 1 . ") " . Quote(nodes[A_Index-1].InnerText) . " (type=" . nodetype . ") ?= " . Quote(elemtext))
- if (nodes[A_Index-1].InnerText = trim(elemtext)) {
- target := nodes[A_Index-1]
- break
- }
- }
- }
- }
- else ; assume getby ID
- target := pWb.document.getElementByID(elemtext)
- if not target and action != "exist"
- throw Exception("Sent Item #" . A_Index . " - Target elem not found`r`n`r`nelemtext= """ . elemtext . """`r`nusing getby=""" . getby . """", -1)
- ;if target.tagname???? = "option" ; automatically backstep from option to select (user sent wrong one)
- ;target := target.parentNode
- if target.disabled := true
- target.disabled := false ; Force through disabled controls
- ; ACTION =======================================================
- if (action = "exist")
- if target
- continue
- else
- return "" ; ? false
- else if (action = "value")
- return target.value
- else if (action="click")
- {
- target.Click()
- IEWaitReady(pWb)
- }
- else if (action = "focus")
- target.Focus()
- else if (action = "enable" or action = "disable")
- target.enable := (action="enable") ? true : false
- else if (action = "hide" or action = "unhide" or action = "show")
- target.style.visibility := (action="hide") ? "hidden" : "visible"
- else if (action = "placeholder" and arrsels[1])
- target.placeholder := arrsels[1]
- else if (action = "select" and (target.type = "input" or or target.type = "email" or target.type = "password" or target.type = "textarea"))
- target.Select()
- else if (action = "submit")
- {
- target.Submit()
- IEWaitReady(pWb)
- }
- else if (action = "check" or action = "uncheck" or elemtext ="select" or elemtext ="unselect")
- { ; for select, multi-select, dropdowns and checkboxes
- if (target.type = "checkbox")
- target.checked := (action="check") ? true : false
- else if (InStr(target.type,select) or target.type = "dropdown")
- { ; handles single or multiple select + dropdowns
- Loop % arrsels.MaxIndex()
- {
- seloptvalue := arrsels[A_Index]
- Loop % target.Length
- {
- if (seloptvalue = "all" or target.options[A_Index-1].text = Trim(seloptvalue) or target.options[A_Index-1].value = Trim(seloptvalue) or A_Index - 1 = trim(seloptvalue))
- target[A_Index-1].selected := (action="check" or action = "select") ? true : false
- }
- }
- }
- }
- else
- target.Value := action
- if (action != "focus" and action != "exist") { ; force lose focus to trigger JS error checking/enabling etc.
- ComObjError(false)
- target.Blur()
- ComObjError(pShowerrors)
- }
- } ; Close Loop
- } catch e ; ERRORS ==============================================================================
- {
- target := ""
- errmsg := (e.What = ":= ") ? "Error in " . e.what . " Function - Line " . e.line : "Error - Line " . e.line . ", " . e.message . "`n", e.message . "`n" . e.extra
- LogErrors(true,false,pShowerrors,"COMDOM",errmsg)
- if (exitonfail)
- Exit
- }
- return target
- } ; End COMDOM ==================================================================================
Advertisement