Files
fanwei-e10-api-doc/references/login-and-browser-harness.md
T
2026-06-01 14:37:23 +08:00

4.4 KiB

Login and Browser Harness

Use this reference only when live E10 access is required.

Safety requirements

  • Use an isolated Chrome instance, never the user's daily browser profile.
  • Do not store credentials in files, memory, shell history notes, examples, or final documentation.
  • Keep all E10 activity read-only.
  • Clean up the isolated browser process when finished.

Cross-platform placeholders

Placeholder Linux macOS Windows
<CHROME> google-chrome /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
<TEMP_DIR> /tmp/bh-e10 /tmp/bh-e10 %TEMP%\\bh-e10
<SCREENSHOT_DIR> /tmp /tmp %TEMP%

Start isolated Chrome

Clean stale browser-harness daemons first. Then start Chrome with a dedicated remote debugging port and profile directory.

Linux/macOS pattern:

pkill -f browser_harness.daemon 2>/dev/null; rm -f /tmp/bu-*.sock /tmp/bu-*.pid 2>/dev/null
<CHROME> --headless=new --remote-debugging-port=9223 --user-data-dir=<TEMP_DIR> --no-first-run --no-default-browser-check --window-size=1920,1080
sleep 3 && curl -s http://127.0.0.1:9223/json/version | grep webSocketDebuggerUrl

Every browser-harness command must set BU_CDP_URL in the same shell command:

export BU_CDP_URL=http://127.0.0.1:9223 && browser-harness <<'PY'
# commands
PY

Do not run export BU_CDP_URL=... on a separate line and then invoke browser-harness; the daemon may not inherit the later shell environment.

Windows pattern:

set BU_CDP_URL=http://127.0.0.1:9223 && browser-harness

Navigate and detect session state

new_tab("https://<E10_BASE>/login")
wait_for_load()
wait(3)
capture_screenshot("<SCREENSHOT_DIR>/e10_login.png")
print("URL:", js("window.location.href"))

If the URL is not /login, an existing session may already be authenticated in the isolated profile. Continue only if the current page confirms a valid E10 session.

Captcha handling

E10 captcha is expected to be a four-digit number. If visual recognition returns fewer than four digits, refresh the captcha image and capture again.

capture_screenshot("<SCREENSHOT_DIR>/e10_captcha.png")

Use available visual inspection capability to read the four digits. If incomplete, click the captcha image center and retry.

Fill login form reliably

E10 input fields may not respond to direct element.value = .... Use the native input setter and dispatch events.

import json

info = json.loads(js('''
var inputs = document.querySelectorAll("input");
var result = [];
for (var i = 0; i < inputs.length; i++) {
    var r = inputs[i].getBoundingClientRect();
    result.push({
        dataId: inputs[i].getAttribute("data-id"),
        x: Math.round(r.left + r.width/2),
        y: Math.round(r.top + r.height/2)
    });
}
var btn = document.querySelector("button");
var br = btn ? btn.getBoundingClientRect() : null;
return JSON.stringify({inputs: result, btn: br ? {x: Math.round(br.left+br.width/2), y: Math.round(br.top+br.height/2)} : null});
'''))

js('''
var ns = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;
window.__fi = function(dataId, value) {
    var el = document.querySelector("[data-id='" + dataId + "']");
    el.focus();
    el.value = "";
    ns.call(el, value);
    el.dispatchEvent(new Event("input", { bubbles: true }));
    el.dispatchEvent(new Event("change", { bubbles: true }));
    el.dispatchEvent(new Event("blur", { bubbles: true }));
};
''')

u = info["inputs"][0]
p = info["inputs"][1]
c = info["inputs"][2]
b = info["btn"]

click_at_xy(u["x"], u["y"]); wait(0.2)
js('window.__fi("' + u["dataId"] + '", "<USERNAME>")')
click_at_xy(p["x"], p["y"]); wait(0.2)
js('window.__fi("' + p["dataId"] + '", "<PASSWORD>")')
click_at_xy(c["x"], c["y"]); wait(0.2)
js('window.__fi("' + c["dataId"] + '", "<CAPTCHA>")')

print(js('''
var vals = [];
document.querySelectorAll("input").forEach(function(el){ vals.push(el.value ? "set" : "empty"); });
JSON.stringify(vals);
'''))

click_at_xy(b["x"], b["y"])
wait(5)
wait_for_load()
print("After login:", js("window.location.href"))

If still on /login, assume captcha or credentials failed. Refresh captcha and retry rather than proceeding.

Cleanup

Linux/macOS:

pkill -f "chrome.*9223" 2>/dev/null

Windows:

taskkill /F /IM chrome.exe 2>nul