只能在创建它们的上下文中评估JSHandles /找不到具有指定ID的上下文

时间:2018-11-19 10:45:13

标签: javascript node.js google-chrome-devtools chromium puppeteer

我正在从select -> option中选择选项,每次页面重新加载时,首先,当我单击下拉列表时,我会收集所有要选择的elementHandles。我想遍历所有这些。 我只能选择第一个,然后出现此错误:

  

JSHandles只能在创建它们的上下文中进行评估

因此,我试图在每次页面重新加载时重新创建ElementHandles。我有以下代码:

功能1:

case:click
try {
   await page.evaluate((el) => {
   return el.click()
   }, 'select');
   await page.waitFor(1500);
} catch (e) {
   console.log(e);
}
break;

case: getNavigation
let navigation = await page.$$('select > option');
break;

case: doActions
let i = 0;
for (elements in navigation) {
  let result = await function2(commands, i, page)
  i++;
}
break;

然后功能2:

async function function2(commands, i, inPage){
let page = inPage;
if (!page) {
const browser = await puppeteerLambda.getBrowser({ headless: true, slowMo: 100,  args: ['--no-sandbox', '--disable-setuid-sandbox', '--single-process', '--start-fullscreen', '--window-size=1413,749']}); //TODO: setup Proxy
        console.log('opening new page');
        page = await browser.newPage();
....
}
let navigation;
case: click
try {
await page.evaluate((el) => {
return el.click()
}, 'select');
await page.waitFor(1500);
} catch (e) {
console.log(e);
}
case: getNavigation
navigation = await page.$$('select > option'); //recreating elementHandle array

case: selectOption
const optionValue = await page.evaluate(value => value.value, navigation[i]);
await page.select('select', optionValue);
case: extract
......

我再次进入选择选项2次,然后出现此错误:

  

错误:协议错误(Runtime.callFunctionOn):找不到具有指定ID的上下文

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

根据dataSource = new org.apache.tomcat.jdbc.pool.DataSource(); dataSource.setInitialSize(5); dataSource.setMaxActive(10); dataSource.setMaxIdle(10); dataSource.setMinIdle(5); dataSource.setTimeBetweenEvictionRunsMillis(60000); dataSource.setMinEvictableIdleTimeMillis(300000); dataSource.setTestOnBorrow(true); dataSource.setValidationInterval(60000); dataSource.setValidationQuery(validationQuery); dataSource.setRemoveAbandoned(true); dataSource.setRemoveAbandonedTimeout(60000); 的{​​{3}}:

  

当JSHandles的原始框架被导航或父上下文被破坏时,它们会自动处理。

因此,每次重新加载页面时,您都需要重新获取JSHandle