fix: reuse external browsers for element pickup
This commit is contained in:
1 parent
927b18551f
commit
d39c77324a
4 files changed
+63
-11
No files matched your search
@@ -166,6 +166,16 @@ export class BrowserSession implements BrowserLike {
|
||||
}
|
||||
|
||||
/** 当前会话是否为外部浏览器 */
|
||||
/** 会话底层 CDP 是否已断开(缓存清理用) */
|
||||
get closed(): boolean {
|
||||
return this.transport.closed;
|
||||
}
|
||||
|
||||
/** 缓存键,外部会话排序用 */
|
||||
get sessionKey(): string {
|
||||
return this.externalKey;
|
||||
}
|
||||
|
||||
get isExternal(): boolean {
|
||||
return this.external !== null;
|
||||
}
|
||||
@@ -1370,6 +1380,16 @@ export async function externalBrowserSession(options: ExternalBrowserOptions): P
|
||||
return BrowserSession.createExternal(options);
|
||||
}
|
||||
|
||||
export function listExternalSessions(): BrowserSession[] {
|
||||
return [...externalSessionCache().values()]
|
||||
.filter((session) => session.isExternal && !session.closed)
|
||||
.sort((left, right) => right.sessionKey.localeCompare(left.sessionKey));
|
||||
}
|
||||
|
||||
export function latestExternalSession(): BrowserSession | null {
|
||||
return listExternalSessions()[0] || null;
|
||||
}
|
||||
|
||||
export function hasBrowserSession(): boolean {
|
||||
return Boolean(globalThis.__rpaBrowserWindow && !globalThis.__rpaBrowserWindow.isDestroyed());
|
||||
}
|
||||
|
||||
+25
-5
@@ -1,7 +1,13 @@
|
||||
import { app, BrowserWindow, dialog, ipcMain, shell } from "electron";
|
||||
import path from "node:path";
|
||||
import type { AppInfo, AppSettings, FlowDefinition, FlowSaveOptions, FlowSaveResult } from "../shared/types";
|
||||
import { BrowserSession, hasBrowserSession, setBrowserElementWaitMs } from "./browser/session";
|
||||
import {
|
||||
BrowserSession,
|
||||
externalBrowserSession,
|
||||
hasBrowserSession,
|
||||
latestExternalSession,
|
||||
setBrowserElementWaitMs
|
||||
} from "./browser/session";
|
||||
import "./capabilities";
|
||||
import { catalogPath, loadCatalog } from "./catalog";
|
||||
import { createDemoFlow, createExampleFlows, createFlow, deleteFlow, getFlow, listFlows, saveFlow } from "./flows";
|
||||
@@ -103,12 +109,26 @@ function registerIpc(): void {
|
||||
setBrowserElementWaitMs(settings.browserElementWaitMs);
|
||||
return settings;
|
||||
});
|
||||
ipcMain.handle("browser:pick-element", async (_event, options: { url?: string } = {}) => {
|
||||
type BrowserPickOptions = {
|
||||
url?: string;
|
||||
browser?: import("./browser/external").ExternalBrowserOptions;
|
||||
};
|
||||
|
||||
ipcMain.handle("browser:pick-element", async (_event, options: BrowserPickOptions = {}) => {
|
||||
const url = options.url?.trim();
|
||||
if (!hasBrowserSession() && !url) {
|
||||
throw new Error("请先配置或运行「打开网页」,再拾取元素");
|
||||
const browserOptions = options.browser;
|
||||
let session;
|
||||
if (browserOptions) {
|
||||
session = await externalBrowserSession(browserOptions);
|
||||
} else {
|
||||
session = latestExternalSession();
|
||||
}
|
||||
if (!session) {
|
||||
if (!hasBrowserSession() && !url) {
|
||||
throw new Error("请先配置或运行「打开网页」,再拾取元素");
|
||||
}
|
||||
session = await BrowserSession.create();
|
||||
}
|
||||
const session = await BrowserSession.create();
|
||||
const currentUrl = await session.currentUrl();
|
||||
if (url && (currentUrl === "about:blank" || currentUrl !== url)) {
|
||||
await session.navigate(url);
|
||||
|
||||
Reference in new issue
Block a user