This test makes sure that disabled form controls are not exposed as focusable.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


Testing #button
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #button
PASS axElement.isFocusable === false

Testing #text
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #text
PASS axElement.isFocusable === false

Testing #checkbox
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #checkbox
PASS axElement.isFocusable === false

Testing #radio
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #radio
PASS axElement.isFocusable === false

Testing #submit
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #submit
PASS axElement.isFocusable === false

Testing #slider
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #slider
PASS axElement.isFocusable === false

Testing #combobox
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #combobox
PASS axElement.isFocusable === false

Testing #listbox
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #listbox
PASS axElement.isFocusable === false

Testing #textarea
FAIL axElement.isFocusable should be true. Was false.
Setting the disabled attribute of element #textarea
PASS axElement.isFocusable === false

PASS successfullyParsed is true
Some tests failed.

TEST COMPLETE

