Merge pull request #12452 from edx/clrux/ac-414

AC-414 adding headings as first child to sections
This commit is contained in:
clrux
2016-06-10 15:23:10 -04:00
committed by GitHub
52 changed files with 343 additions and 233 deletions

View File

@@ -23,7 +23,7 @@ class InstructorDashboardPage(CoursePage):
"""
Selects the membership tab and returns the MembershipSection
"""
self.q(css='a[data-section=membership]').first.click()
self.q(css='[data-section=membership]').first.click()
membership_section = MembershipPage(self.browser)
membership_section.wait_for_page()
return membership_section
@@ -32,7 +32,7 @@ class InstructorDashboardPage(CoursePage):
"""
Selects the cohort management tab and returns the CohortManagementSection
"""
self.q(css='a[data-section=cohort_management]').first.click()
self.q(css='[data-section=cohort_management]').first.click()
cohort_management_section = CohortManagementSection(self.browser)
# The first time cohort management is selected, an ajax call is made.
cohort_management_section.wait_for_ajax()
@@ -43,7 +43,7 @@ class InstructorDashboardPage(CoursePage):
"""
Selects the data download tab and returns a DataDownloadPage.
"""
self.q(css='a[data-section=data_download]').first.click()
self.q(css='[data-section=data_download]').first.click()
data_download_section = DataDownloadPage(self.browser)
data_download_section.wait_for_page()
return data_download_section
@@ -52,7 +52,7 @@ class InstructorDashboardPage(CoursePage):
"""
Selects the student admin tab and returns the MembershipSection
"""
self.q(css='a[data-section=student_admin]').first.click()
self.q(css='[data-section=student_admin]').first.click()
student_admin_section = StudentAdminPage(self.browser)
student_admin_section.wait_for_page()
return student_admin_section
@@ -61,7 +61,7 @@ class InstructorDashboardPage(CoursePage):
"""
Selects the certificates tab and returns the CertificatesSection
"""
self.q(css='a[data-section=certificates]').first.click()
self.q(css='[data-section=certificates]').first.click()
certificates_section = CertificatesPage(self.browser)
certificates_section.wait_for_page()
return certificates_section
@@ -70,7 +70,7 @@ class InstructorDashboardPage(CoursePage):
"""
Selects the timed exam tab and returns the Special Exams Section
"""
self.q(css='a[data-section=special_exams]').first.click()
self.q(css='[data-section=special_exams]').first.click()
timed_exam_section = SpecialExamsPage(self.browser)
timed_exam_section.wait_for_page()
return timed_exam_section
@@ -79,7 +79,7 @@ class InstructorDashboardPage(CoursePage):
"""
Selects the email tab and returns the bulk email section
"""
self.q(css='a[data-section=send_email]').first.click()
self.q(css='[data-section=send_email]').first.click()
email_section = BulkEmailPage(self.browser)
email_section.wait_for_page()
return email_section
@@ -115,7 +115,7 @@ class BulkEmailPage(PageObject):
url = None
def is_browser_on_page(self):
return self.q(css='a[data-section=send_email].active-section').present
return self.q(css='[data-section=send_email].active-section').present
def _bounded_selector(self, selector):
"""
@@ -169,7 +169,7 @@ class MembershipPage(PageObject):
url = None
def is_browser_on_page(self):
return self.q(css='a[data-section=membership].active-section').present
return self.q(css='[data-section=membership].active-section').present
def select_auto_enroll_section(self):
"""
@@ -185,7 +185,7 @@ class SpecialExamsPage(PageObject):
url = None
def is_browser_on_page(self):
return self.q(css='a[data-section=special_exams].active-section').present
return self.q(css='[data-section=special_exams].active-section').present
def select_allowance_section(self):
"""
@@ -954,7 +954,7 @@ class DataDownloadPage(PageObject):
url = None
def is_browser_on_page(self):
return self.q(css='a[data-section=data_download].active-section').present
return self.q(css='[data-section=data_download].active-section').present
@property
def generate_student_report_button(self):
@@ -1017,7 +1017,7 @@ class StudentAdminPage(PageObject):
"""
Confirms student admin section is present
"""
return self.q(css='a[data-section=student_admin].active-section').present
return self.q(css='[data-section=student_admin].active-section').present
@property
def student_email_input(self):
@@ -1177,7 +1177,7 @@ class CertificatesPage(PageObject):
self.wait_for_page()
def is_browser_on_page(self):
return self.q(css='a[data-section=certificates].active-section').present
return self.q(css='[data-section=certificates].active-section').present
def get_selector(self, css_selector):
"""

