On the previous pages of this chapter, we explained how attribute weights influence the generation of RanoreXPath expressions and showed you where in Ranorex Studio you can change attribute weights. On this page, we’ll now use this information to solve a more complex issue in test automation: robustly identifying dynamic UI elements.
For this purpose, we will adjust attribute weights in a weight rule and then apply this rule using a rule condition. The Ranorex Studio Demo Application will serve as the AUT for this example.
Start Ranorex Studio Demo App and Spy
If you don’t already have the Demo App on your computer, you can download it here and unpack it to a folder of your choice.
-
Start the Demo App and click the tab Dynamic IDs.
-
Click Show image with dynamic ID.
Issues when using dynamic IDs for identification
Let’s look at what issues come up when using a dynamic ID to identify a UI element. To illustrate this, we track the image two times:
-
If the image isn’t already visible, click Show image with dynamic ID.
-
In Ranorex Spy, click Track and track the image in the Demo App. Note the generated RanoreXPath expression.
-
In the Demo App, hide the image again.
-
Show the image once more.
-
Track the image again and note the generated RanoreXPath expression.
Hiding and displaying the image generates a new ID for it each time. When tracking the same image before and after redisplaying it, two different RanoreXPath expressions are therefore generated. They use different values for the attribute ControlName.
-
RanoreXPath expression when displaying the image the first time.
-
RanoreXPath expression when displaying the image the second time.
-
Prefix img_
-
Randomly and dynamically generated alphanumerical string
Aside from being harder to read, RanoreXPath expressions containing such dynamic IDs also prevent robust identification and therefore automated testing of the referenced UI elements. To solve this issue without having to manually edit RanoreXPath expressions for dynamic UI elements every time, we need to change attribute weights and implement them with a weight rule.
Create a new weight rule
To get a robust RanoreXPath expression without a dynamic ID in it, we need to create a new weight rule with adjusted attribute weights. This way, Ranorex Studio will avoid the dynamic attribute and use a different, more robust one to identify the UI element.
In our case, the automatically chosen attribute ControlName belongs to the Control group of the technology-specific capability WinForms.
-
ControlName’s value is the dynamic ID. The attribute also has the highest weight at 150. Therefore, Ranorex Studio uses it in generating the RanoreXPath expression.
-
The attribute ControlTypeName has the stable value PictureBox and could therefore be used instead of ControlName. However, its weight is lower, so that’s where we need to make an adjustment.
We will now use a weight rule to tell Ranorex Studio to use the attribute ControlTypeName instead of ControlName when generating the RanoreXPath expression. To define this new rule, open the configuration dialog for attribute weights (see ⇢ Attribute weights) and:
-
In the configuration dialog, click Add.
-
Enter a name.
-
Select the capability that contains the attribute whose weight you want to change. In our case, this is Control.
-
Select the attribute whose weight you want to change. In our case, this is ControlName.
-
Set the new weight value. Reduce ControlName’s weight to 99. This causes Ranorex Studio to ignore it for RanoreXPath generation and use whichever other attribute has the highest weight. In our case, this will be ControlTypeName.
-
Click OK or Apply.
Test the new weight rule
Let’s now check whether the weight rule works as intended. To test the new weight rule:
-
Start the Demo App.
-
Click the tab Dynamic IDs.
-
Click Show image with dynamic ID.
-
In Ranorex Spy, click Track and track the image.
-
The generated RanoreXPath shows that Ranorex Studio used the attribute ControlTypeName instead of ControlName.
-
The overview shows that the dynamic ID is still the value for the attribute ControlName. However, this attribute now weights 99 and is therefore ignored by Ranorex Studio for RanoreXPath generation.
The RanoreXPath expression is now robust against changes in the dynamic ID. However, our weight rule applies to all WinForm UI elements, so the attribute ControlName won’t be used in any of them for identification. This could be a disadvantage when trying to identify a UI element where ControlName would be a robust attribute. To solve this, we need to apply a weight rule condition.
Create a rule condition
To prevent our rule from being applied to all WinForms UI elements, we need to define a rule condition that restricts the rule’s use to the cases where we want it applied.
To create a rule condition:
-
Open the configuration dialog for attribute weights.
-
Select the rule we created above.
-
Click Add condition.
-
This is where you set the source the condition refers to, i.e. the UI element that must have the defined attribute and the defined regex in its RanoreXPath expression. The options correspond to nodes in the UI element tree displayed in Ranorex Spy
- self: Ranorex Studio checks the UI element it is identifying (i.e. generating the RanoreXPath for) itself, i.e. the image of the cat in our case. Usually the best choice.
- parent: Ranorex Studio checks the UI element that is the parent of the UI element it is identifying (i.e. generating the RanoreXPath for), i.e. the container containing the image in our case.
- toplevel: Ranorex Studio checks the UI element that is the top-level ancestor of the UI element it is identifying (i.e. generating the RanoreXPath for), i.e. the application ( = Demo App) containing the image, in our case.
-
The attribute that must be present in the UI element’s generated RanoreXPath and contain the defined regex. In other words, the attribute with the dynamic value. All attributes of the capability selected in the rule definition above are available. In our case, ControlName is the correct attribute to choose, since this is the one with the dynamic ID.
-
The ⇢ regex that the attribute’s value will be checked against. If it matches, the condition is fulfilled. In our case, we only want the weight rule to apply if the RanoreXPath expression generated for a UI element contains the attribute ControlName with a value that consists only of the prefix img_ and an alphanumerical string.
Test the rule condition
Now let’s test whether the rule condition works as intended. To do so, we’ll first track a UI element with a dynamic ID, for example, the image in the Demo App. This will show whether the weight rule is applied correctly so that the generated RanoreXPath does not use the attribute ControlName.
Then we’ll track a UI element that doesn’t have a dynamic ID. This will show whether the weight rule is NOT applied so that the generated RanoreXPath does use the attribute ControlName.
Track the dynamic UI element
-
Start the Demo App.
-
Click the tab Dynamic IDs.
-
Click Show image with dynamic ID.
-
In Ranorex Spy, click Track and track the image.
-
The generated RanoreXPath shows that Ranorex Studio used the attribute ControlTypeName instead of ControlName.
-
Overview of all the attributes for this UI element.
The weight rule works and is applied correctly.
Track the non-dynamic UI element
-
Start the Demo App.
-
Click the tab Image-based automation.
-
Click Show image.
-
In Ranorex Spy, click Track and track the image.
-
The generated RanoreXPath shows that Ranorex Studio used the attribute ControlName with the value TheCat.
-
Overview of all the attributes for this UI element.
As intended, the weight rule is not applied.