Необработанное предупреждение об ошибке: Ошибка: Ошибка протокола (Страница.навигация): Не удается перейти к недопустимому URL-адресу, когда я передаю допустимые URL-адреса

#javascript #html #electron #puppeteer

Вопрос:

Я пытаюсь использовать кукловода, чтобы нацарапать название продукта Amazon в электронном приложении. Точный тестовый URL, который я использую, https://www.amazon.ca/gp/product/B088CK6GP1?pf_rd_r=X4CXHQ3R45BFH3T0VF4Xamp;pf_rd_p=05326fd5-c43e-4948-99b1-a65b129fdd73amp;pd_rd_r=8146d8bb-8a19-46d1-a3c8-936ace2ee64eamp;pd_rd_w=63lRtamp;pd_rd_wg=OOZ2eamp;ref_=pd_gw_unk

что работает, когда я запускаю его в отдельном тестовом файле, но не в приложении electron, и я не могу найти способ исправить ошибку

Вот файл скребка

 const puppeteer = require('puppeteer')

getname = async function(url){
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url);
    await page.waitForSelector('#productTitle')
    const name = await page.evaluate(() => {
       return document.getElementById("productTitle").innerText;
    })
    await browser.close();
    return name;
}



module.exports = { getname }; 

файл теста

 const scraper = require('./scrape.js');

const url = "https://www.amazon.ca/gp/product/B088CK6GP1?pf_rd_r=F20ADBW6SQS0H1MCSSMCamp;pf_rd_p=05326fd5-c43e-4948-99b1-a65b129fdd73amp;pd_rd_r=d92fb039-6465-47e1-bda2-6d75b9f5104eamp;pd_rd_w=UeD0Tamp;pd_rd_wg=SoFi6amp;ref_=pd_gw_unk";
const name = scraper.getname(url);
name.then(function(resualt){
    console.log(typeof resualt);
    console.log(resualt);
}) 

электронный код. Деталь, использующая скребок, находится в разделе //элемент улова:добавить

 const electron = require('electron');
const scraper = require('./scrape.js');
const url = require('url');
const path = require('path');
const { protocol } = require('electron');
const { stringify } = require('querystring');

const {app, BrowserWindow, Menu, ipcMain} = electron;

let mainWindow;
let addWindow;

process.env.NODE_ENV = 'production';

// Listen for the app to be ready


app.on('ready', function(){
    mainWindow = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        }
    });
    //load html
    mainWindow.loadURL(url.format({
        pathname: path.join(__dirname, 'mainwindow.html'),
        protocol: 'file',
        slashes: true
    }));
    //Quit app when closed
    mainWindow.on('closed', function(){
        app.quit();
    })
    //build main menu
    const mainMenu = Menu.buildFromTemplate(mainMenuTemplate);
    //insert menu
    Menu.setApplicationMenu(mainMenu)

});

//Handel add window

function createAddWindow(){
    addWindow = new BrowserWindow({
        width: 300,
        height: 200,
        title: 'Add Item',
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        }
    });

    //load html
    addWindow.loadURL(url.format({
        pathname: path.join(__dirname, 'addwindow.html'),
        protocol: 'file',
        slashes: true
    }));

    //Garbage collection
    addWindow.on('close', function(){
        addWindow = null;
    });
}

function createLogWindow(){
    addWindow = new BrowserWindow({
        width: 300,
        height: 200,
        title: 'Add Item',
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        }
    });

    //load html
    addWindow.loadURL(url.format({
        pathname: path.join(__dirname, 'login.html'),
        protocol: 'file',
        slashes: true
    }));

    //Garbage collection
    addWindow.on('close', function(){
        addWindow = null;
    });
}


//catch item:add

ipcMain.on('item:add', function(e, item){
    const link = JSON.stringify(item);
    console.log(link);
    const name = scraper.getname(link);
    name.then(function(resualt){
        console.log(resualt);
        mainWindow.webContents.send('item:add', resualt);
    })
    addWindow.close();
});

ipcMain.on('details', function(e, details){
    console.log(details["email"]);
    console.log(details["password"]);
    addWindow.close();
});



//create menu template

const mainMenuTemplate = [
    {
        label: 'Flie',
        submenu:[
            {
                label: 'Add Item',
                click(){
                    createAddWindow();
                }
            },
            {
                label: 'Clear Item',
                click(){
                    mainWindow.webContents.send('item:clear');
                }
            },
            {
                label: 'Run Check',
                accelerator: process.platform == 'darwin' ? 'Comamand R' :
                'Ctrl R',
                click(){
                    createLogWindow();
                }
            },
            {
                label: 'Quit',
                accelerator: process.platform == 'darwin' ? 'Comamand Q' :
                'Ctrl Q',
                click(){
                    app.quit();
                }
            }
        ]
    }
];

//If mac add empty object to menu
if(process.platform == 'darwin'){
    mainMenuTemplate.unshift({});
}

// add dev tool if not in production

if(process.env.NODE_ENV === 'production'){
    mainMenuTemplate.push({
        label: "Developer Tools",
        submenu:[
            {
                label: 'Toggle Dev Tools',
                accelerator: process.platform == 'darwin' ? 'Comamand I' :
                'Ctrl I',
                click(item, focusedWindow){
                    focusedWindow.toggleDevTools();
                }
            },
            {
                role: 'reload'
            }
        ]
    });
} 

Я совершенно новичок в JS,электорне и кукловоде, и я прошу прощения за любые вопиющие ошибки.

Комментарии:

1. С помощью чего регистрируется console.log(link); ?

2.«amazon.ca/gp/product/…«

Ответ №1:

 const link = JSON.stringify(item);
 

Похоже, у вас уже есть строка URL item -адреса . JSON.stringify(item) возвращает ту же строку, заключенную в кавычки. Эти кавычки делают строку URL недопустимой. Попробуйте это вместо этого:

 const link = item;
 

Или, если элемент является объектом с некоторыми toJSON() и toString() методами, возвращающими URL-адрес, попробуйте сделать следующее:

 const link = String(item);
 

Или даже это:

 const link = JSON.stringify(item).slice(1, -1);