使用多个js脚本自动化webview

时间:2017-06-03 10:36:25

标签: javascript webview automation electron

我想使用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上执行各种操作

- 用户点击停止并卸载当前脚本

1 个答案:

答案 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