Добавить журнал браузера селена в качестве пользовательского столбца в Pytest-CSV - PullRequest
2 голосов
/ 02 апреля 2020

Я хочу добавить журнал браузера в виде отдельных столбцов для всего теста в pytest.

Я использую pytest-csv для хранения журналов.

My pytest fixture выглядит так:

@pytest.fixture(scope='module')
def browser(request):
  chrome_options = Options()
  global b
  b = selenium.webdriver.Chrome(chrome_options=chrome_options)
  b.implicitly_wait(10)
  yield b
  b.quit()

Для добавления пользовательского столбца я добавляю эту функцию в conftest.py

def pytest_csv_register_columns(columns):
   columns['ConsoleOutput'] = b.get_log('browser')

Но она показывает NameError: name 'b' is not defined, хотя я сделал b глобальным , Как решить эту проблему?

1 Ответ

1 голос
/ 05 апреля 2020

Приспособления оцениваются после выполнения ловушки pytest_csv_register_columns, поэтому вы не можете ссылаться на них в ловушке. Если вам нужен доступ к приборам или другим внутренним элементам pytest для данных столбца, вместо этого передайте функцию. Пример из pytest-csv источников :

>>> columns['my_simple_column'] = lambda item, report: {'my column': report.nodeid}

В вашем случае это можно реализовать следующим образом:

@pytest.fixture
def browser(request):
    ...


def _output_column_builder(item, report):
    # check if the test case requests the browser fixture
    if "browser" in item.fixturenames:
        # get browser fixture value
        browser_fixture_value = item.funcargs["browser"]
        logs = browser_fixture_value.get_log('browser')
    else:
        logs = []
    return {"chrome_console": logs}


def pytest_csv_register_columns(columns):
   columns["ConsoleOutput"] = _output_column_builder

Пример теста:

def test_yt(browser):
    browser.get('https://www.youtube.com')

При запуске тестов теперь будут записываться журналы браузера в формате JSON:

$ pytest --csv out.csv --csv-columns ConsoleOutput
...
$ cat out.csv
chrome_console
"[{'level': 'WARNING', 'message': 'https://www.youtube.com/ - A cookie associated with a cross-site resource at https://accounts.google.com/ was set without the `SameSite` attribute. A future release of Chrome will only deliver cookies with cross-site requests if they are set with `SameSite=None` and `Secure`. You can review cookies in developer tools under Application>Storage>Cookies and see more details at https://www.chromestatus.com/feature/5088147346030592 and https://www.chromestatus.com/feature/5633521622188032.', 'source': 'other', 'timestamp': 1586104294304}, ...]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...