Forum Discussion

salley's avatar
salley
Frequent Contributor
7 years ago

struggling to retrieve the first value found in a web table based on expected text

Hello,

i'm trying to verify value in webtable.it's dynamic and row index changes based on the inputs and type of the input. what i'm trying to do is capture the subtotal in cell. so i could get the total from the returned row and given columnindex. i've three subtotals section. i want to capture the row index from the first subtotal row but , my code always returns the last subtotal's row index. how can i capture the very first subtotal row index. any help would be highly appreciated. 

please see my below code

 

Set objTxt=MainPage.FindChild(Array("ObjectType","contentText"),Array("Cell","Sub Total"),100,true)
i=0
Do While Not (objTxt.Exists)And i<5
aqUtils.Delay(1000)
Set objTxt=MainPage.FindChild(Array("ObjectType","contentText"),Array("Cell","Sub Total),100,true)
i=i+1
Loop
If (objTxt.Exists) Then 'get the rowIndex
intRwIndex=aqObject.GetPropertyValue(objTxt,"RowIndex")
End IF

  • Hi,

     

    The best, fastest and most reliable solution is to talk to Development and ask them to provide unique and stable identifiers for all UI elements that your test code needs to work with.

    If this is not an option, then you still may try .FindAllChildren() and use the fact that the first subtotal section will be the last element of the returned array. This is not documented, but this is how .FindAllChildren() and .FindChild() work for more then decade since their implementation.

  • Hi,

     

    Not sure I got the question...
    The code seems to be fine...

    To get the first UI object just use the last found one:

    Set myObject = arrobjects(UBound(arrobjects)) ' last found object corresponds to the first UI one

    What I am missing?

     

     

  • salley's avatar
    salley
    7 years ago

    Thanks  a lot Alex,,, it works just fine,,,,,,,,,,,,,,,,,, i'm able to use capture the desired row and use that row to capture the amount. I really appreciate your help. Cheers!

  • tristaanogre's avatar
    tristaanogre
    Esteemed Contributor

    Move your if then logic inside your loop, do your "exists" check and, if it returns true, set your intRwIndex variable to the object row index (You can just do intRwIndex = objTxt.RowIndex, need need to GetPropertyValue), and then Exit the loop with an "Exit For" statement.  I'm not VERY good at VB Script, but this is how I think it should look:

    Set objTxt=MainPage.FindChild(Array("ObjectType","contentText"),Array("Cell","Sub Total"),100,true)
    i=0
    Do While Not (objTxt.Exists)And i<5
    aqUtils.Delay(1000)
    Set objTxt=MainPage.FindChild(Array("ObjectType","contentText"),Array("Cell","Sub Total),100,true)
    If (objTxt.Exists) Then 'get the rowIndex
    intRwIndex=objTxt.RowIndex
    Exit For
    End IF
    i=i+1
    Loop
    
    • salley's avatar
      salley
      Frequent Contributor

      thanks, but for some reason it starts from the buttom. and returns me the last rowindex number for the subtotal. is there a way to use index number or something

      Set objTxt=MainPage.FindChild(Array("ObjectType","contentText"),Array("Cell","Sub Total"),100,true)
      If (objTxt.Exists) Then 'get the rowIndex
      intRwIndex=objTxt.RowIndex
      msgbox intRwIndex
      End IF

      thanks

      • tristaanogre's avatar
        tristaanogre
        Esteemed Contributor

        That's FindChild.  The results from FindChild always start at the bottom.

        Suggestion... rather than doing your search from the MainPage... what if you mapped the Table itself (you're looking for Cells, there has to be a table.  You can Alias it down to simply MainPage.MyTable if you want to.

         

        With that, you could just do a for-loop through the table... that will do a top down.  Something like this (JavaScript, sorry... I'm not a VB guy).  The assumption below is that the column index for the "Sub-Total" is 2... you can change that to whatever you want.

         

        var myObject;
        var intRowIndex;
        for (var i; i < Aliases.MainPage.MyTable.RowCount -1, i++){
            if (Aliases.MainPage.MyTable.Cell(i, 2).contentText == 'Sub-Total'){
                myObject = Aliases.MainPage.myTable.Cell(i,2);
                intRowIndex = i;
                break;
            }
        
        }