Size: a a a

testing_in_python

2021 June 04

АК

Александр Кот... in testing_in_python
Любопытно - а так ли нужен этот python-dotenv? Ведь можно ini-файлы поописвывать с конфигами и config_parser’ом их парсить…
источник

EB

Evgenii B in testing_in_python
У этой либы есть возможность вычитать .env в словарь, если хочется. По сути аналог
источник

А

Андрей in testing_in_python
Я имею виду вот такая структура, где надо указывать сервер и роль пользователя (указываю в аргументах), к примеру prod, root или test, user
источник

А

Андрей in testing_in_python
источник

EB

Evgenii B in testing_in_python
И что тут принципиально сложного :)
источник

А

Андрей in testing_in_python
Ну я просто видел файлы окружения, там совсем простая структура..
источник

EB

Evgenii B in testing_in_python
У тебя может быть словарь, ты его выгрузил и имеешь к нему доступ. Далее, если ты гоняешь тесты по всем ролям, то в тестах параметризуешь роли, root / user / no_access и в тестах это будут ключи, которые будут меняться, но обращаться к этому словарю
источник

EB

Evgenii B in testing_in_python
Идея не в том, чтобы использовать мою либу, идея в том, чтобы адресовать повторяющиеся части каких-то шагов теста в виде конфигурации. Если у тебя есть класс ApiAccess , и ты его везде используешь, ты в некотором роде уже решил проблему хардкода в своих тестах
источник

АБ

Александр Бушманов... in testing_in_python
С точки зрения безопасности просто не стоит креды в репе хранить. И в этом плане переменные окружения очень удобны как минимум тем, что они настраиваются для конкретного окружения.
источник

V

Vita in testing_in_python
Куда потом yield-ишь?
источник

V

Vita in testing_in_python
А, не заметил.
источник

Ф

Филипп in testing_in_python
В свете вчерашних разговоров о ошибке и локаторах. Оч страшно?
источник

EB

Evgenii B in testing_in_python
Страшновато
источник

EB

Evgenii B in testing_in_python
А зачем ты 2 раза ловишь Stale?
источник

EB

Evgenii B in testing_in_python
В try блоке у тебя код, который не рейзит Stale exception , я бы сделал try блок поменьше вокруг селениум кода
источник

EB

Evgenii B in testing_in_python
Предикат булевый вынес бы в переменную is_report_id_incremented чтобы было понятнее что ты проверяешь сразу
источник

EB

Evgenii B in testing_in_python
Разные инты описывают у тебя количество повторений, как и секунды для time.sleep() вынеси это в качестве конфигурационных значений и ссылайся на эти константы.

У тебя один break в цикле, но цикла 2 — ты правда хочешь 20 раз проверять одно и то же?
источник

Ф

Филипп in testing_in_python
Сперва я жду когда появится элемент с нужным мне текстом, среди массива элементов. Страница обновляет форму раз в 1-2 секунды. Второй раз я уже обрабатываю ошибку, которую можно словить при клике на кнопку, которая находится в этой же форме
источник

EB

Evgenii B in testing_in_python
def download():
   REPORT_DATA_STRING_XPATH = //*[contains(text(), f'{last_report_id+1}')]
   get_element(REPORT_DATA_STRING_XPATH)
   get_element(DOWNLOAD_BTN).click()

def get_element(xpath_locator):
   element = WebDriverWait(driver, 10).until(
       EC.presence_of_element_located((By.XPATH, xpath_locator)
   )
   return element
источник

EB

Evgenii B in testing_in_python
это псевдокод, который должен будет убрать все stale reference exceptions, если нет, тогда в get_element() расширится до:

def get_element(xpath_locator):
   waiter = WebDriverWait(driver, 10)
   for r in range(RETRIES):
       try:
           element = waiter.until(
           EC.presence_of_element_located((By.XPATH, xpath_locator)
           )
           break
       except StaleElementReferenceException as e:
           if r == RETRIES - 1:
               raise    
   return element
источник