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[...] ?

Вернуться на верх