我正在抓取一个.NET站点,我需要执行的一个常见操作是:
我可以看到如何打开页面,通过browser.on('targetcreated')
等待它,然后提取数据,但是如何在使用下一组提交表单之前让前面的代码等待标签关闭参数?在提交下一个操作之前,必须先解析结果页面,因为它共享相同的URL。
这可能是一个更普遍的JS问题。
这是我当前的代码,用于检查是否需要打开页面然后单击链接。
async function fetchAnalysis(page, eventBandId, x, y) {
const ANALYSIS_TIMEOUT = 90000; // 90 seconds
const xElem = await page.$(SELECTORS.event_band_analysis_x_axis);
await xElem.type(x[1])
const yElem = await page.$(SELECTORS.event_band_analysis_y_axis);
await yElem.type(y[1])
await page.click(SELECTORS.event_band_analysis_calculate);
await page.waitForSelector(SELECTORS.spinner, { timeout:ANALYSIS_TIMEOUT, hidden: true });
// check if grid is presented straightaway
var dataTableSelector = null;
if (await page.$(SELECTORS.event_band_immediate_grid) !== null) {
console.log("Got data immediatly");
await page.screenshot({ path: './screenshots/Analysis: '+x[1]+' VS '+y[1]+'.png' });
var dataTableSelector = SELECTORS.event_band_immediate_grid;
} else {
console.log("Need to open page for data");
// await page.waitForSelector(SELECTORS.event_band_open_data_page);
await page.click(SELECTORS.event_band_open_data_page);
console.log("Clicked");
return;
}
const tableData = await utils.getTableDataAsJson(page, dataTableSelector);
await db.query('INSERT INTO vs_coding.event_band_result ( event_band_id, x_axis, y_axis, json_data ) VALUES (?,?,?,?)', [ eventBandId, x[1], y[1], JSON.stringify (tableData) ], function (error, results, fields) {
if (error) throw error;
});
console.log("Saved");
}
答案 0 :(得分:0)
这是我打开页面,抓取数据然后继续的解决方案:不要使用on.('targetcreated')
事件,而只是使用你面前的页面。
[..snip..]
await fetchAnalysis(page, eventBandId, mode.name, x, y);
resultPage = await browser.newPage();
await utils.navigate(resultPage, 'analysisViewData.aspx');
await captureTableData(eventBandId, mode, x, y, resultPage, SELECTORS.event_band_analysis_results_grid);
await resultPage.close();