View File

@@ -208,7 +208,7 @@ class DiscussionHomePageTest(UniqueCourseTest):
def test_page_accessibility(self):
self.page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'color-contrast', # TNL-4635
'link-href', # TNL-4636
'icon-aria-hidden', # TNL-4637
@@ -348,7 +348,7 @@ class DiscussionTabMultipleThreadTest(BaseDiscussionTestCase):
def test_page_accessibility(self):
self.thread_page_1.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr-value', # TNL-4638
'color-contrast', # TNL-4639
'link-href', # TNL-4640
@@ -360,7 +360,7 @@ class DiscussionTabMultipleThreadTest(BaseDiscussionTestCase):
self.thread_page_2.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr-value', # TNL-4638
'color-contrast', # TNL-4639
'link-href', # TNL-4640
@@ -424,7 +424,7 @@ class DiscussionOpenClosedThreadTest(BaseDiscussionTestCase):
page = self.setup_openclosed_thread_page()
page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr-value', # TNL-4643
'color-contrast', # TNL-4644
'link-href', # TNL-4640
@@ -436,7 +436,7 @@ class DiscussionOpenClosedThreadTest(BaseDiscussionTestCase):
page = self.setup_openclosed_thread_page(True)
page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr-value', # TNL-4643
'color-contrast', # TNL-4644
'link-href', # TNL-4640
@@ -725,7 +725,7 @@ class DiscussionResponseEditTest(BaseDiscussionTestCase):
page = self.create_single_thread_page("response_edit_test_thread")
page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr-value', # TNL-4638
'color-contrast', # TNL-4644
'link-href', # TNL-4640
@@ -827,7 +827,7 @@ class DiscussionCommentEditTest(BaseDiscussionTestCase):
page.visit()
page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr-value', # TNL-4643
'color-contrast', # TNL-4644
'link-href', # TNL-4640
@@ -1202,7 +1202,7 @@ class DiscussionSearchAlertTest(UniqueCourseTest):
def test_page_accessibility(self):
self.page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'color-contrast', # TNL-4639
'link-href', # TNL-4640
'icon-aria-hidden', # TNL-4641

View File

@@ -481,7 +481,7 @@ class AccountSettingsA11yTest(AccountSettingsTestMixin, WebAppTest):
self.visit_account_settings_page()
self.account_settings_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'link-href', # TODO: AC-233
],
})

View File

@@ -779,7 +779,7 @@ class LearnerProfileA11yTest(LearnerProfileTestMixin, WebAppTest):
profile_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'link-href', # TODO: AC-231
],
})
@@ -807,7 +807,7 @@ class LearnerProfileA11yTest(LearnerProfileTestMixin, WebAppTest):
profile_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'link-href', # TODO: AC-231
],
})
@@ -824,7 +824,7 @@ class LearnerProfileA11yTest(LearnerProfileTestMixin, WebAppTest):
profile_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'link-href', # TODO: AC-231
],
})

View File

@@ -1349,7 +1349,7 @@ class CourseInfoA11yTest(UniqueCourseTest):
self.course_info_page.visit()
self.course_info_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.course_info_page.a11y_audit.check_for_accessibility_errors()

View File

@@ -621,7 +621,7 @@ class CoursewareMultipleVerticalsTest(UniqueCourseTest, EventsTestMixin):
include=['div.sequence-nav'])
self.courseware_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
],
})
self.courseware_page.a11y_audit.check_for_accessibility_errors()

View File

@@ -234,7 +234,7 @@ class LmsDashboardA11yTest(BaseLmsDashboardTest):
self.assertEqual(len(course_listings), 1)
self.dashboard_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.dashboard_page.a11y_audit.check_for_accessibility_errors()

View File

