summaryrefslogtreecommitdiff
path: root/tests/admin_views
diff options
context:
space:
mode:
authorantoliny0919 <antoliny0919@gmail.com>2025-07-20 22:12:15 +0900
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-07-30 17:32:39 +0200
commit6ea331907996a51842da55c1f8d65eea7b367c7d (patch)
tree3deaa0a318b80298438a366dd1808d4ef5be61ba /tests/admin_views
parent792ca148a2d6da6cf0778f6a866c899208ab94f9 (diff)
Fixed #36511 -- Ensured filters came before table in keyboard navigation in admin changelist.
Diffstat (limited to 'tests/admin_views')
-rw-r--r--tests/admin_views/admin.py2
-rw-r--r--tests/admin_views/test_skip_link_to_content.py44
2 files changed, 46 insertions, 0 deletions
diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py
index 95d16a4770..b6d009b388 100644
--- a/tests/admin_views/admin.py
+++ b/tests/admin_views/admin.py
@@ -431,6 +431,8 @@ class PodcastAdmin(admin.ModelAdmin):
list_display = ("name", "release_date")
list_editable = ("release_date",)
date_hierarchy = "release_date"
+ list_filter = ("name",)
+ search_fields = ("name",)
ordering = ("name",)
diff --git a/tests/admin_views/test_skip_link_to_content.py b/tests/admin_views/test_skip_link_to_content.py
index 3284b76495..5cec63307b 100644
--- a/tests/admin_views/test_skip_link_to_content.py
+++ b/tests/admin_views/test_skip_link_to_content.py
@@ -3,6 +3,8 @@ from django.contrib.auth.models import User
from django.test import override_settings
from django.urls import reverse
+from .models import Podcast
+
@override_settings(ROOT_URLCONF="admin_views.urls")
class SeleniumTests(AdminSeleniumTestCase):
@@ -125,3 +127,45 @@ class SeleniumTests(AdminSeleniumTestCase):
)
self.assertTrue(is_vertical_scrolleable)
self.assertFalse(is_horizontal_scrolleable)
+
+ def test_skip_link_keyboard_navigation_in_changelist(self):
+ from selenium.webdriver.common.by import By
+ from selenium.webdriver.common.keys import Keys
+
+ Podcast.objects.create(name="apple", release_date="2000-09-19")
+ self.admin_login(
+ username="super", password="secret", login_url=reverse("admin:index")
+ )
+ self.selenium.get(
+ self.live_server_url + reverse("admin:admin_views_podcast_changelist")
+ )
+ selectors = [
+ "ul.object-tools", # object_tools.
+ "search#changelist-filter", # list_filter.
+ "form#changelist-search", # search_fields.
+ "nav.toplinks", # date_hierarchy.
+ "form#changelist-form div.actions", # action.
+ "table#result_list", # table.
+ "div.changelist-footer", # footer.
+ ]
+ content = self.selenium.find_element(By.ID, "content-start")
+ content.send_keys(Keys.TAB)
+
+ for selector in selectors:
+ with self.subTest(selector=selector):
+ # Currently focused element.
+ focused_element = self.selenium.switch_to.active_element
+ expected_element = self.selenium.find_element(By.CSS_SELECTOR, selector)
+ element_points = self.selenium.find_elements(
+ By.CSS_SELECTOR,
+ f"{selector} a, {selector} input, {selector} button",
+ )
+ self.assertIn(
+ focused_element.get_attribute("outerHTML"),
+ expected_element.get_attribute("innerHTML"),
+ )
+ # Move to the next container element via TAB.
+ for point in element_points[::-1]:
+ if point.is_displayed():
+ point.send_keys(Keys.TAB)
+ break