gpt4 book ai didi

javascript - 使用数组中的数据在循环中运行 selenium 函数

转载 作者:行者123 更新时间:2023-12-02 21:22:00 24 4
gpt4 key购买 nike

我正在尝试在循环中运行 Selenium 脚本来填充数据库。我有一个包含 57 个位置的对象数组,我需要循环遍历它们中的每一个。如何在循环中完成它并保持异步?我基本上想循环遍历每个商店检查状态并将其保存到数据库。现在的问题是,当我在循环中运行它时,它在同步循环中运行异步代码,所以这是一个问题,因为它不等待一个任务完成,而是启动另一个任务。

<小时/>

这是我的数组的一部分在代码中表示为 Store

<小时/>
module.exports = [{ id: '1031', store: 'CANNES - LA BOCCA' },
{ id: '1009', store: 'ST ANDRÉ-LES-VERGERS' },
{ id: '1046', store: 'MARSEILLE ST MENET' },
{ id: '1071', store: 'MARIGNANE' },
{ id: '1020', store: 'IFS' },
{ id: '1032', store: 'CORMEILLES-EN-PARISIS' },
{ id: '1044', store: 'CERGY' },
{ id: '1055', store: 'HERBLAY' }];

这是我的代码

const chromeOptions = new chrome.Options().addArguments('disable-infobars', 'headless');
const chromeDesktop = {
prefs: {
profile: {
default_content_settings: {
images: 2,
},
managed_default_content_settings: {
images: 2,
},
},
},
};
const driver = new webdriver.Builder()
.withCapabilities(chromeDesktop)
.forBrowser('chrome')
.setChromeOptions(chromeOptions)
.build();

for (let index = 0; index < Stores.length; index++) {
(async function getStores(index) {
setTimeout(async () => {
try {
await driver.get('https://www.chronodrive.com');
await driver.manage().addCookie({
name: 'chronoShop',
value: `"shopId=${Stores[index].id}"`,
});
await driver.get('https://www.chronodrive.com');
await driver.wait(webdriver.until.elementLocated(webdriver.By.id('layer-overlay')), 4000);
await driver.executeScript('document.querySelector(\'#layer-overlay\').style.display = \'none\'');
await driver.executeScript('document.querySelector(\'#layer-wrapper\').style.visibility = \'hidden\'');
const text = await driver.findElement(webdriver.By.className('dispo--empty')).getText();
if (text.length > 30) {
const objA = {
store: Stores[index].store,
dispo: text,
id: Stores[index].id,
lastChecked: new Date(),
};
await Store.create(objA);
console.log(text);
} else {
const objB = {
store: Stores[index].store,
dispo: `*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`,
id: Stores[index].id,
lastChecked: new Date(),
};
await Store.create(objB);
console.log(`*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`);
}
} finally {
await driver.quit()
}
}, 1000 * index);
}(index));
}

我用于临时解决方案设置超时功能,但这不是真正的解决方案,因为有很多因素会影响该功能。

我读到我可以以某种方式使用映射函数和 Promise.all(),但我该怎么做呢?我是否为每一行代码执行 Promise.all() ?这似乎效率不高,而且写起来会很痛苦。

谢谢

最佳答案

const chromeOptions = new chrome.Options().addArguments("disable-infobars", "headless");
const chromeDesktop = {
prefs: {
profile: {
default_content_settings: {
images: 2
},
managed_default_content_settings: {
images: 2
}
}
}
};
const driver = new webdriver.Builder()
.withCapabilities(chromeDesktop)
.forBrowser("chrome")
.setChromeOptions(chromeOptions)
.build();

async function getStores(index) {
try {
await driver.get("https://www.chronodrive.com");
await driver.manage().addCookie({
name: "chronoShop",
value: `"shopId=${Stores[index].id}"`
});
await driver.get("https://www.chronodrive.com");
await driver.wait(webdriver.until.elementLocated(webdriver.By.id("layer-overlay")), 4000);
await driver.executeScript("document.querySelector('#layer-overlay').style.display = 'none'");
await driver.executeScript("document.querySelector('#layer-wrapper').style.visibility = 'hidden'");
const text = await driver.findElement(webdriver.By.className("dispo--empty")).getText();
if (text.length > 30) {
const objA = {
store: Stores[index].store,
dispo: text,
id: Stores[index].id,
lastChecked: new Date()
};
await Store.create(objA);
console.log(text);
} else {
const objB = {
store: Stores[index].store,
dispo: `*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`,
id: Stores[index].id,
lastChecked: new Date()
};
await Store.create(objB);
console.log(`*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`);
}
} finally {
await driver.quit();
}

}

(async() => {
for (let index = 0; index < Stores.length; index++) {
await getStores(index);
}
})();

关于javascript - 使用数组中的数据在循环中运行 selenium 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60818966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com