Я пытаюсь сохранить свой логин с драматургом, я прочитал документацию и попытался внедрить ее в свой код, но все равно получаю ошибки
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=50)
page = context.new_page()
page.fill("input#input-username", "demo")
page.fill("input#input-password", "demo")
page.click("button[type=submit]")
context = browser.new_context(storage_state="website1.json")
storage = context.storage_state(path="website1.json")
page = context.new_page()
NameError: имя «контекст» не определено
Супер запутался.
Главная проблема:
context.new_page()
вызовы перед объявлением переменной(context = ...
)
Должно работать нормально:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=50)
context = browser.new_context(storage_state="website1.json")
page = context.new_page()
page.goto('https://demo.opencart.com/admin')
page.fill("input#input-username", "demo")
page.fill("input#input-password", "demo")
page.click("button[type=submit]")
Также вы можете использовать Постоянную аутентификацию:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
user_data_dir = 'FULL_PATH_TO_BROWSER_PROFILE'
browser = p.chromium.launch_persistent_context(user_data_dir, headless=False)
# login only 1 time...
JFYI: opencart
использует user_token
в параметрах GET
и проверяет их. playwright
(storage_state
, user_data_dir
и т. д.) должно работать нормально. Пример:
# run docker container with playwright
docker rm -fv example && docker run --name example -it mcr.microsoft.com/playwright/python:v1.27.1-focal bash
# create empty state
echo {} >> /tmp/state.json
# run python in interactive mode
python
# Python 3.8.10 (default, Jun 22 2022, 20:18:18)
# [GCC 9.4.0] on linux
# Type "help", "copyright", "credits" or "license" for more information.
Вставьте следующий скрипт:
from time import sleep
from urllib.parse import parse_qs
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# login
browser = p.chromium.launch()
context = browser.new_context(storage_state='/tmp/state.json')
page = context.new_page()
page.goto('https://demo.opencart.com/admin')
page.fill('input#input-username', 'demo')
page.fill('input#input-password', 'demo')
page.click('button[type=submit]')
sleep(5) # just wait for redirect - you can wait for a element...
page.context.storage_state(path='/tmp/state.json')
page.screenshot(path='/tmp/after_state_init.png')
# parse user_token for GET requests
parsed_url = parse_qs(page.url)
user_token = parsed_url['user_token'][0]
print(f'user token {user_token}')
page.close()
browser.close()
with sync_playwright() as p:
# open admin dashboard without login...
browser = p.chromium.launch()
context = browser.new_context()
page = browser.new_page(storage_state='/tmp/state.json')
page.goto(f'https://demo.opencart.com/admin/index.php?route=common/dashboard&user_token={user_token}')
sleep(5)
page.screenshot(path='/tmp/open_using_saved_state.png')
page.close()
browser.close()
Теперь откройте новый терминал и скопируйте экраны из контейнера докеров:
docker cp example:/tmp/after_state_init.png ./
docker cp example:/tmp/open_using_saved_state.png ./
Вы увидите, что они одинаковы - панель администратора работает без входа в систему.
page = browser.new_page()
илиcontext = browser.new_context()
? Если вы проверите документы, вы увидите, что оба эти метода находятся в классе браузера. В любом случае, нет возможности использовать переменную до ее инициализации. Вы должны сначала создать его.