node.js – NodeJS中的Puppeteer报告’错误:节点不可见或不是HTMLElement’

前端之家收集整理的这篇文章主要介绍了node.js – NodeJS中的Puppeteer报告’错误:节点不可见或不是HTMLElement’前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用’puppeteer’为NodeJS测试一个特定的网站.它似乎在大多数情况下工作正常,但有些地方报道:

Error: Node is either not visible or not an HTMLElement

以下代码选择了两种情况下都不在屏幕上的链接.

第一个链接工作正常,而第二个链接失败.

有什么不同?
两个链接都在屏幕外.

任何帮助,赞赏,
干杯,:)

示例代码

  1. const puppeteer = require('puppeteer');
  2.  
  3. const initialPage = 'https://statsregnskapet.dfo.no/departementer';
  4. const selectors = [
  5. 'div[id$="-bVMpYP"] article a','div[id$="-KcazEUq"] article a'
  6. ];
  7.  
  8. (async () => {
  9. let selector,handles,handle;
  10. const width=1024,height=1600;
  11. const browser = await puppeteer.launch({
  12. headless: false,defaultViewport: { width,height }
  13. });
  14. const page = await browser.newPage();
  15. await page.setViewport({ width,height});
  16. page.setUserAgent('UA-TEST');
  17.  
  18. // Load first page
  19. let stat = await page.goto(initialPage,{ waitUntil: 'domcontentloaded'});
  20.  
  21. // Click on selector 1 - works ok
  22. selector = selectors[0];
  23. await page.waitForSelector(selector);
  24. handles = await page.$$(selector);
  25. handle = handles[12]
  26. console.log('Clicking on: ',await page.evaluate(el => el.href,handle));
  27. await handle.click(); // OK
  28.  
  29. // Click that selector 2 - fails
  30. selector = selectors[1];
  31. await page.waitForSelector(selector);
  32. handles = await page.$$(selector);
  33. handle = handles[12]
  34. console.log('Clicking on: ',handle));
  35. await handle.click(); // Error: Node is either not visible or not an HTMLElement
  36.  
  37. })();

我试图模仿真实用户点击网站的行为,这就是我使用.click()而不是.goto()的原因,因为a标签有onclick事件.

解决方法

首先,传递给 puppeteer.launch()的defaultViewport对象没有键,只有值.

您需要将其更改为:

  1. 'defaultViewport' : { 'width' : width,'height' : height }

对于传递给page.setViewport()的对象也是如此.

您需要将此行代码更改为:

  1. await page.setViewport( { 'width' : width,'height' : height } );

三,函数page.setUserAgent()返回promise,所以你需要await这个函数

  1. await page.setUserAgent( 'UA-TEST' );

此外,你忘了在handle = handles [12]之后添加一个分号.

你应该改为:

  1. handle = handles[12];

此外,您不是在点击第一个链接后等待导航完成(page.waitForNavigation()).

点击第一个链接后,您应该添加

  1. await page.waitForNavigation();

我注意到第二页有时会挂起导航,因此您可能会发现增加默认导航超时(page.setDefaultNavigationTimeout())很有用:

  1. page.setDefaultNavigationTimeout( 90000 );

再一次,你忘了在handle = handles [12]之后添加一个分号,所以这需要改为:

  1. handle = handles[12];

请务必注意,您正在使用错误的选择器来处理您单击的第二个链接.

您的原始选择器试图选择仅对xs超小屏幕(手机)可见的元素.

您需要收集一组对您指定的视口可见的链接.

因此,您需要将第二个选择器更改为:

  1. div[id$="-KcazEUq"] article .dfo-widget-sm a

您还应该在点击第二个链接后等待导航完成:

  1. await page.waitForNavigation();

最后,您可能还想在完成程序后关闭浏览器(browser.close()):

  1. await browser.close();

Note: You might also want to look into 07008.

这是最终的解决方案:

  1. 'use strict';
  2.  
  3. const puppeteer = require( 'puppeteer' );
  4.  
  5. const initialPage = 'https://statsregnskapet.dfo.no/departementer';
  6.  
  7. const selectors = [
  8. 'div[id$="-bVMpYP"] article a','div[id$="-KcazEUq"] article .dfo-widget-sm a'
  9. ];
  10.  
  11. ( async () =>
  12. {
  13. let selector;
  14. let handles;
  15. let handle;
  16.  
  17. const width = 1024;
  18. const height = 1600;
  19.  
  20. const browser = await puppeteer.launch(
  21. {
  22. 'defaultViewport' : { 'width' : width,'height' : height }
  23. });
  24.  
  25. const page = await browser.newPage();
  26.  
  27. page.setDefaultNavigationTimeout( 90000 );
  28.  
  29. await page.setViewport( { 'width' : width,'height' : height } );
  30.  
  31. await page.setUserAgent( 'UA-TEST' );
  32.  
  33. // Load first page
  34.  
  35. let stat = await page.goto( initialPage,{ 'waitUntil' : 'domcontentloaded' } );
  36.  
  37. // Click on selector 1 - works ok
  38.  
  39. selector = selectors[0];
  40. await page.waitForSelector( selector );
  41. handles = await page.$$( selector );
  42. handle = handles[12];
  43. console.log( 'Clicking on: ',await page.evaluate( el => el.href,handle ) );
  44. await handle.click(); // OK
  45.  
  46. await page.waitForNavigation();
  47.  
  48. // Click that selector 2 - fails
  49.  
  50. selector = selectors[1];
  51. await page.waitForSelector( selector );
  52. handles = await page.$$( selector );
  53. handle = handles[12];
  54. console.log( 'Clicking on: ',handle ) );
  55. await handle.click();
  56.  
  57. await page.waitForNavigation();
  58.  
  59. await browser.close();
  60. })();

猜你在找的Node.js相关文章