#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);
?
Ответ №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);