Selenium выдает серверную ошибку 500 после щелчка (Django, pytest)
У меня есть приложение Django, которое я хочу протестировать с помощью pytest и Selenium.
Процедура, которую я пытаюсь выполнить, заключается в том, чтобы позволить Selenium войти в систему, затем перейти в меню, выбрать одну из опций. Это перенаправляет на новую страницу, которая находится нормально. Там я позволяю Selenium ввести данные и нажимаю кнопку, чтобы начать отправку. Это тоже работает и перенаправляет на третью страницу.
На этой третьей странице "Ваша заявка была создана успешно" отображается ссылка, которую пользователь может нажать, чтобы получить результаты своей заявки (эта страница . Эта ссылка отображается правильно, URL href в порядке. Но когда я позволяю Selenium щелкнуть на ней, я внезапно получаю Server Error 500
:
<html lang="en"><head>
<title>Server Error (500)</title>
</head>
<body>
<h1>Server Error (500)</h1><p></p>
</body></html>
Когда я делаю то же самое вручную, все работает нормально.
Вот мой тестовый код (немного упрощенный):
@pytest.fixture(scope="class")
def chrome_driver_init(request):
options = webdriver.ChromeOptions()
options.headless = True
options.binary_location = CHROME_BIN_PATH
driver = webdriver.Chrome(service=CHROME_SERVICE, options=options)
request.cls.driver = driver
yield
driver.quit()
@pytest.mark.django_db
@pytest.mark.usefixtures("chrome_driver_init")
class SubmissionTest(LiveServerTestCase):
def test_adding_submission(self):
self.driver.get(self.live_server_url)
username = TEST_USER
pwd = TEST_USER_PWD
User = get_user_model()
user = User.objects.create_user(username=username, password=pwd)
user.save()
# click 'Login':
self.driver.find_element(By.LINK_TEXT, "Login").click()
# now on Login page, log in via Selenium:
username_field = self.driver.find_element(By.NAME, "username")
pwd_field = self.driver.find_element(By.NAME, "password")
submit_btn = self.driver.find_element(By.ID, "form_field")
username_field.send_keys(TEST_USER)
pwd_field.send_keys(TEST_USER_PWD)
submit_btn.click()
# now logged in, go to desired menu point:
self.driver.find_element(By.LINK_TEXT, "MenuPoint 1").click()
assert self.driver.title == "MenuPoint 1" # redirection works fine
## find various fields, enter stuff, click "submit"
# check successfull:
assert self.driver.title == "Added Submission" # redirection works, as expected
## more checks => yes, this is the desired page
# find link for result page:
result_link = self.driver.find_element(By.LINK_TEXT, "click here for your results")
result_link_url = result_link.get_attribute("href")
print(result_link_url) # this is indeed the correct URL
# click link:
time.sleep(10) # wait 10 seconds => more did not help, either
result_link.click()
## now we get the Server Error :-(
print(self.driver.page_source)
Я уже пытался использовать WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "click here for your results"))).click()
, и это, кажется, даже не нажимается.
Я знаю, что ошибка 500 означает, что ошибка на стороне сервера. Но до клика сервер работает нормально. Все перенаправления до этого шага работают нормально. URL-адреса также проверяются. И вручную все работает так, как ожидалось. Я понятия не имею, как сузить проблему дальше.
Как я могу выяснить причину этой ошибки и, надеюсь, исправить ее?
Тест создает только экземпляр пользователя. Достаточно ли этого для представления, которое терпит неудачу?
Вам необходимо получить трассировку сервера, чтобы точно знать, что не так.
from django.test import override_settings
@pytest.mark.django_db
@pytest.mark.usefixtures("chrome_driver_init")
class SubmissionTest(LiveServerTestCase):
@override_settings(DEBUG=True)
def test_adding_submission(self):
...
Посмотрите Django: почему я не могу получить трассировку (в случае ошибки) при запуске тестов LiveServerTestCase? для более подробной информации.