Django/Selenium KeyError from None 'GMAIL_PASSWORD'
ERROR: test_can_get_email_link_to_log_in (functional_tests.test_login.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File ".../Django/python-tdd-book/functional_tests/test_login.py", line 36, in test_can_get_email_link_to_log_in
body = self.wait_for_email(test_email, SUBJECT)
File ".../Django/python-tdd-book/functional_tests/test_login.py", line 72, in wait_for_email
inbox.pass_(os.environ['GMAIL_PASSWORD'])
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/os.py", line 679, in __getitem__
raise KeyError(key) from None
KeyError: 'GMAIL_PASSWORD'
Я следую книге obeythetestinggoat, которая потрясающая, но я не могу пройти мимо этой ошибки, я нашел другой нерешенный вопрос здесь точно такой же, но не решенный, я пытался копаться в документах по доступу к gmail, например, "Разрешить небезопасные приложения", трижды проверял, что у меня загружены env vars, система фактически работает, т.е.. отправка писем с правильной информацией и разрешение входа для этого пользователя при нажатии на кнопку, все работает, кроме тестов, переменные env загружены в оболочке, из которой я выполняю тест, т.е. echo $GMAIL_PASSWORD, Я заметил, что версия python для этого состояния является системной python3, но когда я запускаю python3 из моего virtualenv, он показывает версию virtualenv, я пытался воссоздать мой virtualenv даже, любая помощь была бы удивительной, я потратил день на эту ошибку.
from django.core import mail
from selenium.webdriver.common.keys import Keys
import re
import os
import time
import poplib
def wait_for_email(self, test_email, subject):
if not self.staging_server:
email = mail.outbox[0]
self.assertIn(test_email, email.to)
self.assertEqual(email.subject, subject)
return email.body
email_id = None
start = time.time()
inbox = poplib.POP3_SSL('pop.gmail.com')
try:
inbox.user(test_email)
inbox.pass_(os.environ['GMAIL_PASSWORD'])
while time.time() - start < 60:
# get 10 newest messages
count, _ = inbox.stat()
for i in reversed(range(max(1, count - 10), count + 1)):
print('getting msg', i)
_, lines, __ = inbox.retr(i)
lines = [l.decode('utf8') for l in lines]
print(lines)
if f'Subject: {subject}' in lines:
email_id = i
body = '\n'.join(lines)
return body
time.sleep(10)
finally:
if email_id:
inbox.dele(email_id)
inbox.quit()
Если os.environ['GMAIL_PASSWORD']
вызывает KeyError
, это означает, что переменная окружения GMAIL_PASSWORD
не установлена в текущем окружении.
дважды проверьте переменные окружения оболочки. Команда
.env
выводит список всех переменных окружения. Проверьте наличие опечаток, заглавных/прописных букв и т.д.менее вероятно, но вы также можете проверить ваш скрипт python - может быть, что-то удаляется из среды, с помощью
del os.environ[...]
?