Это все еще немного раздражает. Официальный перевод и всякая ерунда, написанная некоторыми блоггерами, по сути, являются продуктом прямого перевода программного обеспечения.
Это звучит жестко и ничего не говорит, и иногда я даже не знаю, что это значит, и я действительно не могу это похвалить.
То есть вы вошли в систему один раз, и если срок действия Session и Cookie не истек, после однократного входа вам не нужно в следующий раз проходить процедуру входа снова, что сокращает время выполнения скрипта и повышает эффективность тестирования.
Я ясно дал понять?
Понял, спасибо!
Не проси других о том, что можешь сделать сам, ха-ха-ха!
Это необходимая конфигурация, данная официалом, сразу выложу ее следующим образом:
mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore
Примечание: При всем уважении, не важно, добавите вы его или нет, это ни на что не влияет и его можно игнорировать!
Каждый раз, когда вы запускаете скрипт, вам необходимо запускать процесс входа в систему.
По нашим прежним привычкам мы должны отделить логин и поместить его в публичный метод, не так ли? Но что нам здесь нужно сделать, так это усилить его?
Что это значит? Войдите в систему один раз и выполните тест напрямую, не входя в систему в следующий раз.
Сценарий:теперь я хочу Авторизоватьсякапля чернил,Затем нажмите «Написать статью».
основной:повторно используемый Авторизоватьсясостояние
Playwright Позволяет повторно использовать статус входа в систему в тестах через browserContext.storageState()
извлечение метода cookies и локально хранящиеся сертификатысостояние,чтобы избежать дублирования в нескольких тестах Авторизоваться。Пример кода:
# -*- 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'])
Эффект:
В этих двух методах, хотя вариант использования может быть успешно выполнен, открывается несколько новых окон браузера.
Файлы cookie и локально сохраненный статус аутентификации можно использовать во всех браузерах, но хранилище сеансов не может быть сохранено. Playwright не предоставляет соответствующий API и требует сохранения и загрузки вручную.
Пример кода:
# -*- 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