Я использую 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, но при этом войти в систему?