【问题标题】:Two browsers in the same Electron window同一个 Electron 窗口中的两个浏览器
【发布时间】:2019-07-28 03:56:46
【问题描述】:

我想要一个单独的 Electron 窗口,分成两部分:

  • 左边部分是BrowserWindow正在加载https://gmail.com
  • 右边部分是另一个BrowserWindow也在加载Gmail,但我希望这两个浏览器是“独立的”,即cookies/LocalStorage/等。应该是独立的(就像我们有一个普通的 Chrome 窗口和一个隐身窗口);因此允许在左侧连接一个 Gmail 帐户/在右侧连接另一个帐户

  • 单个 Electron 窗口顶部的一些其他 UI 按钮。

此代码有效,但它创建了 2 个窗口而不是 1 个:

const { app, BrowserWindow } = require('electron')
const path = require('path')

app.once('ready', () => {
  let win = new BrowserWindow({show: false})
  win.once('show', () => { win.webContents.executeJavaScript('validateFlights()') })
  win.loadURL('https://www.gmail.com')
  win.show()

  let win2 = new BrowserWindow({show: false})
  win2.once('show', () => { win.webContents.executeJavaScript('validateFlights()') })
  win2.loadURL('https://www.gmail.com')
  win2.show()
})

如何将它们放在一个窗口中?

【问题讨论】:

  • 为什么不使用一个 BrowserWindow 和两个 iframe?
  • @Kornflexx 我认为 gmail 可能正在提供破坏帧的代码。如果您能找到解决该问题的方法(可能在电子中可能),那么这是一个有效的解决方案。
  • 可能是不可能的,间接地你想在相同的代码中运行两个应用程序。每个应用都有自己的实例
  • @Kornflexx 实际上它更复杂,因为我希望在重新启动应用程序后,左侧浏览器保持连接到帐户/右侧浏览器保持连接到另一个帐户(每个都有其 cookie) .
  • 另一个例子:你想用 Electron 创建一个“浏览器”(我们已经运行了一整圈,没错 ;)),比如 github.com/wexond/wexond:我们需要能够显示顶部的 UI 按钮(选择选项卡),以及同一窗口中的实际浏览器区域。

标签: javascript google-chrome browser electron


【解决方案1】:

有点晚了,但要在一个窗口中添加两个浏览器,您必须使用BrowserWindow.addBrowserView 而不是BrowserWindow.setBrowserView。您将获得以下信息:

const { BrowserView, BrowserWindow, app } = require('electron')
function twoViews () {
  const win = new BrowserWindow({ width: 800, height: 600 })

  const view = new BrowserView()
  win.addBrowserView(view)
  view.setBounds({ x: 0, y: 0, width: 400, height: 300 })
  view.webContents.loadURL('https://electronjs.org')

  const secondView = new BrowserView()
  win.addBrowserView(secondView)
  secondView.setBounds({ x: 400, y: 0, width: 400, height: 300 })
  secondView.webContents.loadURL('https://electronjs.org')
  app.on('window-all-closed', () => {
    win.removeBrowserView(secondView)
    win.removeBrowserView(view)
    app.quit()
  })
}

app.whenReady().then(twoViews)

创建两个BrowserView 对象后,只需将它们添加到窗口即可。您还需要在拆除应用程序时删除视图。如果不这样做,您可能会遇到分段错误。

【讨论】:

    【解决方案2】:

    你要找的是BrowserView

    来自文档:

    BrowserView 可用于将其他 Web 内容嵌入到 BrowserWindow。它就像一个子窗口,只是它相对于它的所属窗口定位。它旨在替代webview 标签。

    看起来这就是你想要的,视图可以呈现单独的 HTML 页面并将它们相对定位在同一个浏览器窗口中。

    // In the main process.
    const { BrowserView, BrowserWindow } = require('electron')
    
    let win = new BrowserWindow({ width: 800, height: 600 })
    win.on('closed', () => {
      win = null
    })
    
    let view = new BrowserView({
      webPreferences: {
        nodeIntegration: false
      }
    })
    win.setBrowserView(view)
    view.setBounds({ x: 0, y: 0, width: 300, height: 300 })
    view.webContents.loadURL('https://electronjs.org')
    

    【讨论】:

    • BrowserView 的问题在于它似乎在文档流之外。如何嵌入类似于webviewBrowserView
    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2013-10-19
    • 2020-06-06
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多