Как правильно передать несколько параметров в assert python?

Рейтинг: 0Ответов: 1Опубликовано: 16.02.2023

У меня есть цикл, который проверяет название товара

for search in search_products:
        assert (("наушники" or "гарнитура") in search.text.lower()), f'Error in product - \
                                                    {search.text, browser.save_screenshot("./screensots/screen3.png")}'

Но проверяется только первый параметр и я получаю ошибку

AssertionError: Error in product -                                                         ('-72%\nOzon\n560 ₽1 990 ₽\n10548 отзывы\nбеспроводная телефонная гарнитура TWS F9-5, bluetooth гарнитура для смартфона с микрофоном')

Как можно сделать проверку обоих параметров?

Ответы

▲ 4Принят

or в Python не работает так как в естественных языках, т.е. "наушники" или "гарнитура" входят в search.text.lower() нельзя напрямую перевести в код на Python. Оператор or так не работает, он просто проверяет что одно из значений (справа или слева от него) истинно, но не умеет как-то передавать сначала одно потом другое значение в in (или куда-то еще).

Для сравнения посмотрите похожую проблему, с которой сталкиваются новички: Неправильно работает сравнение переменной с несколькими значениями через or (вкратце, часто пытаются проверить равенство переменной одному из нескольких значений через a == "X" or "Y" или a == ("X" or "Y") - ни тот ни другой вариант не работает).

Фактически нужен прямо цикл, где каждый элемент из набора ("наушники", "гарнитура") берется, и проверяется его наличие в search.text.lower(). Потом нужно проверить, что хотя бы один результат сравнения равен True. Это можно реализовать через выражение-генератор, потом результат проверить через any:

assert any(item in search.text.lower() for item in ("наушники", "гарнитура"))