diff --git a/common/test/acceptance/pages/lms/textbook_view.py b/common/test/acceptance/pages/lms/textbook_view.py
new file mode 100644
index 0000000000..6b946d96dd
--- /dev/null
+++ b/common/test/acceptance/pages/lms/textbook_view.py
@@ -0,0 +1,28 @@
+"""
+Course Textbooks page.
+"""
+
+from .course_page import CoursePage
+from bok_choy.promise import EmptyPromise
+
+
+class TextbookViewPage(CoursePage):
+ """
+ Course Textbooks page.
+ """
+
+ url_path = "pdfbook/0/"
+
+ def is_browser_on_page(self):
+ return self.q(css='.book-sidebar').present
+
+ def switch_to_pdf_frame(self, test):
+ """
+ Waits for pdf frame to load, then switches driver to the frame
+ """
+ EmptyPromise(
+ lambda: self.q(css='iframe').present, "Iframe loaded"
+ ).fulfill()
+
+ driver = test.get_web_driver()
+ driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))
diff --git a/common/test/acceptance/pages/studio/textbooks.py b/common/test/acceptance/pages/studio/textbook_upload.py
similarity index 83%
rename from common/test/acceptance/pages/studio/textbooks.py
rename to common/test/acceptance/pages/studio/textbook_upload.py
index 76160a4dbd..e107eaf5b4 100644
--- a/common/test/acceptance/pages/studio/textbooks.py
+++ b/common/test/acceptance/pages/studio/textbook_upload.py
@@ -8,7 +8,7 @@ from ..common.utils import click_css
from .course_page import CoursePage
-class TextbooksPage(CoursePage):
+class TextbookUploadPage(CoursePage):
"""
Course Textbooks page.
"""
@@ -41,7 +41,7 @@ class TextbooksPage(CoursePage):
Uploads a pdf textbook.
"""
# If the pdf upload section has not yet been toggled on, click on the upload pdf button
- test_dir = path(__file__).abspath().dirname().dirname().dirname()
+ test_dir = path(__file__).abspath().dirname().dirname().dirname().dirname() # pylint:disable=no-value-for-parameter
file_path = test_dir + '/data/uploads/' + file_name
click_css(self, ".edit-textbook .action-upload", require_notification=False)
@@ -70,3 +70,13 @@ class TextbooksPage(CoursePage):
return False
return response.status_code == 200
+
+ def upload_new_textbook(self):
+ """
+ Fills out form to upload a new textbook
+ """
+ self.open_add_textbook_form()
+ self.upload_pdf_file('textbook.pdf')
+ self.set_input_field_value('.edit-textbook #textbook-name-input', 'book_1')
+ self.set_input_field_value('.edit-textbook #chapter1-name', 'chap_1')
+ self.click_textbook_submit_button()
diff --git a/common/test/acceptance/tests/studio/test_studio_general.py b/common/test/acceptance/tests/studio/test_studio_general.py
index 01910d0cf6..a2c18acb8e 100644
--- a/common/test/acceptance/tests/studio/test_studio_general.py
+++ b/common/test/acceptance/tests/studio/test_studio_general.py
@@ -18,7 +18,7 @@ from ...pages.studio.settings import SettingsPage
from ...pages.studio.settings_advanced import AdvancedSettingsPage
from ...pages.studio.settings_graders import GradingPage
from ...pages.studio.signup import SignupPage
-from ...pages.studio.textbooks import TextbooksPage
+from ...pages.studio.textbook_upload import TextbookUploadPage
from ...fixtures.course import XBlockFixtureDesc
from base_studio_test import StudioCourseTest
@@ -82,7 +82,7 @@ class CoursePagesTest(StudioCourseTest):
# AssetIndexPage, # TODO: Skip testing this page due to FEDX-88
CourseUpdatesPage,
PagesPage, ExportCoursePage, ImportCoursePage, CourseTeamPage, CourseOutlinePage, SettingsPage,
- AdvancedSettingsPage, GradingPage, TextbooksPage
+ AdvancedSettingsPage, GradingPage, TextbookUploadPage
]
]
diff --git a/common/test/acceptance/tests/studio/test_studio_textbooks.py b/common/test/acceptance/tests/studio/test_studio_textbooks.py
index 3f2527c0bc..8726305eec 100644
--- a/common/test/acceptance/tests/studio/test_studio_textbooks.py
+++ b/common/test/acceptance/tests/studio/test_studio_textbooks.py
@@ -2,7 +2,8 @@
Acceptance tests for Studio related to the textbooks.
"""
from common.test.acceptance.tests.studio.base_studio_test import StudioCourseTest
-from ...pages.studio.textbooks import TextbooksPage
+from ...pages.studio.textbook_upload import TextbookUploadPage
+from ...pages.lms.textbook_view import TextbookViewPage
from ...tests.helpers import disable_animations
from nose.plugins.attrib import attr
@@ -17,15 +18,17 @@ class TextbooksTest(StudioCourseTest):
Install a course with no content using a fixture.
"""
super(TextbooksTest, self).setUp(is_staff)
- self.textbook_page = TextbooksPage(
+ self.textbook_upload_page = TextbookUploadPage(
self.browser,
self.course_info['org'],
self.course_info['number'],
self.course_info['run']
)
- self.textbook_page.visit()
+ self.textbook_upload_page.visit()
disable_animations(self)
+ self.textbook_view_page = TextbookViewPage(self.browser, self.course_id)
+
def test_create_first_book_message(self):
"""
Scenario: A message is displayed on the textbooks page when there are no uploaded textbooks
@@ -33,7 +36,7 @@ class TextbooksTest(StudioCourseTest):
And I have not yet uploaded a textbook
Then I see a message stating that I have not uploaded any textbooks
"""
- message = self.textbook_page.get_element_text('.wrapper-content .no-textbook-content')
+ message = self.textbook_upload_page.get_element_text('.wrapper-content .no-textbook-content')
self.assertIn("You haven't added any textbooks", message)
def test_new_textbook_upload(self):
@@ -43,9 +46,44 @@ class TextbooksTest(StudioCourseTest):
And I have uploaded a PDF textbook and save the new textbook information
Then the "View Live" link contains a link to the textbook in the LMS
"""
- self.textbook_page.open_add_textbook_form()
- self.textbook_page.upload_pdf_file('textbook.pdf')
- self.textbook_page.set_input_field_value('.edit-textbook #textbook-name-input', 'book_1')
- self.textbook_page.set_input_field_value('.edit-textbook #chapter1-name', 'chap_1')
- self.textbook_page.click_textbook_submit_button()
- self.assertTrue(self.textbook_page.is_view_live_link_worked())
+ self.textbook_upload_page.upload_new_textbook()
+ self.assertTrue(self.textbook_upload_page.is_view_live_link_worked())
+
+ @attr('a11y')
+ def test_textbook_page_a11y(self):
+ """
+ Uploads a new textbook
+ Runs an accessibility test on the textbook page in lms
+ """
+ self.textbook_upload_page.upload_new_textbook()
+ self.textbook_view_page.visit()
+
+ self.textbook_view_page.a11y_audit.config.set_rules({
+ 'ignore': [
+ 'color-contrast', # AC-500
+ 'skip-link', # AC-501
+ 'link-href', # AC-502
+ 'section' # AC-503
+ ],
+ })
+ self.textbook_view_page.a11y_audit.check_for_accessibility_errors()
+
+ @attr('a11y')
+ def test_pdf_viewer_a11y(self):
+ """
+ Uploads a new textbook
+ Runs an accessibility test on the pdf viewer frame in lms
+ """
+ self.textbook_upload_page.upload_new_textbook()
+ self.textbook_view_page.visit()
+
+ self.textbook_view_page.switch_to_pdf_frame(self)
+ self.textbook_view_page.a11y_audit.config.set_rules({
+ 'ignore': [
+ 'html-lang', # AC-504
+ 'meta-viewport', # AC-505
+ 'skip-link', # AC-506
+ 'link-href', # AC-507
+ ],
+ })
+ self.textbook_view_page.a11y_audit.check_for_accessibility_errors()
diff --git a/lms/templates/pdf_viewer.html b/lms/templates/pdf_viewer.html
index 9ef5d245ad..ff400b29f3 100644
--- a/lms/templates/pdf_viewer.html
+++ b/lms/templates/pdf_viewer.html
@@ -49,19 +49,19 @@ http://sourceforge.net/adobe/cmap/wiki/License/
<%static:js group='courseware'/>
-
+