Added property ids and TabToElementByName
This commit is contained in:
Родитель
557396b4b0
Коммит
158e46c9b9
|
@ -51,6 +51,119 @@ namespace Microsoft.Edge.A11y
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void Initialize()
|
private void Initialize()
|
||||||
{
|
{
|
||||||
|
//PropertyIds
|
||||||
|
UI8Mapping.Add(30000, "RuntimeId");
|
||||||
|
UI8Mapping.Add(30001, "BoundingRectangle");
|
||||||
|
UI8Mapping.Add(30002, "ProcessId");
|
||||||
|
UI8Mapping.Add(30003, "ControlType");
|
||||||
|
UI8Mapping.Add(30004, "LocalizedControlType");
|
||||||
|
UI8Mapping.Add(30005, "Name");
|
||||||
|
UI8Mapping.Add(30006, "AcceleratorKey");
|
||||||
|
UI8Mapping.Add(30007, "AccessKey");
|
||||||
|
UI8Mapping.Add(30008, "HasKeyboardFocus");
|
||||||
|
UI8Mapping.Add(30009, "IsKeyboardFocusable");
|
||||||
|
UI8Mapping.Add(30010, "IsEnabled");
|
||||||
|
UI8Mapping.Add(30011, "AutomationId");
|
||||||
|
UI8Mapping.Add(30012, "ClassName");
|
||||||
|
UI8Mapping.Add(30013, "HelpText");
|
||||||
|
UI8Mapping.Add(30014, "ClickablePoint");
|
||||||
|
UI8Mapping.Add(30015, "Culture");
|
||||||
|
UI8Mapping.Add(30016, "IsControlElement");
|
||||||
|
UI8Mapping.Add(30017, "IsContentElement");
|
||||||
|
UI8Mapping.Add(30018, "LabeledBy");
|
||||||
|
UI8Mapping.Add(30019, "IsPassword");
|
||||||
|
UI8Mapping.Add(30020, "NativeWindowHandle");
|
||||||
|
UI8Mapping.Add(30021, "ItemType");
|
||||||
|
UI8Mapping.Add(30022, "IsOffscreen");
|
||||||
|
UI8Mapping.Add(30023, "Orientation");
|
||||||
|
UI8Mapping.Add(30024, "FrameworkId");
|
||||||
|
UI8Mapping.Add(30025, "IsRequiredForForm");
|
||||||
|
UI8Mapping.Add(30026, "ItemStatus");
|
||||||
|
UI8Mapping.Add(30027, "IsDockPatternAvailable");
|
||||||
|
UI8Mapping.Add(30028, "IsExpandCollapsePatternAvailable");
|
||||||
|
UI8Mapping.Add(30029, "IsGridItemPatternAvailable");
|
||||||
|
UI8Mapping.Add(30030, "IsGridPatternAvailable");
|
||||||
|
UI8Mapping.Add(30031, "IsInvokePatternAvailable");
|
||||||
|
UI8Mapping.Add(30032, "IsMultipleViewPatternAvailable");
|
||||||
|
UI8Mapping.Add(30033, "IsRangeValuePatternAvailable");
|
||||||
|
UI8Mapping.Add(30034, "IsScrollPatternAvailable");
|
||||||
|
UI8Mapping.Add(30035, "IsScrollItemPatternAvailable");
|
||||||
|
UI8Mapping.Add(30036, "IsSelectionItemPatternAvailable");
|
||||||
|
UI8Mapping.Add(30037, "IsSelectionPatternAvailable");
|
||||||
|
UI8Mapping.Add(30038, "IsTablePatternAvailable");
|
||||||
|
UI8Mapping.Add(30039, "IsTableItemPatternAvailable");
|
||||||
|
UI8Mapping.Add(30040, "IsTextPatternAvailable");
|
||||||
|
UI8Mapping.Add(30041, "IsTogglePatternAvailable");
|
||||||
|
UI8Mapping.Add(30042, "IsTransformPatternAvailable");
|
||||||
|
UI8Mapping.Add(30043, "IsValuePatternAvailable");
|
||||||
|
UI8Mapping.Add(30044, "IsWindowPatternAvailable");
|
||||||
|
UI8Mapping.Add(30045, "ValueValue");
|
||||||
|
UI8Mapping.Add(30046, "ValueIsReadOnly");
|
||||||
|
UI8Mapping.Add(30047, "RangeValueValue");
|
||||||
|
UI8Mapping.Add(30048, "RangeValueIsReadOnly");
|
||||||
|
UI8Mapping.Add(30049, "RangeValueMinimum");
|
||||||
|
UI8Mapping.Add(30050, "RangeValueMaximum");
|
||||||
|
UI8Mapping.Add(30051, "RangeValueLargeChange");
|
||||||
|
UI8Mapping.Add(30052, "RangeValueSmallChange");
|
||||||
|
UI8Mapping.Add(30053, "ScrollHorizontalScrollPercent");
|
||||||
|
UI8Mapping.Add(30054, "ScrollHorizontalViewSize");
|
||||||
|
UI8Mapping.Add(30055, "ScrollVerticalScrollPercent");
|
||||||
|
UI8Mapping.Add(30056, "ScrollVerticalViewSize");
|
||||||
|
UI8Mapping.Add(30057, "ScrollHorizontallyScrollable");
|
||||||
|
UI8Mapping.Add(30058, "ScrollVerticallyScrollable");
|
||||||
|
UI8Mapping.Add(30059, "SelectionSelection");
|
||||||
|
UI8Mapping.Add(30060, "SelectionCanSelectMultiple");
|
||||||
|
UI8Mapping.Add(30061, "SelectionIsSelectionRequired");
|
||||||
|
UI8Mapping.Add(30062, "GridRowCount");
|
||||||
|
UI8Mapping.Add(30063, "GridColumnCount");
|
||||||
|
UI8Mapping.Add(30064, "GridItemRow");
|
||||||
|
UI8Mapping.Add(30065, "GridItemColumn");
|
||||||
|
UI8Mapping.Add(30066, "GridItemRowSpan");
|
||||||
|
UI8Mapping.Add(30067, "GridItemColumnSpan");
|
||||||
|
UI8Mapping.Add(30068, "GridItemContainingGrid");
|
||||||
|
UI8Mapping.Add(30069, "DockDockPosition");
|
||||||
|
UI8Mapping.Add(30070, "ExpandCollapseExpandCollapseState");
|
||||||
|
UI8Mapping.Add(30071, "MultipleViewCurrentView");
|
||||||
|
UI8Mapping.Add(30072, "MultipleViewSupportedViews");
|
||||||
|
UI8Mapping.Add(30073, "WindowCanMaximize");
|
||||||
|
UI8Mapping.Add(30074, "WindowCanMinimize");
|
||||||
|
UI8Mapping.Add(30075, "WindowWindowVisualState");
|
||||||
|
UI8Mapping.Add(30076, "WindowWindowInteractionState");
|
||||||
|
UI8Mapping.Add(30077, "WindowIsModal");
|
||||||
|
UI8Mapping.Add(30078, "WindowIsTopmost");
|
||||||
|
UI8Mapping.Add(30079, "SelectionItemIsSelected");
|
||||||
|
UI8Mapping.Add(30080, "SelectionItemSelectionContainer");
|
||||||
|
UI8Mapping.Add(30081, "TableRowHeaders");
|
||||||
|
UI8Mapping.Add(30082, "TableColumnHeaders");
|
||||||
|
UI8Mapping.Add(30083, "TableRowOrColumnMajor");
|
||||||
|
UI8Mapping.Add(30084, "TableItemRowHeaderItems");
|
||||||
|
UI8Mapping.Add(30085, "TableItemColumnHeaderItems");
|
||||||
|
UI8Mapping.Add(30086, "ToggleToggleState");
|
||||||
|
UI8Mapping.Add(30087, "TransformCanMove");
|
||||||
|
UI8Mapping.Add(30088, "TransformCanResize");
|
||||||
|
UI8Mapping.Add(30089, "TransformCanRotate");
|
||||||
|
UI8Mapping.Add(30090, "IsLegacyIAccessiblePatternAvailable");
|
||||||
|
UI8Mapping.Add(30091, "LegacyIAccessibleChildId");
|
||||||
|
UI8Mapping.Add(30092, "LegacyIAccessibleName");
|
||||||
|
UI8Mapping.Add(30093, "LegacyIAccessibleValue");
|
||||||
|
UI8Mapping.Add(30094, "LegacyIAccessibleDescription");
|
||||||
|
UI8Mapping.Add(30095, "LegacyIAccessibleRole");
|
||||||
|
UI8Mapping.Add(30096, "LegacyIAccessibleState");
|
||||||
|
UI8Mapping.Add(30097, "LegacyIAccessibleHelp");
|
||||||
|
UI8Mapping.Add(30098, "LegacyIAccessibleKeyboardShortcut");
|
||||||
|
UI8Mapping.Add(30099, "LegacyIAccessibleSelection");
|
||||||
|
UI8Mapping.Add(30100, "LegacyIAccessibleDefaultAction");
|
||||||
|
UI8Mapping.Add(30101, "AriaRole");
|
||||||
|
UI8Mapping.Add(30102, "AriaProperties");
|
||||||
|
UI8Mapping.Add(30103, "IsDataValidForForm");
|
||||||
|
UI8Mapping.Add(30104, "ControllerFor");
|
||||||
|
UI8Mapping.Add(30105, "DescribedBy");
|
||||||
|
UI8Mapping.Add(30106, "FlowsTo");
|
||||||
|
UI8Mapping.Add(30107, "ProviderDescription");
|
||||||
|
UI8Mapping.Add(30108, "IsItemContainerPatternAvailable");
|
||||||
|
UI8Mapping.Add(30109, "IsVirtualizedItemPatternAvailable");
|
||||||
|
UI8Mapping.Add(30110, "IsSynchronizedInputPatternAvailable");
|
||||||
|
|
||||||
//TODO use UIA_ControlTypeIds
|
//TODO use UIA_ControlTypeIds
|
||||||
//AttributeIds
|
//AttributeIds
|
||||||
UI8Mapping.Add(40000, "AnimationStyle");
|
UI8Mapping.Add(40000, "AnimationStyle");
|
||||||
|
|
Двоичные данные
Inspect.exe
Двоичные данные
Inspect.exe
Двоичный файл не отображается.
42
TestData.cs
42
TestData.cs
|
@ -1129,6 +1129,37 @@ namespace Microsoft.Edge.A11y
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper method to tab until an element whose name contains the given string
|
||||||
|
/// reports that it has focus
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parent">The parent of the target element</param>
|
||||||
|
/// <param name="name">A string which the target element's name will contain</param>
|
||||||
|
/// <param name="tabId">The id to send tabs to</param>
|
||||||
|
/// <param name="driver">The WebDriver</param>
|
||||||
|
/// <returns>true if the element was found, false otherwise</returns>
|
||||||
|
private static bool TabToElementByName(IUIAutomationElement parent, string name, string tabId, DriverManager driver)
|
||||||
|
{
|
||||||
|
var tabs = 0;
|
||||||
|
var resets = 0;
|
||||||
|
var element = parent.GetAllDescendents(e => e.CurrentName.Contains(name)).First();
|
||||||
|
while (!(bool)element.GetCurrentPropertyValue(new ElementConverter().GetElementCodeFromName("HasKeyboardFocus")))
|
||||||
|
{
|
||||||
|
driver.SendSpecialKeys(tabId, "Tab");
|
||||||
|
if (++tabs > 20)
|
||||||
|
{
|
||||||
|
Javascript.ClearFocus(driver, 0);
|
||||||
|
tabs = 0;
|
||||||
|
resets++;
|
||||||
|
if (resets > 5)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check basic keyboard interactions for the video control
|
/// Check basic keyboard interactions for the video control
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1159,7 +1190,8 @@ namespace Microsoft.Edge.A11y
|
||||||
}
|
}
|
||||||
|
|
||||||
//Case 1: tab to play button and play/pause
|
//Case 1: tab to play button and play/pause
|
||||||
driver.SendSpecialKeys(videoId, "TabSpace");
|
TabToElementByName(elements[0], "Play", videoId, driver);
|
||||||
|
driver.SendSpecialKeys(videoId, "Space");
|
||||||
if (!WaitForCondition(VideoPlaying))
|
if (!WaitForCondition(VideoPlaying))
|
||||||
{
|
{
|
||||||
result += "\tVideo was not playing after spacebar on play button\n";
|
result += "\tVideo was not playing after spacebar on play button\n";
|
||||||
|
@ -1174,7 +1206,7 @@ namespace Microsoft.Edge.A11y
|
||||||
|
|
||||||
//Case 2: Volume and mute
|
//Case 2: Volume and mute
|
||||||
Javascript.ClearFocus(driver, 0);
|
Javascript.ClearFocus(driver, 0);
|
||||||
driver.SendTabs(videoId, 6);//tab to volume control//TODO make this more resilient to UI changes
|
TabToElementByName(elements[0], "Mute", videoId, driver);
|
||||||
driver.SendSpecialKeys(videoId, "Enter");//mute
|
driver.SendSpecialKeys(videoId, "Enter");//mute
|
||||||
if (!WaitForCondition(VideoMuted))
|
if (!WaitForCondition(VideoMuted))
|
||||||
{
|
{
|
||||||
|
@ -1207,7 +1239,7 @@ namespace Microsoft.Edge.A11y
|
||||||
result += "\tVideo was playing when it shouldn't have been\n";
|
result += "\tVideo was playing when it shouldn't have been\n";
|
||||||
}
|
}
|
||||||
Javascript.ClearFocus(driver, 0);
|
Javascript.ClearFocus(driver, 0);
|
||||||
driver.SendTabs(videoId, 3);//tab to seek
|
TabToElementByName(elements[0], "Seek", videoId, driver);
|
||||||
initial = GetVideoElapsed();
|
initial = GetVideoElapsed();
|
||||||
driver.SendSpecialKeys(videoId, "Arrow_right"); //skip ahead
|
driver.SendSpecialKeys(videoId, "Arrow_right"); //skip ahead
|
||||||
if (!WaitForCondition(VideoElapsed, initial + 10))
|
if (!WaitForCondition(VideoElapsed, initial + 10))
|
||||||
|
@ -1227,7 +1259,7 @@ namespace Microsoft.Edge.A11y
|
||||||
result += "\tVideo was playing when it shouldn't have been\n";
|
result += "\tVideo was playing when it shouldn't have been\n";
|
||||||
}
|
}
|
||||||
Javascript.ClearFocus(driver, 0);
|
Javascript.ClearFocus(driver, 0);
|
||||||
driver.SendTabs(videoId, 4);//tab to seek
|
TabToElementByName(elements[0], "Seek", videoId, driver);
|
||||||
initial = GetVideoElapsed();
|
initial = GetVideoElapsed();
|
||||||
driver.SendSpecialKeys(videoId, "Arrow_right"); //skip ahead
|
driver.SendSpecialKeys(videoId, "Arrow_right"); //skip ahead
|
||||||
if (!WaitForCondition(VideoElapsed, initial + 10))
|
if (!WaitForCondition(VideoElapsed, initial + 10))
|
||||||
|
@ -1244,7 +1276,7 @@ namespace Microsoft.Edge.A11y
|
||||||
|
|
||||||
//Case 6: Full screen
|
//Case 6: Full screen
|
||||||
Javascript.ClearFocus(driver, 0);
|
Javascript.ClearFocus(driver, 0);
|
||||||
driver.SendTabs(videoId, 8);//tab to fullscreen
|
TabToElementByName(elements[0], "Full screen", videoId, driver);
|
||||||
driver.SendSpecialKeys(videoId, "Enter"); //enter fullscreen mode
|
driver.SendSpecialKeys(videoId, "Enter"); //enter fullscreen mode
|
||||||
if (!WaitForCondition(IsVideoFullScreen))
|
if (!WaitForCondition(IsVideoFullScreen))
|
||||||
{
|
{
|
||||||
|
|
Загрузка…
Ссылка в новой задаче