[Драматург+Python] Серия руководств (8) Использование аутентификации
[Драматург+Python] Серия руководств (8) Использование аутентификации

напиши впереди

Это все еще немного раздражает. Официальный перевод и всякая ерунда, написанная некоторыми блоггерами, по сути, являются продуктом прямого перевода программного обеспечения.

Это звучит жестко и ничего не говорит, и иногда я даже не знаю, что это значит, и я действительно не могу это похвалить.

Что это значит?

То есть вы вошли в систему один раз, и если срок действия Session и Cookie не истек, после однократного входа вам не нужно в следующий раз проходить процедуру входа снова, что сокращает время выполнения скрипта и повышает эффективность тестирования.

Я ясно дал понять?

Понял, спасибо!

Не проси других о том, что можешь сделать сам, ха-ха-ха!

Использование аутентификации

1. Основные концепции

Это необходимая конфигурация, данная официалом, сразу выложу ее следующим образом:

Язык кода:javascript
копировать
mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore

Примечание: При всем уважении, не важно, добавите вы его или нет, это ни на что не влияет и его можно игнорировать!

2. Основная идея

Каждый раз, когда вы запускаете скрипт, вам необходимо запускать процесс входа в систему.

По нашим прежним привычкам мы должны отделить логин и поместить его в публичный метод, не так ли? Но что нам здесь нужно сделать, так это усилить его?

Что это значит? Войдите в систему один раз и выполните тест напрямую, не входя в систему в следующий раз.

3. Примеры реальных боевых сценариев.

Сценарий:теперь я хочу Авторизоватьсякапля чернил,Затем нажмите «Написать статью».

основной:повторно используемый Авторизоватьсясостояние

3.1. Используйте файлы cookie для хранения.

Playwright Позволяет повторно использовать статус входа в систему в тестах через browserContext.storageState() извлечение метода cookies и локально хранящиеся сертификатысостояние,чтобы избежать дублирования в нескольких тестах Авторизоваться。Пример кода:

Язык кода:javascript
копировать
# -*- coding: utf-8 -*-
# @Time    : 2024/08/08 20:03
# @Author  : longrong.lang
# @FileName: test_authentication.py
# @Software: PyCharm
# @Cnblogs :https://www.cnblogs.com/longronglang
# @Девиз: Просто усердно работайте, а остальное оставьте Богу.
import pytest
from playwright.sync_api import expect, Page

# Создайте глобальную переменную для хранения сохраненного состояния.
storage = None


def test_login(page: Page):
    global storage
    page.goto("https://www.mdnice.com/")
    page.get_by_text("Авторизоваться / Зарегистрироваться").click()
    page.get_by_text("Почта Авторизоваться >").click()
    # Interact with login form
    page.get_by_placeholder("Адрес электронной почты, например: example@exapmle.com").fill("username@qq.com")
    page.get_by_placeholder("Пожалуйста, введите пароль").fill("пароль")
    page.get_by_text("Я хочу Авторизоваться Ла!").click()    page.wait_for_timeout(1000)
    # Утвердите, что заголовок страницы — Baidu, и вы узнаете
    ожидаем(page.get_by_text('Сообщество ежедневно обновляет статьи для получения преимуществ')).to_have_text("Сообщество ежедневно обновляет статьи для получения преимуществ")
    # Save storage state into the file.
    storage = page.context.storage_state(path="state.json")


# В других тестах создайте новый контекст и используйте ранее сохраненное состояние хранилища.
def test_write_article(page: Page) -> None:
    global storage
    """
    Способ 1
    Создайте новый контекст, используя ранее сохраненный файл состояния state.json.
    new_context = page.context.browser.new_context(storage_state=storage)
    new_page = new_context.new_page()
    """

    """
    Способ 2
    Создайте новую страницу напрямую и используйте ранее сохраненный файл состояния state.json.
    """
    new_page = page.context.browser.new_page(storage_state=storage)
    new_page.goto("https://www.mdnice.com/")
    new_page.get_by_text("Написать статью").click()


if __name__ == '__main__':
    pytest.main(['-vs', 'test_authentication.py'])

Эффект:

В этих двух методах, хотя вариант использования может быть успешно выполнен, открывается несколько новых окон браузера.

3.2. Использование хранилища сеансов.

Файлы cookie и локально сохраненный статус аутентификации можно использовать во всех браузерах, но хранилище сеансов не может быть сохранено. Playwright не предоставляет соответствующий API и требует сохранения и загрузки вручную.

Пример кода:

Язык кода:javascript
копировать
# -*- coding: utf-8 -*-
# @Time    : 2024/08/08 21:30
# @Author  : longrong.lang
# @FileName: test_session storage.py
# @Software: PyCharm
# @Cnblogs :https://www.cnblogs.com/longronglang
# @Девиз: Просто усердно работайте, а остальное оставьте Богу.
# contest.py
import os

import pytest
from playwright.sync_api import Page


# Определить глобальное
@pytest.fixture(scope="function", autouse=True)
def page(page: Page):
    page.goto("https://www.mdnice.com/")
    page.get_by_text("Авторизоваться / Зарегистрироваться").click()
    page.get_by_text("Почта Авторизоваться >").click()
    # Interact with login form
    page.get_by_placeholder("Адрес электронной почты, например: example@exapmle.com").fill("username@qq.com")
    page.get_by_placeholder("Пожалуйста, введите пароль").fill("пароль")
    page.get_by_text("Я хочу Авторизоваться Ла!").click()    page.wait_for_timeout(1000)
    # Утвердите, что заголовок страницы — Baidu, и вы узнаете
    ожидаем(page.get_by_text('Сообщество ежедневно обновляет статьи для получения преимуществ')).to_have_text("Сообщество ежедневно обновляет статьи для получения преимуществ")
    # Получить хранилище сеансов текущей страницы
    session_storage = page.evaluate("() => JSON.stringify(sessionStorage)")
    # Сохранять хранилище сеансов как переменную среды
    os.environ["SESSION_STORAGE"] = session_storage
    session_storage = os.environ["SESSION_STORAGE"]
    new_context = page.context
    new_context.add_init_script("""(storage => {
      if (window.location.hostname === 'example.com') {
        const entries = JSON.parse(storage)
        for (const [key, value] of Object.entries(entries)) {
          window.sessionStorage.setItem(key, value)
        }
      }
    })('""" + session_storage + "')")
    new_page = new_context.new_page()
    yield new_page


# test_demo.py
from playwright.sync_api import Page, expect


def test_write_article(page: Page) -> None:
    page.goto("https://www.mdnice.com/")
    page.get_by_text("Написать статью").click()
    page.wait_for_timeout(1000)


if __name__ == '__main__':
    pytest.main(['-vs', 'test_authentication.py'])

Эффект:

Написание такого способа более элегантно, по крайней мере, он не будет открывать несколько браузеров одновременно, но все равно добавляет еще одну вкладку, так что общая проблема невелика.

напиши в конце

Я прочитал статью, написанную блоггером позавчера. Она меня действительно шокировала. Она была очень подробной и вызывала сильное ощущение погружения.

Я сразу почувствовал, что у хороших технических статей тоже есть душа.

Вот вопрос, а что если писать технические статьи?

Как вам следует это написать?

End

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода