diff options
| author | Carlton Gibson <carlton.gibson@noumenal.es> | 2021-10-20 15:54:30 +0200 |
|---|---|---|
| committer | Carlton Gibson <carlton.gibson@noumenal.es> | 2021-10-21 14:37:16 +0200 |
| commit | 2ccc0b22db6730ba0950b10bbc5238ae575e4a45 (patch) | |
| tree | 6107a609c42128b51ae7a5c50805912ba613b8d2 /tests/admin_views | |
| parent | 8fa974fcdde90b6719a1058e77541389ff1809b5 (diff) | |
Fixed #33211 -- Updated tests for Selenium 4.0.0.
Replaced deprecated `find_element[s]_by_*()` usages, in favour of
`find_element[s]()` with an explicit `By`.
Diffstat (limited to 'tests/admin_views')
| -rw-r--r-- | tests/admin_views/test_autocomplete_view.py | 44 | ||||
| -rw-r--r-- | tests/admin_views/test_nav_sidebar.py | 28 | ||||
| -rw-r--r-- | tests/admin_views/tests.py | 209 |
3 files changed, 155 insertions, 126 deletions
diff --git a/tests/admin_views/test_autocomplete_view.py b/tests/admin_views/test_autocomplete_view.py index 302e454109..dfaba42009 100644 --- a/tests/admin_views/test_autocomplete_view.py +++ b/tests/admin_views/test_autocomplete_view.py @@ -331,11 +331,13 @@ class SeleniumTests(AdminSeleniumTestCase): @contextmanager def select2_ajax_wait(self, timeout=10): from selenium.common.exceptions import NoSuchElementException + from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ec yield with self.disable_implicit_wait(): try: - loading_element = self.selenium.find_element_by_css_selector( + loading_element = self.selenium.find_element( + By.CSS_SELECTOR, 'li.select2-results__option.loading-results' ) except NoSuchElementException: @@ -344,24 +346,25 @@ class SeleniumTests(AdminSeleniumTestCase): self.wait_until(ec.staleness_of(loading_element), timeout=timeout) def test_select(self): + from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select self.selenium.get(self.live_server_url + reverse('autocomplete_admin:admin_views_answer_add')) - elem = self.selenium.find_element_by_css_selector('.select2-selection') + elem = self.selenium.find_element(By.CSS_SELECTOR, '.select2-selection') elem.click() # Open the autocomplete dropdown. - results = self.selenium.find_element_by_css_selector('.select2-results') + results = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results') self.assertTrue(results.is_displayed()) - option = self.selenium.find_element_by_css_selector('.select2-results__option') + option = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results__option') self.assertEqual(option.text, 'No results found') elem.click() # Close the autocomplete dropdown. q1 = Question.objects.create(question='Who am I?') Question.objects.bulk_create(Question(question=str(i)) for i in range(PAGINATOR_SIZE + 10)) elem.click() # Reopen the dropdown now that some objects exist. - result_container = self.selenium.find_element_by_css_selector('.select2-results') + result_container = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results') self.assertTrue(result_container.is_displayed()) # PAGINATOR_SIZE results and "Loading more results". self.assertCountSeleniumElements('.select2-results__option', PAGINATOR_SIZE + 1, root_element=result_container) - search = self.selenium.find_element_by_css_selector('.select2-search__field') + search = self.selenium.find_element(By.CSS_SELECTOR, '.select2-search__field') # Load next page of results by scrolling to the bottom of the list. with self.select2_ajax_wait(): for _ in range(PAGINATOR_SIZE + 1): @@ -386,27 +389,28 @@ class SeleniumTests(AdminSeleniumTestCase): self.assertCountSeleniumElements('.select2-results__option', 1, root_element=result_container) # Select the result. search.send_keys(Keys.RETURN) - select = Select(self.selenium.find_element_by_id('id_question')) + select = Select(self.selenium.find_element(By.ID, 'id_question')) self.assertEqual(select.first_selected_option.get_attribute('value'), str(q1.pk)) def test_select_multiple(self): + from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select self.selenium.get(self.live_server_url + reverse('autocomplete_admin:admin_views_question_add')) - elem = self.selenium.find_element_by_css_selector('.select2-selection') + elem = self.selenium.find_element(By.CSS_SELECTOR, '.select2-selection') elem.click() # Open the autocomplete dropdown. - results = self.selenium.find_element_by_css_selector('.select2-results') + results = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results') self.assertTrue(results.is_displayed()) - option = self.selenium.find_element_by_css_selector('.select2-results__option') + option = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results__option') self.assertEqual(option.text, 'No results found') elem.click() # Close the autocomplete dropdown. Question.objects.create(question='Who am I?') Question.objects.bulk_create(Question(question=str(i)) for i in range(PAGINATOR_SIZE + 10)) elem.click() # Reopen the dropdown now that some objects exist. - result_container = self.selenium.find_element_by_css_selector('.select2-results') + result_container = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results') self.assertTrue(result_container.is_displayed()) self.assertCountSeleniumElements('.select2-results__option', PAGINATOR_SIZE + 1, root_element=result_container) - search = self.selenium.find_element_by_css_selector('.select2-search__field') + search = self.selenium.find_element(By.CSS_SELECTOR, '.select2-search__field') # Load next page of results by scrolling to the bottom of the list. with self.select2_ajax_wait(): for _ in range(PAGINATOR_SIZE + 1): @@ -427,25 +431,27 @@ class SeleniumTests(AdminSeleniumTestCase): elem.click() search.send_keys(Keys.ARROW_DOWN) search.send_keys(Keys.RETURN) - select = Select(self.selenium.find_element_by_id('id_related_questions')) + select = Select(self.selenium.find_element(By.ID, 'id_related_questions')) self.assertEqual(len(select.all_selected_options), 2) def test_inline_add_another_widgets(self): + from selenium.webdriver.common.by import By + def assertNoResults(row): - elem = row.find_element_by_css_selector('.select2-selection') + elem = row.find_element(By.CSS_SELECTOR, '.select2-selection') elem.click() # Open the autocomplete dropdown. - results = self.selenium.find_element_by_css_selector('.select2-results') + results = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results') self.assertTrue(results.is_displayed()) - option = self.selenium.find_element_by_css_selector('.select2-results__option') + option = self.selenium.find_element(By.CSS_SELECTOR, '.select2-results__option') self.assertEqual(option.text, 'No results found') # Autocomplete works in rows present when the page loads. self.selenium.get(self.live_server_url + reverse('autocomplete_admin:admin_views_book_add')) - rows = self.selenium.find_elements_by_css_selector('.dynamic-authorship_set') + rows = self.selenium.find_elements(By.CSS_SELECTOR, '.dynamic-authorship_set') self.assertEqual(len(rows), 3) assertNoResults(rows[0]) # Autocomplete works in rows added using the "Add another" button. - self.selenium.find_element_by_link_text('Add another Authorship').click() - rows = self.selenium.find_elements_by_css_selector('.dynamic-authorship_set') + self.selenium.find_element(By.LINK_TEXT, 'Add another Authorship').click() + rows = self.selenium.find_elements(By.CSS_SELECTOR, '.dynamic-authorship_set') self.assertEqual(len(rows), 4) assertNoResults(rows[-1]) diff --git a/tests/admin_views/test_nav_sidebar.py b/tests/admin_views/test_nav_sidebar.py index 102e4d0064..329fe34b28 100644 --- a/tests/admin_views/test_nav_sidebar.py +++ b/tests/admin_views/test_nav_sidebar.py @@ -115,53 +115,57 @@ class SeleniumTests(AdminSeleniumTestCase): self.selenium.execute_script("localStorage.removeItem('django.admin.navSidebarIsOpen')") def test_sidebar_starts_open(self): + from selenium.webdriver.common.by import By self.selenium.get(self.live_server_url + reverse('test_with_sidebar:auth_user_changelist')) - main_element = self.selenium.find_element_by_css_selector('#main') + main_element = self.selenium.find_element(By.CSS_SELECTOR, '#main') self.assertIn('shifted', main_element.get_attribute('class').split()) def test_sidebar_can_be_closed(self): + from selenium.webdriver.common.by import By self.selenium.get(self.live_server_url + reverse('test_with_sidebar:auth_user_changelist')) - toggle_button = self.selenium.find_element_by_css_selector('#toggle-nav-sidebar') + toggle_button = self.selenium.find_element(By.CSS_SELECTOR, '#toggle-nav-sidebar') self.assertEqual(toggle_button.tag_name, 'button') self.assertEqual(toggle_button.get_attribute('aria-label'), 'Toggle navigation') - for link in self.selenium.find_elements_by_css_selector('#nav-sidebar a'): + for link in self.selenium.find_elements(By.CSS_SELECTOR, '#nav-sidebar a'): self.assertEqual(link.get_attribute('tabIndex'), '0') toggle_button.click() # Hidden sidebar is not reachable via keyboard navigation. - for link in self.selenium.find_elements_by_css_selector('#nav-sidebar a'): + for link in self.selenium.find_elements(By.CSS_SELECTOR, '#nav-sidebar a'): self.assertEqual(link.get_attribute('tabIndex'), '-1') - main_element = self.selenium.find_element_by_css_selector('#main') + main_element = self.selenium.find_element(By.CSS_SELECTOR, '#main') self.assertNotIn('shifted', main_element.get_attribute('class').split()) def test_sidebar_state_persists(self): + from selenium.webdriver.common.by import By self.selenium.get(self.live_server_url + reverse('test_with_sidebar:auth_user_changelist')) self.assertIsNone(self.selenium.execute_script("return localStorage.getItem('django.admin.navSidebarIsOpen')")) - toggle_button = self.selenium.find_element_by_css_selector('#toggle-nav-sidebar') + toggle_button = self.selenium.find_element(By.CSS_SELECTOR, '#toggle-nav-sidebar') toggle_button.click() self.assertEqual( self.selenium.execute_script("return localStorage.getItem('django.admin.navSidebarIsOpen')"), 'false', ) self.selenium.get(self.live_server_url + reverse('test_with_sidebar:auth_user_changelist')) - main_element = self.selenium.find_element_by_css_selector('#main') + main_element = self.selenium.find_element(By.CSS_SELECTOR, '#main') self.assertNotIn('shifted', main_element.get_attribute('class').split()) - toggle_button = self.selenium.find_element_by_css_selector('#toggle-nav-sidebar') + toggle_button = self.selenium.find_element(By.CSS_SELECTOR, '#toggle-nav-sidebar') # Hidden sidebar is not reachable via keyboard navigation. - for link in self.selenium.find_elements_by_css_selector('#nav-sidebar a'): + for link in self.selenium.find_elements(By.CSS_SELECTOR, '#nav-sidebar a'): self.assertEqual(link.get_attribute('tabIndex'), '-1') toggle_button.click() - for link in self.selenium.find_elements_by_css_selector('#nav-sidebar a'): + for link in self.selenium.find_elements(By.CSS_SELECTOR, '#nav-sidebar a'): self.assertEqual(link.get_attribute('tabIndex'), '0') self.assertEqual( self.selenium.execute_script("return localStorage.getItem('django.admin.navSidebarIsOpen')"), 'true', ) self.selenium.get(self.live_server_url + reverse('test_with_sidebar:auth_user_changelist')) - main_element = self.selenium.find_element_by_css_selector('#main') + main_element = self.selenium.find_element(By.CSS_SELECTOR, '#main') self.assertIn('shifted', main_element.get_attribute('class').split()) def test_sidebar_filter_persists(self): + from selenium.webdriver.common.by import By self.selenium.get( self.live_server_url + reverse('test_with_sidebar:auth_user_changelist') @@ -170,6 +174,6 @@ class SeleniumTests(AdminSeleniumTestCase): "return sessionStorage.getItem('django.admin.navSidebarFilterValue')" ) self.assertIsNone(self.selenium.execute_script(filter_value_script)) - filter_input = self.selenium.find_element_by_css_selector('#nav-filter') + filter_input = self.selenium.find_element(By.CSS_SELECTOR, '#nav-filter') filter_input.send_keys('users') self.assertEqual(self.selenium.execute_script(filter_value_script), 'users') diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index c90358bfb2..1621c066e5 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -4578,8 +4578,9 @@ class SeleniumTests(AdminSeleniumTestCase): self.p1 = PrePopulatedPost.objects.create(title='A Long Title', published=True, slug='a-long-title') def test_login_button_centered(self): + from selenium.webdriver.common.by import By self.selenium.get(self.live_server_url + reverse('admin:login')) - button = self.selenium.find_element_by_css_selector('.submit-row input') + button = self.selenium.find_element(By.CSS_SELECTOR, '.submit-row input') offset_left = button.get_property('offsetLeft') offset_right = ( button.get_property('offsetParent').get_property('offsetWidth') - @@ -4594,52 +4595,53 @@ class SeleniumTests(AdminSeleniumTestCase): and with stacked and tabular inlines. Refs #13068, #9264, #9983, #9784. """ + from selenium.webdriver.common.by import By self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(self.live_server_url + reverse('admin:admin_views_mainprepopulated_add')) self.wait_for('.select2') # Main form ---------------------------------------------------------- - self.selenium.find_element_by_id('id_pubdate').send_keys('2012-02-18') + self.selenium.find_element(By.ID, 'id_pubdate').send_keys('2012-02-18') self.select_option('#id_status', 'option two') - self.selenium.find_element_by_id('id_name').send_keys(' the mAin nÀMë and it\'s awεšomeıııİ') - slug1 = self.selenium.find_element_by_id('id_slug1').get_attribute('value') - slug2 = self.selenium.find_element_by_id('id_slug2').get_attribute('value') - slug3 = self.selenium.find_element_by_id('id_slug3').get_attribute('value') + self.selenium.find_element(By.ID, 'id_name').send_keys(' the mAin nÀMë and it\'s awεšomeıııİ') + slug1 = self.selenium.find_element(By.ID, 'id_slug1').get_attribute('value') + slug2 = self.selenium.find_element(By.ID, 'id_slug2').get_attribute('value') + slug3 = self.selenium.find_element(By.ID, 'id_slug3').get_attribute('value') self.assertEqual(slug1, 'the-main-name-and-its-awesomeiiii-2012-02-18') self.assertEqual(slug2, 'option-two-the-main-name-and-its-awesomeiiii') self.assertEqual(slug3, 'the-main-n\xe0m\xeb-and-its-aw\u03b5\u0161ome\u0131\u0131\u0131i') # Stacked inlines ---------------------------------------------------- # Initial inline - self.selenium.find_element_by_id('id_relatedprepopulated_set-0-pubdate').send_keys('2011-12-17') + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-0-pubdate').send_keys('2011-12-17') self.select_option('#id_relatedprepopulated_set-0-status', 'option one') - self.selenium.find_element_by_id('id_relatedprepopulated_set-0-name').send_keys( + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-0-name').send_keys( ' here is a sŤāÇkeð inline ! ' ) - slug1 = self.selenium.find_element_by_id('id_relatedprepopulated_set-0-slug1').get_attribute('value') - slug2 = self.selenium.find_element_by_id('id_relatedprepopulated_set-0-slug2').get_attribute('value') + slug1 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-0-slug1').get_attribute('value') + slug2 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-0-slug2').get_attribute('value') self.assertEqual(slug1, 'here-is-a-stacked-inline-2011-12-17') self.assertEqual(slug2, 'option-one-here-is-a-stacked-inline') - initial_select2_inputs = self.selenium.find_elements_by_class_name('select2-selection') + initial_select2_inputs = self.selenium.find_elements(By.CLASS_NAME, 'select2-selection') # Inline formsets have empty/invisible forms. # Only the 4 visible select2 inputs are initialized. num_initial_select2_inputs = len(initial_select2_inputs) self.assertEqual(num_initial_select2_inputs, 4) # Add an inline - self.selenium.find_elements_by_link_text('Add another Related prepopulated')[0].click() + self.selenium.find_elements(By.LINK_TEXT, 'Add another Related prepopulated')[0].click() self.assertEqual( - len(self.selenium.find_elements_by_class_name('select2-selection')), + len(self.selenium.find_elements(By.CLASS_NAME, 'select2-selection')), num_initial_select2_inputs + 2 ) - self.selenium.find_element_by_id('id_relatedprepopulated_set-1-pubdate').send_keys('1999-01-25') + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-1-pubdate').send_keys('1999-01-25') self.select_option('#id_relatedprepopulated_set-1-status', 'option two') - self.selenium.find_element_by_id('id_relatedprepopulated_set-1-name').send_keys( + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-1-name').send_keys( ' now you haVe anöther sŤāÇkeð inline with a very ... ' 'loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog text... ' ) - slug1 = self.selenium.find_element_by_id('id_relatedprepopulated_set-1-slug1').get_attribute('value') - slug2 = self.selenium.find_element_by_id('id_relatedprepopulated_set-1-slug2').get_attribute('value') + slug1 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-1-slug1').get_attribute('value') + slug2 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-1-slug2').get_attribute('value') # 50 characters maximum for slug1 field self.assertEqual(slug1, 'now-you-have-another-stacked-inline-with-a-very-lo') # 60 characters maximum for slug2 field @@ -4647,47 +4649,47 @@ class SeleniumTests(AdminSeleniumTestCase): # Tabular inlines ---------------------------------------------------- # Initial inline - element = self.selenium.find_element_by_id('id_relatedprepopulated_set-2-0-status') + element = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-0-status') self.selenium.execute_script('window.scrollTo(0, %s);' % element.location['y']) - self.selenium.find_element_by_id('id_relatedprepopulated_set-2-0-pubdate').send_keys('1234-12-07') + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-0-pubdate').send_keys('1234-12-07') self.select_option('#id_relatedprepopulated_set-2-0-status', 'option two') - self.selenium.find_element_by_id('id_relatedprepopulated_set-2-0-name').send_keys( + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-0-name').send_keys( 'And now, with a tÃbűlaŘ inline !!!' ) - slug1 = self.selenium.find_element_by_id('id_relatedprepopulated_set-2-0-slug1').get_attribute('value') - slug2 = self.selenium.find_element_by_id('id_relatedprepopulated_set-2-0-slug2').get_attribute('value') + slug1 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-0-slug1').get_attribute('value') + slug2 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-0-slug2').get_attribute('value') self.assertEqual(slug1, 'and-now-with-a-tabular-inline-1234-12-07') self.assertEqual(slug2, 'option-two-and-now-with-a-tabular-inline') # Add an inline # Button may be outside the browser frame. - element = self.selenium.find_elements_by_link_text('Add another Related prepopulated')[1] + element = self.selenium.find_elements(By.LINK_TEXT, 'Add another Related prepopulated')[1] self.selenium.execute_script('window.scrollTo(0, %s);' % element.location['y']) element.click() self.assertEqual( - len(self.selenium.find_elements_by_class_name('select2-selection')), + len(self.selenium.find_elements(By.CLASS_NAME, 'select2-selection')), num_initial_select2_inputs + 4 ) - self.selenium.find_element_by_id('id_relatedprepopulated_set-2-1-pubdate').send_keys('1981-08-22') + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-1-pubdate').send_keys('1981-08-22') self.select_option('#id_relatedprepopulated_set-2-1-status', 'option one') - self.selenium.find_element_by_id('id_relatedprepopulated_set-2-1-name').send_keys( + self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-1-name').send_keys( r'tÃbűlaŘ inline with ignored ;"&*^\%$#@-/`~ characters' ) - slug1 = self.selenium.find_element_by_id('id_relatedprepopulated_set-2-1-slug1').get_attribute('value') - slug2 = self.selenium.find_element_by_id('id_relatedprepopulated_set-2-1-slug2').get_attribute('value') + slug1 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-1-slug1').get_attribute('value') + slug2 = self.selenium.find_element(By.ID, 'id_relatedprepopulated_set-2-1-slug2').get_attribute('value') self.assertEqual(slug1, 'tabular-inline-with-ignored-characters-1981-08-22') self.assertEqual(slug2, 'option-one-tabular-inline-with-ignored-characters') # Add an inline without an initial inline. # The button is outside of the browser frame. self.selenium.execute_script("window.scrollTo(0, document.body.scrollHeight);") - self.selenium.find_elements_by_link_text('Add another Related prepopulated')[2].click() + self.selenium.find_elements(By.LINK_TEXT, 'Add another Related prepopulated')[2].click() self.assertEqual( - len(self.selenium.find_elements_by_class_name('select2-selection')), + len(self.selenium.find_elements(By.CLASS_NAME, 'select2-selection')), num_initial_select2_inputs + 6 ) # Save and check that everything is properly stored in the database with self.wait_page_loaded(): - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.assertEqual(MainPrepopulated.objects.all().count(), 1) MainPrepopulated.objects.get( name=' the mAin nÀMë and it\'s awεšomeıııİ', @@ -4733,6 +4735,8 @@ class SeleniumTests(AdminSeleniumTestCase): The prepopulation works for existing objects too, as long as the original field is empty (#19082). """ + from selenium.webdriver.common.by import By + # Slugs are empty to start with. item = MainPrepopulated.objects.create( name=' this is the mAin nÀMë', @@ -4746,24 +4750,24 @@ class SeleniumTests(AdminSeleniumTestCase): object_url = self.live_server_url + reverse('admin:admin_views_mainprepopulated_change', args=(item.id,)) self.selenium.get(object_url) - self.selenium.find_element_by_id('id_name').send_keys(' the best') + self.selenium.find_element(By.ID, 'id_name').send_keys(' the best') # The slugs got prepopulated since they were originally empty - slug1 = self.selenium.find_element_by_id('id_slug1').get_attribute('value') - slug2 = self.selenium.find_element_by_id('id_slug2').get_attribute('value') + slug1 = self.selenium.find_element(By.ID, 'id_slug1').get_attribute('value') + slug2 = self.selenium.find_element(By.ID, 'id_slug2').get_attribute('value') self.assertEqual(slug1, 'this-is-the-main-name-the-best-2012-02-18') self.assertEqual(slug2, 'option-two-this-is-the-main-name-the-best') # Save the object with self.wait_page_loaded(): - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.get(object_url) - self.selenium.find_element_by_id('id_name').send_keys(' hello') + self.selenium.find_element(By.ID, 'id_name').send_keys(' hello') # The slugs got prepopulated didn't change since they were originally not empty - slug1 = self.selenium.find_element_by_id('id_slug1').get_attribute('value') - slug2 = self.selenium.find_element_by_id('id_slug2').get_attribute('value') + slug1 = self.selenium.find_element(By.ID, 'id_slug1').get_attribute('value') + slug2 = self.selenium.find_element(By.ID, 'id_slug2').get_attribute('value') self.assertEqual(slug1, 'this-is-the-main-name-the-best-2012-02-18') self.assertEqual(slug2, 'option-two-this-is-the-main-name-the-best') @@ -4772,22 +4776,25 @@ class SeleniumTests(AdminSeleniumTestCase): The 'collapse' class in fieldsets definition allows to show/hide the appropriate field section. """ + from selenium.webdriver.common.by import By self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(self.live_server_url + reverse('admin:admin_views_article_add')) - self.assertFalse(self.selenium.find_element_by_id('id_title').is_displayed()) - self.selenium.find_elements_by_link_text('Show')[0].click() - self.assertTrue(self.selenium.find_element_by_id('id_title').is_displayed()) - self.assertEqual(self.selenium.find_element_by_id('fieldsetcollapser0').text, "Hide") + self.assertFalse(self.selenium.find_element(By.ID, 'id_title').is_displayed()) + self.selenium.find_elements(By.LINK_TEXT, 'Show')[0].click() + self.assertTrue(self.selenium.find_element(By.ID, 'id_title').is_displayed()) + self.assertEqual(self.selenium.find_element(By.ID, 'fieldsetcollapser0').text, "Hide") def test_first_field_focus(self): """JavaScript-assisted auto-focus on first usable form field.""" + from selenium.webdriver.common.by import By + # First form field has a single widget self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) with self.wait_page_loaded(): self.selenium.get(self.live_server_url + reverse('admin:admin_views_picture_add')) self.assertEqual( self.selenium.switch_to.active_element, - self.selenium.find_element_by_id('id_name') + self.selenium.find_element(By.ID, 'id_name') ) # First form field has a MultiWidget @@ -4795,19 +4802,20 @@ class SeleniumTests(AdminSeleniumTestCase): self.selenium.get(self.live_server_url + reverse('admin:admin_views_reservation_add')) self.assertEqual( self.selenium.switch_to.active_element, - self.selenium.find_element_by_id('id_start_date_0') + self.selenium.find_element(By.ID, 'id_start_date_0') ) def test_cancel_delete_confirmation(self): "Cancelling the deletion of an object takes the user back one page." + from selenium.webdriver.common.by import By pizza = Pizza.objects.create(name="Double Cheese") url = reverse('admin:admin_views_pizza_change', args=(pizza.id,)) full_url = self.live_server_url + url self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(full_url) - self.selenium.find_element_by_class_name('deletelink').click() + self.selenium.find_element(By.CLASS_NAME, 'deletelink').click() # Click 'cancel' on the delete page. - self.selenium.find_element_by_class_name('cancel-link').click() + self.selenium.find_element(By.CLASS_NAME, 'cancel-link').click() # Wait until we're back on the change page. self.wait_for_text('#content h1', 'Change pizza') self.assertEqual(self.selenium.current_url, full_url) @@ -4818,6 +4826,7 @@ class SeleniumTests(AdminSeleniumTestCase): Cancelling the deletion of an object with relations takes the user back one page. """ + from selenium.webdriver.common.by import By pizza = Pizza.objects.create(name="Double Cheese") topping1 = Topping.objects.create(name="Cheddar") topping2 = Topping.objects.create(name="Mozzarella") @@ -4826,9 +4835,9 @@ class SeleniumTests(AdminSeleniumTestCase): full_url = self.live_server_url + url self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(full_url) - self.selenium.find_element_by_class_name('deletelink').click() + self.selenium.find_element(By.CLASS_NAME, 'deletelink').click() # Click 'cancel' on the delete page. - self.selenium.find_element_by_class_name('cancel-link').click() + self.selenium.find_element(By.CLASS_NAME, 'cancel-link').click() # Wait until we're back on the change page. self.wait_for_text('#content h1', 'Change pizza') self.assertEqual(self.selenium.current_url, full_url) @@ -4839,6 +4848,7 @@ class SeleniumTests(AdminSeleniumTestCase): """ list_editable foreign keys have add/change popups. """ + from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select s1 = Section.objects.create(name='Test section') Article.objects.create( @@ -4850,109 +4860,114 @@ class SeleniumTests(AdminSeleniumTestCase): self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(self.live_server_url + reverse('admin:admin_views_article_changelist')) # Change popup - self.selenium.find_element_by_id('change_id_form-0-section').click() + self.selenium.find_element(By.ID, 'change_id_form-0-section').click() self.wait_for_and_switch_to_popup() self.wait_for_text('#content h1', 'Change section') - name_input = self.selenium.find_element_by_id('id_name') + name_input = self.selenium.find_element(By.ID, 'id_name') name_input.clear() name_input.send_keys('<i>edited section</i>') - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.switch_to.window(self.selenium.window_handles[0]) # Hide sidebar. - toggle_button = self.selenium.find_element_by_css_selector('#toggle-nav-sidebar') + toggle_button = self.selenium.find_element(By.CSS_SELECTOR, '#toggle-nav-sidebar') toggle_button.click() - select = Select(self.selenium.find_element_by_id('id_form-0-section')) + select = Select(self.selenium.find_element(By.ID, 'id_form-0-section')) self.assertEqual(select.first_selected_option.text, '<i>edited section</i>') # Rendered select2 input. - select2_display = self.selenium.find_element_by_class_name('select2-selection__rendered') + select2_display = self.selenium.find_element(By.CLASS_NAME, 'select2-selection__rendered') # Clear button (×\n) is included in text. self.assertEqual(select2_display.text, '×\n<i>edited section</i>') # Add popup - self.selenium.find_element_by_id('add_id_form-0-section').click() + self.selenium.find_element(By.ID, 'add_id_form-0-section').click() self.wait_for_and_switch_to_popup() self.wait_for_text('#content h1', 'Add section') - self.selenium.find_element_by_id('id_name').send_keys('new section') - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.ID, 'id_name').send_keys('new section') + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.switch_to.window(self.selenium.window_handles[0]) - select = Select(self.selenium.find_element_by_id('id_form-0-section')) + select = Select(self.selenium.find_element(By.ID, 'id_form-0-section')) self.assertEqual(select.first_selected_option.text, 'new section') - select2_display = self.selenium.find_element_by_class_name('select2-selection__rendered') + select2_display = self.selenium.find_element(By.CLASS_NAME, 'select2-selection__rendered') # Clear button (×\n) is included in text. self.assertEqual(select2_display.text, '×\nnew section') def test_inline_uuid_pk_edit_with_popup(self): + from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select parent = ParentWithUUIDPK.objects.create(title='test') related_with_parent = RelatedWithUUIDPKModel.objects.create(parent=parent) self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) change_url = reverse('admin:admin_views_relatedwithuuidpkmodel_change', args=(related_with_parent.id,)) self.selenium.get(self.live_server_url + change_url) - self.selenium.find_element_by_id('change_id_parent').click() + self.selenium.find_element(By.ID, 'change_id_parent').click() self.wait_for_and_switch_to_popup() - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.switch_to.window(self.selenium.window_handles[0]) - select = Select(self.selenium.find_element_by_id('id_parent')) + select = Select(self.selenium.find_element(By.ID, 'id_parent')) self.assertEqual(select.first_selected_option.text, str(parent.id)) self.assertEqual(select.first_selected_option.get_attribute('value'), str(parent.id)) def test_inline_uuid_pk_add_with_popup(self): + from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(self.live_server_url + reverse('admin:admin_views_relatedwithuuidpkmodel_add')) - self.selenium.find_element_by_id('add_id_parent').click() + self.selenium.find_element(By.ID, 'add_id_parent').click() self.wait_for_and_switch_to_popup() - self.selenium.find_element_by_id('id_title').send_keys('test') - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.ID, 'id_title').send_keys('test') + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.switch_to.window(self.selenium.window_handles[0]) - select = Select(self.selenium.find_element_by_id('id_parent')) + select = Select(self.selenium.find_element(By.ID, 'id_parent')) uuid_id = str(ParentWithUUIDPK.objects.first().id) self.assertEqual(select.first_selected_option.text, uuid_id) self.assertEqual(select.first_selected_option.get_attribute('value'), uuid_id) def test_inline_uuid_pk_delete_with_popup(self): + from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select parent = ParentWithUUIDPK.objects.create(title='test') related_with_parent = RelatedWithUUIDPKModel.objects.create(parent=parent) self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) change_url = reverse('admin:admin_views_relatedwithuuidpkmodel_change', args=(related_with_parent.id,)) self.selenium.get(self.live_server_url + change_url) - self.selenium.find_element_by_id('delete_id_parent').click() + self.selenium.find_element(By.ID, 'delete_id_parent').click() self.wait_for_and_switch_to_popup() - self.selenium.find_element_by_xpath('//input[@value="Yes, I’m sure"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Yes, I’m sure"]').click() self.selenium.switch_to.window(self.selenium.window_handles[0]) - select = Select(self.selenium.find_element_by_id('id_parent')) + select = Select(self.selenium.find_element(By.ID, 'id_parent')) self.assertEqual(ParentWithUUIDPK.objects.count(), 0) self.assertEqual(select.first_selected_option.text, '---------') self.assertEqual(select.first_selected_option.get_attribute('value'), '') def test_inline_with_popup_cancel_delete(self): """Clicking ""No, take me back" on a delete popup closes the window.""" + from selenium.webdriver.common.by import By parent = ParentWithUUIDPK.objects.create(title='test') related_with_parent = RelatedWithUUIDPKModel.objects.create(parent=parent) self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) change_url = reverse('admin:admin_views_relatedwithuuidpkmodel_change', args=(related_with_parent.id,)) self.selenium.get(self.live_server_url + change_url) - self.selenium.find_element_by_id('delete_id_parent').click() + self.selenium.find_element(By.ID, 'delete_id_parent').click() self.wait_for_and_switch_to_popup() - self.selenium.find_element_by_xpath('//a[text()="No, take me back"]').click() + self.selenium.find_element(By.XPATH, '//a[text()="No, take me back"]').click() self.selenium.switch_to.window(self.selenium.window_handles[0]) self.assertEqual(len(self.selenium.window_handles), 1) def test_list_editable_raw_id_fields(self): + from selenium.webdriver.common.by import By parent = ParentWithUUIDPK.objects.create(title='test') parent2 = ParentWithUUIDPK.objects.create(title='test2') RelatedWithUUIDPKModel.objects.create(parent=parent) self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) change_url = reverse('admin:admin_views_relatedwithuuidpkmodel_changelist', current_app=site2.name) self.selenium.get(self.live_server_url + change_url) - self.selenium.find_element_by_id('lookup_id_form-0-parent').click() + self.selenium.find_element(By.ID, 'lookup_id_form-0-parent').click() self.wait_for_and_switch_to_popup() # Select "parent2" in the popup. - self.selenium.find_element_by_link_text(str(parent2.pk)).click() + self.selenium.find_element(By.LINK_TEXT, str(parent2.pk)).click() self.selenium.switch_to.window(self.selenium.window_handles[0]) # The newly selected pk should appear in the raw id input. - value = self.selenium.find_element_by_id('id_form-0-parent').get_attribute('value') + value = self.selenium.find_element(By.ID, 'id_form-0-parent').get_attribute('value') self.assertEqual(value, str(parent2.pk)) def test_input_element_font(self): @@ -4960,8 +4975,9 @@ class SeleniumTests(AdminSeleniumTestCase): Browsers' default stylesheets override the font of inputs. The admin adds additional CSS to handle this. """ + from selenium.webdriver.common.by import By self.selenium.get(self.live_server_url + reverse('admin:login')) - element = self.selenium.find_element_by_id('id_username') + element = self.selenium.find_element(By.ID, 'id_username') # Some browsers quotes the fonts, some don't. fonts = [ font.strip().strip('"') @@ -4973,13 +4989,14 @@ class SeleniumTests(AdminSeleniumTestCase): ) def test_search_input_filtered_page(self): + from selenium.webdriver.common.by import By Person.objects.create(name='Guido van Rossum', gender=1, alive=True) Person.objects.create(name='Grace Hopper', gender=1, alive=False) self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) person_url = reverse('admin:admin_views_person_changelist') + '?q=Gui' self.selenium.get(self.live_server_url + person_url) self.assertGreater( - self.selenium.find_element_by_id('searchbar').rect['width'], + self.selenium.find_element(By.ID, 'searchbar').rect['width'], 50, ) @@ -4987,41 +5004,42 @@ class SeleniumTests(AdminSeleniumTestCase): """ Create a chain of 'self' related objects via popups. """ + from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) add_url = reverse('admin:admin_views_box_add', current_app=site.name) self.selenium.get(self.live_server_url + add_url) base_window = self.selenium.current_window_handle - self.selenium.find_element_by_id('add_id_next_box').click() + self.selenium.find_element(By.ID, 'add_id_next_box').click() self.wait_for_and_switch_to_popup() popup_window_test = self.selenium.current_window_handle - self.selenium.find_element_by_id('id_title').send_keys('test') - self.selenium.find_element_by_id('add_id_next_box').click() + self.selenium.find_element(By.ID, 'id_title').send_keys('test') + self.selenium.find_element(By.ID, 'add_id_next_box').click() self.wait_for_and_switch_to_popup(num_windows=3) popup_window_test2 = self.selenium.current_window_handle - self.selenium.find_element_by_id('id_title').send_keys('test2') - self.selenium.find_element_by_id('add_id_next_box').click() + self.selenium.find_element(By.ID, 'id_title').send_keys('test2') + self.selenium.find_element(By.ID, 'add_id_next_box').click() self.wait_for_and_switch_to_popup(num_windows=4) - self.selenium.find_element_by_id('id_title').send_keys('test3') - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.ID, 'id_title').send_keys('test3') + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.switch_to.window(popup_window_test2) - select = Select(self.selenium.find_element_by_id('id_next_box')) + select = Select(self.selenium.find_element(By.ID, 'id_next_box')) next_box_id = str(Box.objects.get(title="test3").id) self.assertEqual(select.first_selected_option.get_attribute('value'), next_box_id) - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.switch_to.window(popup_window_test) - select = Select(self.selenium.find_element_by_id('id_next_box')) + select = Select(self.selenium.find_element(By.ID, 'id_next_box')) next_box_id = str(Box.objects.get(title="test2").id) self.assertEqual(select.first_selected_option.get_attribute('value'), next_box_id) - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.selenium.switch_to.window(base_window) - select = Select(self.selenium.find_element_by_id('id_next_box')) + select = Select(self.selenium.find_element(By.ID, 'id_next_box')) next_box_id = str(Box.objects.get(title="test").id) self.assertEqual(select.first_selected_option.get_attribute('value'), next_box_id) @@ -5029,32 +5047,33 @@ class SeleniumTests(AdminSeleniumTestCase): """ Cleanup child popups when closing a parent popup. """ + from selenium.webdriver.common.by import By self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) add_url = reverse('admin:admin_views_box_add', current_app=site.name) self.selenium.get(self.live_server_url + add_url) - self.selenium.find_element_by_id('add_id_next_box').click() + self.selenium.find_element(By.ID, 'add_id_next_box').click() self.wait_for_and_switch_to_popup() test_window = self.selenium.current_window_handle - self.selenium.find_element_by_id('id_title').send_keys('test') - self.selenium.find_element_by_id('add_id_next_box').click() + self.selenium.find_element(By.ID, 'id_title').send_keys('test') + self.selenium.find_element(By.ID, 'add_id_next_box').click() self.wait_for_and_switch_to_popup(num_windows=3) test2_window = self.selenium.current_window_handle - self.selenium.find_element_by_id('id_title').send_keys('test2') - self.selenium.find_element_by_id('add_id_next_box').click() + self.selenium.find_element(By.ID, 'id_title').send_keys('test2') + self.selenium.find_element(By.ID, 'add_id_next_box').click() self.wait_for_and_switch_to_popup(num_windows=4) self.assertEqual(len(self.selenium.window_handles), 4) self.selenium.switch_to.window(test2_window) - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.wait_until(lambda d: len(d.window_handles) == 2, 1) self.assertEqual(len(self.selenium.window_handles), 2) # Close final popup to clean up test. self.selenium.switch_to.window(test_window) - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() + self.selenium.find_element(By.XPATH, '//input[@value="Save"]').click() self.wait_until(lambda d: len(d.window_handles) == 1, 1) self.selenium.switch_to.window(self.selenium.window_handles[-1]) |
