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