Háttér

Ebben az évben elindítottuk a „Clicknium” nevű projektet, amely egy Python automatizálási könyvtár böngésző- és asztali alkalmazásokhoz. A Clicknium böngészőbővítménytől függ a böngésző vezérlése, valamint az egér- és billentyűzetműveletek szimulálása.
2022 januárja óta tilos a Manifest V2-n alapuló új bővítmények hozzáadása a Chrome Internetes áruházhoz. A Manifest V2 összes bővítménye leáll 2023 elején, még azok is, amelyeket korábban hozzáadtak a Chrome Internetes áruházhoz.

Nincs más dolgunk, mint átállni a V3-ra. Miután áttekintettük a kódunkat és a „migrációs ellenőrzőlistát”, a Clickniumra a legjelentősebb hatás az, hogy a „távoli kód tilos lesz” a „Manifest V3”-ban. Azt kérte, hogy minden logikát vegyen fel a bővítmény csomagjába, hogy jobban áttekinthesse a bővítmény viselkedését.

Hogyan futtatja a Clicknium távoli kódot a Manifest V3-ban? Íme egy rövid bemutatkozás.

Hogyan futtatja a Clicknium távoli kódot a V2-ben

Ez egy egyszerű Clicknium automatizálási eset, amely egy JS-szkriptet hajt végre a Bing oldalon, hogy a keresőmező értékét „Clicknium”-ra állítsa, és a „siker” értéket adja vissza.

from clicknium import clicknium as cc, locator
import os,sys
def main():
    tab = cc.chrome.open("bing.com")
    ele = tab.find_element(locator.bing.cn.search_sb_form_q)
    result = ele.execute_js("function SetText(st){_context$.currentElement.value = st; return \"success\"}", "SetText(\"Clicknium\")")
    print(result)
if __name__ == "__main__":
    main()

A Manifest V2-ben:

  • A háttérben: A chrome.runtime.sendMessage a kapott karakterláncot elküldi a tartalomnak.
  • A tartalomban: A „new Function(jsCode)” használata a kapott karakterlánc konvertálásához Javascript függvényévé,
const innerFunction = new Function('_context$', jsCode);
const ret = innerFunction({
    currentElement: targetElement,
    tabId: msg.tabId
});

A Manifest V3-ban a Function és eval nem érhető el. Tehát a fő probléma az, hogy hogyan lehet átalakítani a karakterláncot Javascript függvényévé.

Hogyan futtatja a Clicknium távoli kódot a V3-ban

Ennek elérésére kétféle megközelítés létezik.

1. megoldás: Használjon felugró ablakot a háttér szkriptek/oldalak utánzásához.

A Manifest V3-ban a "Service Worker" használata lecseréli a háttér szkripteket/oldalakat. Az ablakobjektumot a Service Worker nem tudja használni. De megnyithatunk egy felugró ablakot a Service workerben, hogy utánozzuk a háttér szkripteket/oldalakat.

  • 1. lépés: Nyisson meg egy felugró ablakot a Service Workerben.
// Get the URL of the popup window.
    const backgroundUrl = chrome.runtime.getURL("backgroundPage.html");
    await chrome.windows.create({
        type: "popup",
        state: "minimized",
        url: backgroundUrl,
    });
  • 2. lépés: A felugró ablakban, amikor üzenet érkezik, a chrome.debugger.sendCommand parancsot küld a felugró ablak céljának. Ezután szerezze be a függvényt az ablak objektumból.
// Get the target of the popup window
    const backgroundUrl = chrome.runtime.getURL("backgroundPage.html");
    const targets = await chrome.debugger.getTargets();
    let target;
    for (const t of targets) {
      if (target.url === backgroundUrl) {
        target = t;
      }
    }
    // Wrap up the Javascript's string, register to the window object
    const jsCodeWrapper = `window["evalFunction"] = function () {
      ${jsCode};
    };`;
    // Attach to the popup window. And send expression.
    await chrome.debugger.attach(target, "1.2");
    await chrome.debugger.sendCommand(target, "Runtime.evaluate", {
      expression: jsCodeWrapper,
    });
    // Get the function just registered in the window
    const wrapperFunc = window["evalFunction"];

3. lépés: A chrome.scripting.executeScript használata a Function futtatásához a tartalomban.

await chrome.scripting.executeScript({
      target: { tabId: msg.tabId, frameIds: [msg.frameId] },
      func:wrapperFunc,
    });

Előny:

  • A távoli kód tartalomban és háttérben működik.
  • A domainek közötti iFrame támogatása.

Hátrány:

  • Meg kell nyitni egy felugró ablakot.

2. megoldás: A Service workerben a chrome.debugger.sendCommand parancsot küld a tartalomnak.

interface CDPRuntimeEvaluateResult {
        exceptionDetails?: { exception?: { description?: string } };
        result: { value: unknown };
    }
    await chrome.debugger.attach({tabId: msg.tabId}, "1.2");
    const result = (await chrome.debugger.sendCommand(
      { tabId: msg.tabId },
      "Runtime.evaluate",
      {
        expression: js,
      }
    )) as CDPRuntimeEvaluateResult;

Előny:

  • Nem kell felugró ablakot nyitni.

Hátrány:

  • Nem támogatja a tartományok közötti iFrame-et. A domainek közötti iFrame célpontja nem szerepel az elérhető hibakeresési célok listájában, amely a chrome.debugger.getTargets fájlt használja a lekérdezéshez.
  • A távoli kód nem működik a háttérben.

Összegzés

Mivel a domainek közötti iFrame kulcsfontosságú funkció, amire szükségünk van, a Clicknium a chrome.debugger.sendCommand meghívására Solution 1: use popup window dönt.
A Clicknium 0.1.10-es verziója óta támogatja a Manifest V3-at. Kipróbálhatja a pypi weboldalon és a Clicknium VS Code Extension oldalán.

Egy dologra figyelni kell, hogy a Clicknium böngészőbővítménynek együtt kell működnie a Clicknium Python SDK-val. Ha közzétesszük a böngészőbővítményt a Chrome Internetes áruházban, az összes meglévő bővítmény automatikusan frissül a legújabb verzióra, és nem tud működni a 0.1.0 előtti SDK-val. Tehát le kell húznunk a polcokról, és várnunk kell egy ideig. Ha szeretné kipróbálni az M3 verziót, frissítsen a legújabb Python SDKra