对于剧作家来说,我还是个新手,对某些东西很着迷.我正在使用它来自动化一个原本需要手动输入数据的过程.具体流程如下:
- 循环访问数组中的多个对象
- 在页面上找到包含对象名称(Str)的类别并单击它,然后单击另一个打开对话框的按钮
- 在打开对话框中,找到包含在也包含字符串名称的表单域中的输入(该对话框基本上是具有价格输入的多个表单),并使用新的价格值填充该输入
- 关闭该对话框,返回项目,然后移至下一个项目
我对此过程的简化代码如下:
const playwright = require("playwright");
const state = {
str: "",
step: "",
};
var page;
var frameLocator;
var items = [
{
str: "A50",
price: 0,
},
{
str: "AP2",
price: 23,
},
{
str: "B25",
price: 406,
},
{
str: "C72",
price: 309,
},
{
str: "CB1",
price: 0,
},
];
var results = [];
async () => {
const browser = await playwright.chromium.launch({
headless: false,
slowMo: 1000,
});
const url = "https://example.com";
const context = await browser.newContext();
page = await context.newPage();
page.on("domcontentloaded", async (e) => {
await page.waitForSelector("#ContentFrame");
frameLocator = await page.locator("#ContentFrame").frameLocator(":scope");
for (let i = 0; i < items.length; i++) {
var result = await updatePrice(items[i].str, items[i].price);
results.push(result);
}
});
};
async function updatePrice(str, price) {
state.str = str;
var item = {
str: str,
newPrice: price,
};
state.step = "Finding Category";
const category = await frameLocator
.locator(".section")
.filter({ hasText: str });
await category
.elementHandle({ timeout: 5000 })
.then(async () => {
item.cat = await category.locator(".info-title").innerText();
await category.click();
await page.locator("#toolbar button").first().click();
state.step = "Finding input";
var input = await page
.locator(".dialog .multifield")
.filter({ hasText: str })
.locator("input");
state.step = "Updating input";
await page.waitForTimeout(2000);
await input.evaluateHandle((node, price) => {
node.value = price;
}, price);
state.step = "Done updating input";
await page.locator(".dialog .submit").click();
})
.catch(async (err) => {
//Some other irrelevant error handling logic goes here
});
return item;
}
代码运行得很好,但在整个for循环中的任意点,浏览器页面都会崩溃(只会出现"页面崩溃"错误,浏览器不会关闭)--不是每次我运行循环时,而是大多数时候.您可以看到,我已经添加了一些Slomo并在填充输入之前等待一段时间,以try 降低脚本速度,但我不确定这是有帮助还是有坏处.这段代码中有什么我可以重构以减少或消除页面崩溃的地方吗?谢谢!