我想使用Github的Electron创建一个桌面应用程序。从本质上讲,该应用程序将打开外部网页,如google.com,并执行各种自动化任务,如点击,打字等。
到目前为止,我的index.html文件有一个带有预加载器的webview,需要一个渲染器js文件。
<webview
id="webview"
preload="./preload.js"
src="https://google.com"></webview>
<script>
require('./renderer');
</script>
这是renderer.js
const { ipcRenderer: ipc } = require('electron');
document.addEventListener('DOMContentLoaded', function(event) {
const webview = document.getElementById('webview');
const btn = document.getElementById('devtools');
});
这是preload.js
const { ipcRenderer: ipc } = require('electron');
console.log('Hey, this is being run in the context of the webview renderer process');
理想情况下,我会有一个单独的js文件,可以充当特定网站的脚本。例如,google.js可能会自动化谷歌,而facebook.js可能会自动化Facebook。例如,google.js的代码看起来像这样:
function loadHomepage () {
webview.loadURL(https://google.com);
}
function clickGoogleSearchButton () {
$('#googleSearchButtonId').click()
}
1。我如何包含这些各种脚本文件?它们会被包含在我的index.html中吗?如果用户单击按钮以自动执行Google,我如何加载谷歌的自动化脚本并让它在webview上执行操作?每个脚本显然应该可以访问我在render.js文件中创建的webview变量,这样脚本就可以执行webview.loadUrl(...)
之类的操作。2。理想情况下,用户将选择一个脚本,然后能够启动和停止该脚本。我如何才能从index.html文件到应该启动/停止的所选脚本进行通信?
TL; DR总的来说,我想完成这样的事情:
-user单击按钮以选择当前的自动化脚本
- 出现一个开始和停止按钮
- 用户点击开始按钮
- 所选脚本开始运行,在webview上执行各种操作
- 用户点击停止并卸载当前脚本
答案 0 :(得分:1)
自问这个问题已经有一段时间了,但你需要查看到网络视图的IPC消息。我有我的预加载脚本侦听各种消息并根据发送的消息采取行动。像这样:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "update.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
操作完成后,预加载脚本将回复主机:
processInboundMessage(data: WebViewMsg) {
switch (data.operation) {
case WebViewOperation.GetElementText:
this.processMessageGetElementText(data);
break;
case WebViewOperation.GetSelectedText:
this.processMessageGetSelectedText(data);
break;
case WebViewOperation.SetElementValue:
this.processMessageSetElementValue(data);
break;
case WebViewOperation.TriggerEvent:
this.processMessageTriggerClick(data);
break;
case WebViewOperation.HttpGet:
this.processMessageHttpGet(data);
break;
case WebViewOperation.HttpPost:
this.processMessageHttpPost(data);
break;
case WebViewOperation.GetJsVariableValue:
this.processMessageGetJsVariableValue(data);
break;
case WebViewOperation.AddBorder:
this.processMessageAddBorder(data);
break;
case WebViewOperation.RegisterListener:
this.processMessageRegisterListener(data);
break;
}
}
其中respondToHost(data: WebViewMsg) {
ipcRenderer.sendToHost(data.returnChannel, data);
}
是要发送回主机的有效负载,data
是主机在收到消息时检查的GUID。
HTH,
TTE