Перезагрузите страницу в электронном BrowserWindow, но продолжайте сеанс - PullRequest
0 голосов
/ 05 апреля 2019

Я использую Electron для входа в стороннее веб-приложение, чтобы выполнять там какие-либо действия с использованием Javascript.

С помощью

loadURL('https://webapp/#!/login');

Я перехожу к форме входа в веб-приложения, отправляю форму иЯ вошел в систему после этого.Однако, когда я хочу перезагрузить страницу, либо повторно используя loadURL('https://webapp/otherpath'); или reload(), я снова перенаправляюсь на страницу входа, потому что Electron не поддерживает сеанс или файлы cookie.

Это мой код:

Main.mainWindow = new Main.BrowserWindow({
            show: true,
            resizable: true,
            webPreferences: {
                nodeIntegration: false,
                webviewTag: false,
                nativeWindowOpen: true,
                webSecurity: false,
                preload: path.join(__dirname, 'inject.js'),
                partition: 'persist:filestage',
                contextIsolation: false,
                enableRemoteModule: true,
}
});

Main.mainWindow.focus();
Main.mainWindow.maximize();
Main.mainWindow.webContents.openDevTools();
Main.mainWindow.loadURL(uri); //uri is startpage (not login page)

Где в inject.js я внедряю javascript, который должен обрабатывать содержимое на стороне браузера (т. Е. Сначала войти на страницу, затем добавить кнопку в DOM, добавить обработчик щелчка на указанной кнопке,обработать щелчок и т. п.)

.getWinContents().loadURL('https://webapp/#!/login');
.getWinContents().on('dom-ready', function () {
            // promises with callback specified
            me.win.getWinContents().executeJavaScript(` function login() {

                $( "input[name='email']" ).val("xxx").trigger('change')
                $( "input[name='password']" ).val("xxx").trigger('change')
                $( "button[type='submit']" ).click()

            }
            login() `).then((ans: any) => {
                me.loggedIn = true;
                //me.getAllProjects();
                me.addExportButtonOnHashChange();
            });
        });

Функция addExportButton выглядит следующим образом

private addExportButtonOnHashChange() {
        if (this.loggedIn) {
            let me = this;

            this.win.getWinContents().on('did-navigate-in-page', function () {
                me.win.getWinContents().executeJavaScript(`

function delay() {
    return new Promise(function (resolve, reject) {
    let match = window.location.href.match(/^[^#]+#([^?]*)\\??(.*)/);
        if (match[1]) {
            let expl = match[1].split("/");
            if(expl[2]) {
                $(function() {
                    resolve(expl[2]);
                });
            }
        }
    });
}

delay()
    .then(function (v) {
        return (v);
    });

`)
                    .then((ans: any) => {
                        if (ans !== null) {
                            if (ans) {
                                me.onProjectPage();
                            }
                        }
                    });
            });
        }
    }

, которая добавляет кнопку в специальную часть этого веб-сайта, и onProjectPage должен перезагрузитьстраница для выполнения JS каждый раз.(В противном случае переменные уже были объявлены, и это приносит)

(я использую TypeScript, который компилируется до «commonjs», на случай, если вам интересны некоторые фрагменты здесь)

Вопрос теперь: Как я могу перезагрузить страницу BrowserWindow, но при этом войти в систему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...