Повтор после смерти браузера дожидается страницы
Проверено вживую: браузер убит через 10 с после начала запроса. Сокет умирал честно, браузер поднимался, но повтор падал на «кнопка New chat не найдена» — ensureBrowser возвращался, едва отладочный порт отозвался. У холодного браузера адрес задан аргументом командной строки, поэтому вкладка есть в списке сразу, а разметки нет ещё несколько секунд, и ветка с ожиданием после /json/new в этом случае не выполнялась вовсе. Теперь ensureBrowser в обоих случаях ждёт поле ввода — примету того, что страницей можно пользоваться, — и отдельно распознаёт страницу входа, где ждать нечего. После правки тот же опыт даёт полный ответ: запрос пережил смерть браузера и вернул 9888 символов за 140 с.
This commit is contained in:
+28
-2
@@ -1068,7 +1068,7 @@ export async function ensureBrowser(log = () => {}) {
|
||||
.then(r => r.json()).catch(() => []);
|
||||
const isChat = t => String(t.url || '').includes('deepseek');
|
||||
|
||||
if ((await tabs()).some(isChat)) return;
|
||||
if ((await tabs()).some(isChat)) return waitPageReady(log);
|
||||
// Новая вкладка в свежих сборках Chromium открывается ТОЛЬКО методом PUT:
|
||||
// на GET протокол отвечает 405 и молча ничего не делает.
|
||||
//
|
||||
@@ -1078,13 +1078,39 @@ export async function ensureBrowser(log = () => {}) {
|
||||
const r = await fetch(`http://127.0.0.1:${PORT}/json/new?${BROWSER.url}`,
|
||||
{ method: 'PUT' });
|
||||
if (!r.ok) throw new Error(`Не удалось открыть вкладку DeepSeek: ${r.status}.`);
|
||||
await sleep(4000); // дать чату прогрузиться до первого вопроса
|
||||
await sleep(1000);
|
||||
// Открыл — убедись, что открылось именно то: молчаливый промах здесь уже был.
|
||||
if (!(await tabs()).some(isChat)) {
|
||||
throw new Error(`Вкладка открылась, но не с ${BROWSER.url}. `
|
||||
+ 'Похоже, браузер не принял адрес — закройте лишние вкладки и повторите.');
|
||||
}
|
||||
log('вкладка с чатом открыта');
|
||||
await waitPageReady(log);
|
||||
}
|
||||
|
||||
// Открытая вкладка — ещё не готовый чат. У холодного браузера адрес задан
|
||||
// аргументом командной строки, вкладка в списке появляется сразу, а разметки
|
||||
// нет ещё несколько секунд: повтор после смерти браузера падал на «кнопка
|
||||
// New chat не найдена». Ждём поле ввода — единственную примету, что страницей
|
||||
// можно пользоваться.
|
||||
async function waitPageReady(log = () => {}) {
|
||||
let s;
|
||||
try { s = await Session.connect((await findChatTab()).webSocketDebuggerUrl); }
|
||||
catch { return; } // вкладку успели закрыть — разберётся вызвавший
|
||||
try {
|
||||
for (let i = 0; i < 60; i++) { // до ~60 с: холодный профиль неспешен
|
||||
const st = await s.eval(`(() => { ${PAGE_HELPERS}
|
||||
return { input: !!__input(),
|
||||
login: /log ?in|войти|sign in/i.test(document.body.innerText.slice(0, 3000)) };
|
||||
})()`).catch(() => null);
|
||||
if (st && st.input) { await sleep(800); return; }
|
||||
// Вход руками — ждать нечего: страница жива, просто мы не залогинены.
|
||||
if (st && st.login) { log('нужен вход в DeepSeek — сделайте это в окне браузера'); return; }
|
||||
await sleep(1000);
|
||||
}
|
||||
throw new Error('Вкладка DeepSeek открыта, но чат так и не появился: '
|
||||
+ 'страница не загрузилась или изменилась разметка.');
|
||||
} finally { s.close(); }
|
||||
}
|
||||
|
||||
// Приметы того, что вкладка или браузер пропали посреди работы. По ним ask()
|
||||
|
||||
Reference in New Issue
Block a user