@@ -46,6 +46,27 @@ class BaseInstructorDashboardTest(EventsTestMixin, UniqueCourseTest):
return instructor_dashboard_page
@attr('a11y')
class LMSInstructorDashboardA11yTest(BaseInstructorDashboardTest):
"""
Instructor dashboard base accessibility test.
"""
def setUp(self):
super(LMSInstructorDashboardA11yTest, self).setUp()
self.course_fixture = CourseFixture(**self.course_info).install()
self.log_in_as_instructor()
self.instructor_dashboard_page = self.visit_instructor_dashboard()
def test_instructor_dashboard_a11y(self):
self.instructor_dashboard_page.a11y_audit.config.set_rules({
"ignore": [
'link-href', # TODO: AC-491
'data-table', # TODO: AC-491
]
})
self.instructor_dashboard_page.a11y_audit.check_for_accessibility_errors()
@ddt.ddt
class BulkEmailTest(BaseInstructorDashboardTest):
"""
@@ -64,6 +85,23 @@ class BulkEmailTest(BaseInstructorDashboardTest):
self.send_email_page.send_message(recipient)
self.send_email_page.verify_message_queued_successfully()
@attr('a11y')
def test_bulk_email_a11y(self):
"""
Bulk email accessibility tests
"""
self.send_email_page.a11y_audit.config.set_scope([
'#section-send-email'
])
self.send_email_page.a11y_audit.config.set_rules({
"ignore": [
'button-name', # TODO: AC-491
'list', # TODO: AC-491,
'color-contrast', # TODO: AC-491
]
})
self.send_email_page.a11y_audit.check_for_accessibility_errors()
@attr('shard_7')
class AutoEnrollmentWithCSVTest(BaseInstructorDashboardTest):
@@ -172,6 +210,16 @@ class AutoEnrollmentWithCSVTest(BaseInstructorDashboardTest):
self.assertTrue(self.auto_enroll_section.is_notification_displayed(section_type=self.auto_enroll_section.NOTIFICATION_ERROR))
self.assertEqual(self.auto_enroll_section.first_notification_message(section_type=self.auto_enroll_section.NOTIFICATION_ERROR), "Make sure that the file you upload is in CSV format with no extraneous characters or rows.")
@attr('a11y')
def test_auto_enroll_csv_a11y(self):
"""
Auto-enrollment with CSV accessibility tests
"""
self.auto_enroll_section.a11y_audit.config.set_scope([
'#member-list-widget-template'
])
self.auto_enroll_section.a11y_audit.check_for_accessibility_errors()
@attr('shard_7')
class ProctoredExamsTest(BaseInstructorDashboardTest):
@@ -668,6 +716,16 @@ class DataDownloadsTest(BaseInstructorDashboardTest):
self.data_download_section.wait_for_available_report()
self.verify_report_download(report_name)
@attr('a11y')
def test_data_download_a11y(self):
"""
Data download page accessibility tests
"""
self.data_download_section.a11y_audit.config.set_scope([
'.data-download-container'
])
self.data_download_section.a11y_audit.check_for_accessibility_errors()
@attr('shard_7')
@ddt.ddt
@@ -956,6 +1014,26 @@ class CertificatesTest(BaseInstructorDashboardTest):
self.assertIn(self.user_name, self.certificates_section.last_certificate_exception.text)
self.assertIn(expected_notes, self.certificates_section.last_certificate_exception.text)
@attr('a11y')
def test_certificates_a11y(self):
"""
Certificates page accessibility tests
"""
self.certificates_section.a11y_audit.config.set_scope([
'.certificates-wrapper'
])
self.certificates_section.a11y_audit.config.set_rules({
"ignore": [
'aria-valid-attr-value', # TODO: AC-491
'checkboxgroup', # TODO: AC-491
'color-contrast', # TODO: AC-491
'duplicate-id', # TODO: AC-491
'label', # TODO: AC-491
'radiogroup', # TODO: AC-491
]
})
self.certificates_section.a11y_audit.check_for_accessibility_errors()
@attr('shard_7')
class CertificateInvalidationTest(BaseInstructorDashboardTest):
@@ -1154,3 +1232,24 @@ class CertificateInvalidationTest(BaseInstructorDashboardTest):
u"{user} is not enrolled in this course. Please check your spelling and retry.".format(user=new_user),
self.certificates_section.certificate_invalidation_message.text
)
@attr('a11y')
def test_invalidate_certificates_a11y(self):
"""
Certificate invalidation accessibility tests
"""
self.certificates_section.a11y_audit.config.set_scope([
'.certificates-wrapper'
])
self.certificates_section.a11y_audit.config.set_rules({
"ignore": [
'data-table', # TODO: AC-491
'aria-valid-attr-value', # TODO: AC-491
'checkboxgroup', # TODO: AC-491
'color-contrast', # TODO: AC-491
'duplicate-id', # TODO: AC-491
'label', # TODO: AC-491
'radiogroup', # TODO: AC-491
]
})
self.certificates_section.a11y_audit.check_for_accessibility_errors()

View File

@@ -247,14 +247,14 @@ class ProblemTypeTestMixin(object):
self.problem_page.a11y_audit.config.set_rules({
"ignore": [
'aria-allowed-attr', # TODO: wcag2aa
'aria-valid-attr', # TODO: wcag2aa
'aria-roles', # TODO: wcag2aa
'checkboxgroup', # TODO: wcag2aa
'radiogroup', # TODO: wcag2aa
'color-contrast', # TODO: wcag2aa
'section', # TODO: wcag2aa
'label', # TODO: wcag2aa
'aria-allowed-attr', # TODO: AC-491
'aria-valid-attr', # TODO: AC-491
'aria-roles', # TODO: AC-491
'checkboxgroup', # TODO: AC-491
'radiogroup', # TODO: AC-491
'color-contrast', # TODO: AC-491
'section', # TODO: AC-491
'label', # TODO: AC-491
]
})
@@ -335,7 +335,7 @@ class CheckboxProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(CheckboxProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-allowed-attr', # TODO: AC-251
'aria-valid-attr', # TODO: AC-251
'aria-roles', # TODO: AC-251
@@ -381,7 +381,7 @@ class MultipleChoiceProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(MultipleChoiceProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr', # TODO: AC-251
'radiogroup', # TODO: AC-251
]
@@ -425,7 +425,7 @@ class RadioProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(RadioProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'aria-valid-attr', # TODO: AC-292
'radiogroup', # TODO: AC-292
]
@@ -463,7 +463,7 @@ class DropDownProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(DropDownProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-291
]
})
@@ -506,7 +506,7 @@ class StringProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(StringProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-290
]
})
@@ -548,7 +548,7 @@ class NumericalProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(NumericalProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-289
]
})
@@ -592,7 +592,7 @@ class FormulaProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(FormulaProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-288
]
})
@@ -643,7 +643,7 @@ class ScriptProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(ScriptProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-287
]
})
@@ -693,7 +693,7 @@ class CodeProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(CodeProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'color-contrast', # TODO: AC-286
'label', # TODO: AC-286
]
@@ -802,7 +802,7 @@ class RadioTextProblemTypeTest(ChoiceTextProbelmTypeTestBase, ProblemTypeTestMix
super(RadioTextProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-285
'radiogroup', # TODO: AC-285
]
@@ -835,7 +835,7 @@ class CheckboxTextProblemTypeTest(ChoiceTextProbelmTypeTestBase, ProblemTypeTest
super(CheckboxTextProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-284
'checkboxgroup', # TODO: AC-284
]
@@ -899,7 +899,7 @@ class SymbolicProblemTypeTest(ProblemTypeTestBase, ProblemTypeTestMixin):
super(SymbolicProblemTypeTest, self).setUp(*args, **kwargs)
self.problem_page.a11y_audit.config.set_rules({
'ignore': [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'label', # TODO: AC-294
]
})

View File

@@ -125,7 +125,7 @@ class ProgramListingPageA11yTest(ProgramPageBase):
self.listing_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.listing_page.a11y_audit.check_for_accessibility_errors()
@@ -140,7 +140,7 @@ class ProgramListingPageA11yTest(ProgramPageBase):
self.listing_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.listing_page.a11y_audit.check_for_accessibility_errors()
@@ -164,7 +164,7 @@ class ProgramDetailsPageA11yTest(ProgramPageBase):
self.details_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.details_page.a11y_audit.check_for_accessibility_errors()

View File

@@ -656,7 +656,7 @@ class StudioLibraryA11yTest(StudioLibraryTest):
# we will ignore this error in the test until we fix them.
lib_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'color-contrast', # TODO: AC-225
'link-href', # TODO: AC-226
'nav-aria-label', # TODO: AC-227

View File

@@ -503,7 +503,7 @@ class StudioSettingsA11yTest(StudioCourseTest):
# we will ignore this error in the test until we fix them.
self.settings_page.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
'color-contrast', # TODO: AC-225
'link-href', # TODO: AC-226
'nav-aria-label', # TODO: AC-227
@@ -582,7 +582,7 @@ class StudioSubsectionSettingsA11yTest(StudioCourseTest):
)
self.course_outline.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.course_outline.a11y_audit.check_for_accessibility_errors()

View File

@@ -360,7 +360,7 @@ class CMSVideoA11yTest(CMSVideoBaseTest):
)
self.outline.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.outline.a11y_audit.check_for_accessibility_errors()

View File

@@ -1274,7 +1274,7 @@ class LMSVideoModuleA11yTest(VideoBaseTest):
)
self.video.a11y_audit.config.set_rules({
"ignore": [
'section', # TODO: wcag2aa
'section', # TODO: AC-491
]
})
self.video.a11y_audit.check_for_accessibility_errors()