Skip to content

Commit 737b8eb

Browse files
authored
Merge pull request #472 from TESTARtool/develop_webdriver
Add aria properties to WdTags
2 parents 7f29179 + 2fc7816 commit 737b8eb

8 files changed

Lines changed: 429 additions & 7 deletions

File tree

CHANGELOG

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#TESTAR v2.8.3 (11-Mar-2026)
2+
- Add aria properties to WdTags
3+
4+
15
#TESTAR v2.8.2 (10-Mar-2026)
26
- Fix ignoring ValuePattern tag for UIAEdit widgets
37
- Remove unused comments and classes

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.8.2
1+
2.8.3

testar/src/org/testar/monkey/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464

6565
public class Main {
6666

67-
public static final String TESTAR_VERSION = "v2.8.2 (10-Mar-2026)";
67+
public static final String TESTAR_VERSION = "v2.8.3 (11-Mar-2026)";
6868

6969
//public static final String TESTAR_DIR_PROPERTY = "DIRNAME"; //Use the OS environment to obtain TESTAR directory
7070
public static final String SETTINGS_FILE = "test.settings";

webdriver/src/org/testar/monkey/alayer/webdriver/WdElement.java

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,13 @@ public class WdElement extends TaggableBase implements Serializable {
100100
public long naturalWidth, naturalHeight;
101101
public long displayedWidth, displayedHeight;
102102

103+
// Web aria properties
104+
public String ariaLabel, ariaLabelledBy, ariaDescribedBy, ariaRole, ariaChecked, ariaInvalid;
105+
public String ariaCurrent, ariaHasPopup, ariaControls, ariaLive;
106+
public String ariaValueNow, ariaValueMin, ariaValueMax, ariaValueText;
107+
public Boolean ariaDisabled, ariaHidden, ariaExpanded, ariaPressed, ariaSelected;
108+
public Boolean ariaRequired, ariaReadOnly, ariaBusy, ariaModal;
109+
103110
public transient RemoteWebElement remoteWebElement; // Reference to the remote Web Element
104111

105112
public transient Map<String, String> attributeMap;
@@ -152,6 +159,30 @@ public WdElement(Map<String, Object> packedElement, WdRootElement root, WdElemen
152159
visibility = (packedElement.get("visibility") == null) ? "" : (String) packedElement.get("visibility");
153160
xpath = (packedElement.get("xpath") == null) ? "" : (String) packedElement.get("xpath");
154161

162+
ariaLabel = getAttribute("aria-label");
163+
ariaLabelledBy = getAttribute("aria-labelledby");
164+
ariaDescribedBy = getAttribute("aria-describedby");
165+
ariaRole = getAttribute("role");
166+
ariaDisabled = parseBoolean(getAttribute("aria-disabled"));
167+
ariaHidden = parseBoolean(getAttribute("aria-hidden"));
168+
ariaExpanded = parseBoolean(getAttribute("aria-expanded"));
169+
ariaPressed = parseBoolean(getAttribute("aria-pressed"));
170+
ariaSelected = parseBoolean(getAttribute("aria-selected"));
171+
ariaChecked = getAttribute("aria-checked");
172+
ariaRequired = parseBoolean(getAttribute("aria-required"));
173+
ariaInvalid = getAttribute("aria-invalid");
174+
ariaReadOnly = parseBoolean(getAttribute("aria-readonly"));
175+
ariaCurrent = getAttribute("aria-current");
176+
ariaHasPopup = getAttribute("aria-haspopup");
177+
ariaControls = getAttribute("aria-controls");
178+
ariaLive = getAttribute("aria-live");
179+
ariaBusy = parseBoolean(getAttribute("aria-busy"));
180+
ariaModal = parseBoolean(getAttribute("aria-modal"));
181+
ariaValueNow = getAttribute("aria-valuenow");
182+
ariaValueMin = getAttribute("aria-valuemin");
183+
ariaValueMax = getAttribute("aria-valuemax");
184+
ariaValueText = getAttribute("aria-valuetext");
185+
155186
try {
156187
maxLength = Integer.valueOf(attributeMap.getOrDefault("maxlength", "-1"));
157188
} catch (NumberFormatException e) {
@@ -245,11 +276,11 @@ public String getElementDescription() {
245276
else if (hasText(textContent)) {
246277
semanticDescription = normalizeDescription(textContent);
247278
}
248-
else if (hasText(getAttribute("aria-label"))) {
249-
semanticDescription = normalizeDescription(getAttribute("aria-label"));
279+
else if (hasText(ariaLabel)) {
280+
semanticDescription = normalizeDescription(ariaLabel);
250281
}
251-
else if (hasText(getAttribute("aria-labelledby"))) {
252-
semanticDescription = normalizeDescription(getAttribute("aria-labelledby"));
282+
else if (hasText(ariaLabelledBy)) {
283+
semanticDescription = normalizeDescription(ariaLabelledBy);
253284
}
254285
else if (hasText(placeholder)) {
255286
semanticDescription = normalizeDescription(placeholder);
@@ -299,6 +330,15 @@ private String getAttribute(String key) {
299330
return (attributeMap == null) ? "" : attributeMap.getOrDefault(key, "");
300331
}
301332

333+
private Boolean parseBoolean(String value) {
334+
if (value == null) return null;
335+
String normalized = value.trim().toLowerCase();
336+
if (normalized.isEmpty()) return null;
337+
if (normalized.equals("true")) return true;
338+
if (normalized.equals("false")) return false;
339+
return null;
340+
}
341+
302342
private void setName() {
303343
if (name == null || name.equals("null") || name.isEmpty()) {
304344
name = textContent;

webdriver/src/org/testar/monkey/alayer/webdriver/WdState.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,75 @@ else if (t.equals(WdTags.WebOuterHTML)) {
363363
else if (t.equals(WdTags.WebPlaceholder)) {
364364
ret = w.element.placeholder;
365365
}
366+
else if (t.equals(WdTags.WebAriaLabel)) {
367+
ret = w.element.ariaLabel;
368+
}
369+
else if (t.equals(WdTags.WebAriaLabelledBy)) {
370+
ret = w.element.ariaLabelledBy;
371+
}
372+
else if (t.equals(WdTags.WebAriaDescribedBy)) {
373+
ret = w.element.ariaDescribedBy;
374+
}
375+
else if (t.equals(WdTags.WebAriaRole)) {
376+
ret = w.element.ariaRole;
377+
}
378+
else if (t.equals(WdTags.WebAriaDisabled)) {
379+
ret = w.element.ariaDisabled;
380+
}
381+
else if (t.equals(WdTags.WebAriaHidden)) {
382+
ret = w.element.ariaHidden;
383+
}
384+
else if (t.equals(WdTags.WebAriaExpanded)) {
385+
ret = w.element.ariaExpanded;
386+
}
387+
else if (t.equals(WdTags.WebAriaPressed)) {
388+
ret = w.element.ariaPressed;
389+
}
390+
else if (t.equals(WdTags.WebAriaSelected)) {
391+
ret = w.element.ariaSelected;
392+
}
393+
else if (t.equals(WdTags.WebAriaChecked)) {
394+
ret = w.element.ariaChecked;
395+
}
396+
else if (t.equals(WdTags.WebAriaRequired)) {
397+
ret = w.element.ariaRequired;
398+
}
399+
else if (t.equals(WdTags.WebAriaInvalid)) {
400+
ret = w.element.ariaInvalid;
401+
}
402+
else if (t.equals(WdTags.WebAriaReadOnly)) {
403+
ret = w.element.ariaReadOnly;
404+
}
405+
else if (t.equals(WdTags.WebAriaCurrent)) {
406+
ret = w.element.ariaCurrent;
407+
}
408+
else if (t.equals(WdTags.WebAriaHasPopup)) {
409+
ret = w.element.ariaHasPopup;
410+
}
411+
else if (t.equals(WdTags.WebAriaControls)) {
412+
ret = w.element.ariaControls;
413+
}
414+
else if (t.equals(WdTags.WebAriaLive)) {
415+
ret = w.element.ariaLive;
416+
}
417+
else if (t.equals(WdTags.WebAriaBusy)) {
418+
ret = w.element.ariaBusy;
419+
}
420+
else if (t.equals(WdTags.WebAriaModal)) {
421+
ret = w.element.ariaModal;
422+
}
423+
else if (t.equals(WdTags.WebAriaValueNow)) {
424+
ret = w.element.ariaValueNow;
425+
}
426+
else if (t.equals(WdTags.WebAriaValueMin)) {
427+
ret = w.element.ariaValueMin;
428+
}
429+
else if (t.equals(WdTags.WebAriaValueMax)) {
430+
ret = w.element.ariaValueMax;
431+
}
432+
else if (t.equals(WdTags.WebAriaValueText)) {
433+
ret = w.element.ariaValueText;
434+
}
366435
else if (t.equals(WdTags.WebElementSelenium)) {
367436
ret = w.element.remoteWebElement;
368437
}

webdriver/src/org/testar/monkey/alayer/webdriver/enums/WdTags.java

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,121 @@ private WdTags() {
347347
*/
348348
public static final Tag<String> WebPlaceholder = from("WebPlaceholder", String.class);
349349

350+
/**
351+
* ARIA label text (aria-label).
352+
*/
353+
public static final Tag<String> WebAriaLabel = from("WebAriaLabel", String.class);
354+
355+
/**
356+
* ARIA labelled-by reference (aria-labelledby).
357+
*/
358+
public static final Tag<String> WebAriaLabelledBy = from("WebAriaLabelledBy", String.class);
359+
360+
/**
361+
* ARIA described-by reference (aria-describedby).
362+
*/
363+
public static final Tag<String> WebAriaDescribedBy = from("WebAriaDescribedBy", String.class);
364+
365+
/**
366+
* ARIA role (role attribute).
367+
*/
368+
public static final Tag<String> WebAriaRole = from("WebAriaRole", String.class);
369+
370+
/**
371+
* ARIA disabled state (aria-disabled).
372+
*/
373+
public static final Tag<Boolean> WebAriaDisabled = from("WebAriaDisabled", Boolean.class);
374+
375+
/**
376+
* ARIA hidden state (aria-hidden).
377+
*/
378+
public static final Tag<Boolean> WebAriaHidden = from("WebAriaHidden", Boolean.class);
379+
380+
/**
381+
* ARIA expanded state (aria-expanded).
382+
*/
383+
public static final Tag<Boolean> WebAriaExpanded = from("WebAriaExpanded", Boolean.class);
384+
385+
/**
386+
* ARIA pressed state (aria-pressed).
387+
*/
388+
public static final Tag<Boolean> WebAriaPressed = from("WebAriaPressed", Boolean.class);
389+
390+
/**
391+
* ARIA selected state (aria-selected).
392+
*/
393+
public static final Tag<Boolean> WebAriaSelected = from("WebAriaSelected", Boolean.class);
394+
395+
/**
396+
* ARIA checked state (aria-checked), including possible mixed values.
397+
*/
398+
public static final Tag<String> WebAriaChecked = from("WebAriaChecked", String.class);
399+
400+
/**
401+
* ARIA required state (aria-required).
402+
*/
403+
public static final Tag<Boolean> WebAriaRequired = from("WebAriaRequired", Boolean.class);
404+
405+
/**
406+
* ARIA invalid state (aria-invalid).
407+
*/
408+
public static final Tag<String> WebAriaInvalid = from("WebAriaInvalid", String.class);
409+
410+
/**
411+
* ARIA readonly state (aria-readonly).
412+
*/
413+
public static final Tag<Boolean> WebAriaReadOnly = from("WebAriaReadOnly", Boolean.class);
414+
415+
/**
416+
* ARIA current state (aria-current).
417+
*/
418+
public static final Tag<String> WebAriaCurrent = from("WebAriaCurrent", String.class);
419+
420+
/**
421+
* ARIA haspopup state (aria-haspopup).
422+
*/
423+
public static final Tag<String> WebAriaHasPopup = from("WebAriaHasPopup", String.class);
424+
425+
/**
426+
* ARIA controls reference (aria-controls).
427+
*/
428+
public static final Tag<String> WebAriaControls = from("WebAriaControls", String.class);
429+
430+
/**
431+
* ARIA live region setting (aria-live).
432+
*/
433+
public static final Tag<String> WebAriaLive = from("WebAriaLive", String.class);
434+
435+
/**
436+
* ARIA busy state (aria-busy).
437+
*/
438+
public static final Tag<Boolean> WebAriaBusy = from("WebAriaBusy", Boolean.class);
439+
440+
/**
441+
* ARIA modal state (aria-modal).
442+
*/
443+
public static final Tag<Boolean> WebAriaModal = from("WebAriaModal", Boolean.class);
444+
445+
/**
446+
* ARIA current numeric value (aria-valuenow).
447+
*/
448+
public static final Tag<String> WebAriaValueNow = from("WebAriaValueNow", String.class);
449+
450+
/**
451+
* ARIA minimum numeric value (aria-valuemin).
452+
*/
453+
public static final Tag<String> WebAriaValueMin = from("WebAriaValueMin", String.class);
454+
455+
/**
456+
* ARIA maximum numeric value (aria-valuemax).
457+
*/
458+
public static final Tag<String> WebAriaValueMax = from("WebAriaValueMax", String.class);
459+
460+
/**
461+
* ARIA textual value (aria-valuetext).
462+
*/
463+
public static final Tag<String> WebAriaValueText = from("WebAriaValueText", String.class);
464+
350465
/**
351466
* Represents the remote web element object obtained with Selenium framework
352467
*/

webdriver/test/org/testar/monkey/alayer/webdriver/TestWdElementDescription.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,30 @@ public void test_semantic_priority() {
3939
public void test_semantic_aria_label() {
4040
WdElement element = newElement();
4141
element.tagName = "input";
42-
element.attributeMap.put("aria-label", "Search Product");
42+
element.ariaLabel = "Search Product";
4343

4444
Assert.assertEquals("input_search_product", element.getElementDescription());
4545
}
4646

47+
@Test
48+
public void test_semantic_aria_labelledby() {
49+
WdElement element = newElement();
50+
element.tagName = "input";
51+
element.ariaLabelledBy = "Search Field";
52+
53+
Assert.assertEquals("input_search_field", element.getElementDescription());
54+
}
55+
56+
@Test
57+
public void test_semantic_priority_aria_label_over_aria_labelledby() {
58+
WdElement element = newElement();
59+
element.tagName = "input";
60+
element.ariaLabel = "Primary Label";
61+
element.ariaLabelledBy = "Secondary Label";
62+
63+
Assert.assertEquals("input_primary_label", element.getElementDescription());
64+
}
65+
4766
@Test
4867
public void test_fallback_to_id() {
4968
WdElement element = newElement();

0 commit comments

Comments
 (0)