SaeidN Posted August 31, 2022 Share Posted August 31, 2022 Hi, I'm so confused. I have something like this in a website, and all the classes of the divs are the same. How to get the value of "Monthly charge" which is 87.80 and also "Taxes and fees" which is 15.13? and here's the source: Thanks Link to comment Share on other sites More sharing options...
Danyfirex Posted August 31, 2022 Share Posted August 31, 2022 Hello, Are you using WebDriver UDF? Saludos Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
SaeidN Posted August 31, 2022 Author Share Posted August 31, 2022 19 minutes ago, Danyfirex said: Hello, Are you using WebDriver UDF? Saludos No. I don't know what that is. Link to comment Share on other sites More sharing options...
Danyfirex Posted September 1, 2022 Share Posted September 1, 2022 So are you using InternetExplorer? Saludo Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
Danp2 Posted September 1, 2022 Share Posted September 1, 2022 @DanyfirexMy guess would be Chrome / IUIAutomation based upon his past posts. Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
Danyfirex Posted September 1, 2022 Share Posted September 1, 2022 Thanks @Danp2 @SaeidN It would be great you share part of your code and a sample html too so we can test and give you a solution. Saludos Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
SaeidN Posted September 1, 2022 Author Share Posted September 1, 2022 8 hours ago, Danyfirex said: So are you using InternetExplorer? Saludo Yes, I'm using IE.au3. Do you have a better suggestion? (maybe a UDF with more and easier-to-use features) Because people mostly use Chrome and Edge these days. I found a UDF here (with GUI) which is to find elements, and then use querySelector, but that didn't work. I'll send some part of html source code and parts of my code in 40 minutes. The thing that I get stuck is to find elements (like a second-child div with no or same class and id after the word "Taxes and Fees" for example) and use action on them (save them in array or excel or click on them). @Danp2 That chrome automation was a personal project for Discord windows app, which is actually based on Chromium, and that's so weird. Link to comment Share on other sites More sharing options...
Danp2 Posted September 1, 2022 Share Posted September 1, 2022 @SaeidNDid you try this one? If so, what xpath did you use? Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
SaeidN Posted September 1, 2022 Author Share Posted September 1, 2022 (edited) 2 hours ago, Danp2 said: @SaeidNDid you try this one? If so, what xpath did you use? No, I haven't. I took a look, but I don't know how to work with it. It is confusing without example. Here's a part of source code. (There are couple boxes in the source) expandcollapse popup<div class="box"> <div class="box-header"> <div class="title"> Account Summary </div> </div> <div class="box-content box-overflow-fix"> <div class="form-group"> <label class="col-xs-2 control-label">Previous Account Balance:</label> <div class="col-xs-1"> <div id="previous-account-balance" class="form-control-static currency"> 203.39 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Monthly Charges:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 87.80 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">One Time Charges:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Call Usage:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Hosted Fax Usage:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Directory Assistance:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Taxes and Fees:</label> <div class="col-xs-1"> <div id="taxes-fees" class="form-control-static currency"> 15.13 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Total New Charges - Due 8/30/2022:</label> <div class="col-xs-1"> <div id="total-new-charges" class="form-control-static currency"> 102.93 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Total Due:</label> <div class="col-xs-1"> <div id="total-due" class="form-control-static currency"> 306.32 </div> </div> </div> </div> </div> <br/> <div class="box"> <div class="box-header"> <div class="header"> Monthly Recurring Charges - 8/30/2022 To 9/29/2022 </div> </div> <div class="box-content box-overflow-fix"> <table class="table table-hover tooltips"> <thead> <tr> <th>QTY</th> <th>Item #</th> <th>Name</th> <th>Description</th> <th class="currency">Amount</th> <th class="currency">Ext. Amount</th> </tr> And a part of my code: $dom = "body > div:nth-of-type(3) > div > div > div:nth-of-type(3) > div > div > section > div > div > div > div:nth-of-type(3) > div:nth-of-type(2) > table > tbody > tr:nth-of-type(1) > td:nth-of-type(5)" $element = $oIE.document.QuerySelector($dom) ;$element = _IEquerySelectorAll($oIE, "div") ConsoleWrite($element) For $he In $element MsgBox(0,"",$element) Next Edited September 1, 2022 by SaeidN Link to comment Share on other sites More sharing options...
Solution Danyfirex Posted September 2, 2022 Solution Share Posted September 2, 2022 I think You can do it like this: Local $oCollection = _IETagNameGetCollection($oIE, "label") Local $oObj = Null For $oLabel In $oCollection If _IEPropertyGet($oLabel, "innerText") = "Monthly Charges:" Then $oObj = $oLabel.nextSibling.nextSibling ExitLoop EndIf Next MsgBox(0,"",_IEPropertyGet($oObj, "innerText")) Saludos Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
SaeidN Posted September 2, 2022 Author Share Posted September 2, 2022 18 hours ago, Danyfirex said: I think You can do it like this: Local $oCollection = _IETagNameGetCollection($oIE, "label") Local $oObj = Null For $oLabel In $oCollection If _IEPropertyGet($oLabel, "innerText") = "Monthly Charges:" Then $oObj = $oLabel.nextSibling.nextSibling ExitLoop EndIf Next MsgBox(0,"",_IEPropertyGet($oObj, "innerText")) Saludos This worked, Thanks. Do you have any better and easier way to open, login, navigate, and extract some elements to excel from a website? Link to comment Share on other sites More sharing options...
jdelaney Posted September 2, 2022 Share Posted September 2, 2022 You already have a solution, but using an xpath can be like this: $xpathMonthlyCharges = "//div/label[.='Monthly Charges:']/../div/div" expandcollapse popup#region SCITE_CallTipsForFunctions ;BGe_IEGetDOMObjByXPathWithAttributes($oIEObj, $sXPath, [$iMaxWait=2000]) Return array of objects on browser matching callers xpath #endregion SCITE_CallTipsForFunctions #include <ie.au3> #include <array.au3> #region GLOBALVariables Global $gbBGe_PerformConsoleWrites = False ; The XPath array to work with will be 2d, with the following Global Enum $giBGe_XPath_Dim2_sRawNode, _ $giBGe_XPath_Dim2_sNodeName, _ $giBGe_XPath_Dim2_bNodeIsRelative, _ $giBGe_XPath_Dim2_sRawNodeConstraints, _ $giBGe_XPath_Dim2_bIsConstrainted, _ $giBGe_XPath_Dim2_aNodeConstraints, _ $giBGe_XPath_Dim2_UBound ; $giBGe_XPath_Dim2_aNodeConstraints will contain a 2d, with the following Global Enum $giBGe_Constraint_Dim2_sNodeName, _ $giBGe_Constraint_Dim2_bIsAttribute, _ $giBGe_Constraint_Dim2_bIsSelf, _ $giBGe_Constraint_Dim2_sNodeValue, _ $giBGe_Constraint_Dim2_bIsContains, _ $giBGe_Constraint_Dim2_UBound ; Regexp to split xpath Global $gsBGe_RegExpNodeSplit = "(?U)(.*(?:['""].*['""].*){0,})(?:\/)" ; Split Xpath into nodes...split by / where it is part of x-path Global $gsBGe_RegExpNodeAndCondSplit = "([^\[\]]+)\[(.*)\]" ; Get node name and conditions...conditions can be empty Global $gsBGe_RegExpOrSplit = "(?i)(?U)(.*['""].*['""\)])(?:\sor\s)|.{1,}?" ; Split Or statements inside [] Global $gsBGe_RegExpAndSplit = "(?i)(?U)(.*['""].*['""\)])(?:\sand\s)|.{1,}?" ; Split And statements inside [] Global $gsBGe_RegExpSplitContains = "(?i)contains\s*\(\s*(.+)\s*,\s*['""](.+)['""]\s*\)" ; Split contains, remove spaces that are not needed Global $gsBGe_RegExpSplitNonContains = "(.*)\s*\=\s*['""](.*)['""]" ; Split constraint that is not a contains, remove spaces that are not needed #endregion GLOBALVariables #region SAMPLE $xpathMonthlyCharges = "//div/label[.='Monthly Charges:']/../div/div" ; Create/navigate to page $oIE = _IECreate("",True,True) If IsObj($oIE) Then ConsoleWrite("Able to _IECreate('')" & @CRLF) Else ConsoleWrite("UNable to _IECreate('')" & @CRLF) Exit 1 EndIf _IEBodyWriteHTML($oIE,'<div class="box-header"> <div class="title"> Account Summary </div> </div> <div class="box-content box-overflow-fix"> <div class="form-group"> <label class="col-xs-2 control-label">Previous Account Balance:</label> <div class="col-xs-1"> <div id="previous-account-balance" class="form-control-static currency"> 203.39 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Monthly Charges:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 87.80 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">One Time Charges:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Call Usage:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Hosted Fax Usage:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Directory Assistance:</label> <div class="col-xs-1"> <div class="form-control-static currency"> 0.00 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Taxes and Fees:</label> <div class="col-xs-1"> <div id="taxes-fees" class="form-control-static currency"> 5.13 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Total New Charges - Due 8/30/2022:</label> <div class="col-xs-1"> <div id="total-new-charges" class="form-control-static currency"> 02.93 </div> </div> </div> <div class="form-group"> <label class="col-xs-2 control-label">Total Due:</label> <div class="col-xs-1"> <div id="total-due" class="form-control-static currency"> 306.32 </div> </div> </div> </div> </div>') ; Get Forum Link $aForumLink = BGe_IEGetDOMObjByXPathWithAttributes($oIE,$xpathMonthlyCharges,0) For $i = 0 to UBound($aForumLink)-1 ConsoleWrite("text = " & $aForumLink[$i].innertext & @CRLF) Next _IEQuit($oIE) Exit #endregion SAMPLE #region ExternalFunctions Func BGe_IEGetDOMObjByXPathWithAttributes($oIEObject, $sXPath, $iMaxWait=2000) ; Get dom object by XPath If $gbBGe_PerformConsoleWrites Then ConsoleWrite("Start Function=[BGe_IEGetDOMObjByXPathWithAttributes] with $sXPath=[" & $sXPath & "]." & @CRLF) Local $aReturnObjects = "" Local $aSplitXpath = BGe_ParseXPath($sXPath) If Not IsArray($aSplitXpath) Then ConsoleWrite("BGe_IEGetDOMObjByXPathWithAttributes: Callers XPath/Node/Conditions not well formed=[" & $sXPath & "]" & @CRLF) Return SetError(1,0,False) EndIf Local $iTimer = TimerInit() Do $aReturnObjects = BGe_RecursiveGetObjWithAttributes($oIEObject,$aSplitXpath) Until TimerDiff($iTimer)>$iMaxWait Or IsArray($aReturnObjects) Return $aReturnObjects EndFunc ;==>BGe_IEGetDOMObjByXPathWithAttributes #endregion ExternalFunctions #region InternalFunctions Func BGe_RecursiveGetObjWithAttributes($oParent, $aCallersSplitXPath, $asHolder="", $Level=0) $asObjects = $asHolder Local $sNodeName = $aCallersSplitXPath[$Level][$giBGe_XPath_Dim2_sNodeName] Local $bNodeIsRelative = $aCallersSplitXPath[$Level][$giBGe_XPath_Dim2_bNodeIsRelative] ; true=relative false=absolute Local $bIsConstrainted = $aCallersSplitXPath[$Level][$giBGe_XPath_Dim2_bIsConstrainted] ; array[OR] of arrays[AND]; all constraints on the node Local $aNodeOrConstraints = $aCallersSplitXPath[$Level][$giBGe_XPath_Dim2_aNodeConstraints] ; array[OR] of arrays[AND]; all constraints on the node Local $aPossibleNodeMatch = "" If $gbBGe_PerformConsoleWrites Then ConsoleWrite("Start Function=[BGe_RecursiveGetObjWithAttributes] level=[" & $Level & "]: $sNodeName=[" & $sNodeName & "], $bNodeIsRelative=[" & $bNodeIsRelative & "] $bIsConstrainted=[" & $bIsConstrainted & "]."& @CRLF) If Not IsObj($oParent) Then Return $asObjects ; Get nodes that match If $bNodeIsRelative Then If $sNodeName = "*" Then $oPossibleNodes = _IETagNameAllGetCollection($oParent) Else $oPossibleNodes = _IETagNameGetCollection($oParent, $sNodeName) EndIf For $oPossibleNode In $oPossibleNodes If $oPossibleNode.NodeType == 1 Then ; only add nodes If IsArray($aPossibleNodeMatch) Then _ArrayAdd($aPossibleNodeMatch,$oPossibleNode) Else Local $aPossibleNodeMatch[1] = [$oPossibleNode] EndIf EndIf Next ElseIf $sNodeName = ".." Then $asObjects = BGe_RecursiveGetObjWithAttributes($oParent.parentNode, $aCallersSplitXPath, $asObjects, $Level + 1) Else $oPossibleNodes = $oParent.childnodes For $oPossibleNode In $oPossibleNodes If String($oPossibleNode.NodeName) = $sNodeName Or $sNodeName = "*" Then If IsArray($aPossibleNodeMatch) Then _ArrayAdd($aPossibleNodeMatch,$oPossibleNode) Else Local $aPossibleNodeMatch[1] = [$oPossibleNode] EndIf EndIf Next EndIf ; Loop through nodes against restraints If IsArray($aPossibleNodeMatch) Then For $iChild = 0 To UBound($aPossibleNodeMatch) - 1 Local $oChild = $aPossibleNodeMatch[$iChild] ; Find matching conditions, when necessary If $bIsConstrainted Then ; Loop through OR Conditions For $i = 0 To UBound($aNodeOrConstraints) - 1 Local $aNodeAndConstraints = $aNodeOrConstraints[$i] Local $bAndConditionsMet = True ; Loop through And Conditions, or conditions are outside of this loop, and will go if current and's are not met For $j = 0 To UBound($aNodeAndConstraints) - 1 ; Remove the @... Local $sConstraintName = StringReplace($aNodeAndConstraints[$j][$giBGe_Constraint_Dim2_sNodeName],"@","") Local $bConstraintIsAtt = $aNodeAndConstraints[$j][$giBGe_Constraint_Dim2_bIsAttribute] Local $bConstraintIsNode = $aNodeAndConstraints[$j][$giBGe_Constraint_Dim2_bIsSelf] Local $sConstraintValue = $aNodeAndConstraints[$j][$giBGe_Constraint_Dim2_sNodeValue] Local $bConstraintIsContains= $aNodeAndConstraints[$j][$giBGe_Constraint_Dim2_bIsContains] If $bConstraintIsNode Then If $bConstraintIsContains Then If Not StringInStr(String($oChild.innertext), $sConstraintValue) Then $bAndConditionsMet = False Else If String($oChild.innertext) <> $sConstraintValue Then $bAndConditionsMet = False EndIf ElseIf $bConstraintIsAtt Then Local $sAttributeValue = "" Switch $sConstraintName Case "class" $sAttributeValue = $oChild.className() Case "style" $sAttributeValue = $oChild.style.csstext Case "onclick" $sAttributeValue = $oChild.getAttributeNode($sConstraintName).value Case Else $sAttributeValue = $oChild.getAttribute($sConstraintName) EndSwitch If $bConstraintIsContains Then If Not StringInStr(String($sAttributeValue), $sConstraintValue) Then $bAndConditionsMet = False Else If String($sAttributeValue) <> $sConstraintValue Then $bAndConditionsMet = False EndIf Else ; failure EndIf ; Skip looping if a condition of the And array was not met If Not $bAndConditionsMet Then ExitLoop Next If $bAndConditionsMet Then ; If last level, add the object If $Level = UBound($aCallersSplitXPath) - 1 Then If Not IsArray($asObjects) Then Local $asObjects[1]=[$oChild] Else $bUnique = True ; Only add if not present in the array For $iObject = 0 To UBound($asObjects)-1 If $oChild = $asObjects[$iObject] Then $bUnique=False ExitLoop EndIf Next If $bUnique Then _ArrayAdd($asObjects, $oChild) EndIf Else $asObjects = BGe_RecursiveGetObjWithAttributes($oChild, $aCallersSplitXPath, $asObjects, $Level + 1) EndIf EndIf ; No need to loop additional or if already found one and If $bAndConditionsMet Then ExitLoop Next Else ; No constraints, match is implied If $Level = UBound($aCallersSplitXPath) - 1 Then ; Final xpath level, so add to final array If Not IsArray($asObjects) Then Local $asObjects[1]=[$oChild] Else Local $bUnique=True ; Only add if not present in the array For $iObject = 0 To UBound($asObjects)-1 If $oChild = $asObjects[$iObject] Then $bUnique=False ExitLoop EndIf Next If $bUnique Then _ArrayAdd($asObjects, $oChild) EndIf Else ; Continue Recurssion $asObjects = BGe_RecursiveGetObjWithAttributes($oChild, $aCallersSplitXPath, $asObjects, $Level + 1) EndIf EndIf Next EndIf Return $asObjects EndFunc ;==>BGe_RecursiveGetObjWithAttributes Func BGe_ParseXPath($sCallersXPath) ; RegExp require a trailing "/" $sCallersXPath &= "/" Local $aReturnParsedXPath=False ; Parse all the '/' outside of single, or double, quotes Local $aNodesWithQualifiers = StringRegExp($sCallersXPath,$gsBGe_RegExpNodeSplit,3) ; Loop through, and determine if the node is direct, or relative.../ vs // Local $iSlashCount = 0 For $i = 0 To UBound($aNodesWithQualifiers) - 1 If StringLen($aNodesWithQualifiers[$i])=0 Then $iSlashCount+=1 Else ; Add dimentions to the return array If Not IsArray($aReturnParsedXPath) Then Local $aReturnParsedXPath[1][$giBGe_XPath_Dim2_UBound] Else ReDim $aReturnParsedXPath[UBound($aReturnParsedXPath)+1][$giBGe_XPath_Dim2_UBound] EndIf $aReturnParsedXPath[UBound($aReturnParsedXPath)-1][$giBGe_XPath_Dim2_sRawNode] = $aNodesWithQualifiers[$i] ; Split current Node Local $aSplitNodeAndCond = StringRegExp($aNodesWithQualifiers[$i],$gsBGe_RegExpNodeAndCondSplit,3) If UBound($aSplitNodeAndCond) = 2 Then Local $sNodeName = $aSplitNodeAndCond[0] Local $sNodeConstraints = $aSplitNodeAndCond[1] $aNodeConstraints = BGe_ParseXPathConstraints($sNodeConstraints) If Not IsArray($aNodeConstraints) Then ConsoleWrite("ParseXPath: Callers XPath/Node/Conditions not well formed=[" & $aNodesWithQualifiers[$i] & "]" & @CRLF) Return SetError(1,1,False) EndIf ElseIf UBound($aSplitNodeAndCond) = 0 Then Local $sNodeName = $aNodesWithQualifiers[$i] Local $sNodeConstraints = "" Local $aNodeConstraints = "" Else ConsoleWrite("ParseXPath: Callers XPath/Node/Conditions not well formed=[" & $aNodesWithQualifiers[$i] & "]" & @CRLF) Return SetError(1,2,False) EndIf $aReturnParsedXPath[UBound($aReturnParsedXPath)-1][$giBGe_XPath_Dim2_sNodeName] = $sNodeName $aReturnParsedXPath[UBound($aReturnParsedXPath)-1][$giBGe_XPath_Dim2_sRawNodeConstraints] = $sNodeConstraints $aReturnParsedXPath[UBound($aReturnParsedXPath)-1][$giBGe_XPath_Dim2_bIsConstrainted] = (StringLen($sNodeConstraints)>0) $aReturnParsedXPath[UBound($aReturnParsedXPath)-1][$giBGe_XPath_Dim2_aNodeConstraints] = $aNodeConstraints $aReturnParsedXPath[UBound($aReturnParsedXPath)-1][$giBGe_XPath_Dim2_bNodeIsRelative] = $iSlashCount>1 $iSlashCount=1 EndIf Next Return $aReturnParsedXPath EndFunc Func BGe_ParseXPathConstraints($sCallersXPathConstraints) ; Returns array of arrays ; Array is split of all 'or' statements, and then includes array of 'and' statements, which are split out into 2d array of name/value/bcontains Local $aReturnParsedXPathConstraints[1] ; Will always return at least the first condition Local $aOrQualifiers = StringRegExp($sCallersXPathConstraints,$gsBGe_RegExpOrSplit,3) ReDim $aReturnParsedXPathConstraints[UBound($aOrQualifiers)] For $i = 0 To UBound($aReturnParsedXPathConstraints)-1 Local $aAndQualifiers = StringRegExp($aOrQualifiers[$i],$gsBGe_RegExpAndSplit,3) Local $aaSplitQualitfiers = BGe_ParseXPathConstraint($aAndQualifiers) If IsArray($aaSplitQualitfiers) Then $aReturnParsedXPathConstraints[$i]=$aaSplitQualitfiers Else ConsoleWrite("ParseXPathConstraints: Callers XPath/Node/Conditions not well formed=[" & $aOrQualifiers[$i] & "]" & @CRLF) Return SetError(1,3,False) EndIf Next Return $aReturnParsedXPathConstraints EndFunc Func BGe_ParseXPathConstraint($aCallersXPathConstraint) Local $aReturnParsedXPathConstraints[UBound($aCallersXPathConstraint)][$giBGe_Constraint_Dim2_UBound] For $i = 0 To UBound($aCallersXPathConstraint)-1 ; Remove leading and trailing spaces Local $sCurrentConstraint = StringStripWS($aCallersXPathConstraint[$i], 3) ; Check if $sCurrentConstraint makes use of contains() Local $aTempContains = StringRegExp($sCurrentConstraint,$gsBGe_RegExpSplitContains,3) Local $aTempNonContains = StringRegExp($sCurrentConstraint,$gsBGe_RegExpSplitNonContains,3) If UBound($aTempContains)=2 Then $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_bIsContains] = True $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_bIsSelf] = ($aTempContains[0]=".") $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_sNodeName] = $aTempContains[0] $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_bIsAttribute] = (StringLeft($aTempContains[0],1)="@") $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_sNodeValue] = $aTempContains[1] ElseIf UBound($aTempNonContains)=2 And Not StringInStr($aTempNonContains[0],"(") Then $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_bIsContains] = False $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_bIsSelf] = ($aTempNonContains[0]=".") $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_sNodeName] = $aTempNonContains[0] $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_bIsAttribute] = (StringLeft($aTempNonContains[0],1)="@") $aReturnParsedXPathConstraints[$i][$giBGe_Constraint_Dim2_sNodeValue] = $aTempNonContains[1] Else ConsoleWrite("ParseXPathConstraint: Callers XPath/Node/Conditions not well formed=[" & $aCallersXPathConstraint[$i] & "]" & @CRLF) Return SetError(1,4,False) EndIf Next Return $aReturnParsedXPathConstraints EndFunc #endregion InternalFunctions consoleoutput: text = 87.80 Danyfirex 1 IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window. Link to comment Share on other sites More sharing options...
SaeidN Posted September 3, 2022 Author Share Posted September 3, 2022 Thanks, appreciate it. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now