const firstId = "#someId";
// it happens that I am evaluating in a frame, rather than page
const result = await frame.evaluate((firstId) => {
// define a function that handles the issue
// returns true if element is within viewport, false otherwise
function isInViewport(el) {
// find element on page
const element = document.querySelector(el);
const rect = element.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <=
(window.innerHeight || document.documentElement.clientHeight) &&
rect.right <=
(window.innerWidth || document.documentElement.clientWidth)
);
};
return isInViewport(firstId);
}, firstId);
// back to node context
console.log(result);
4条答案
按热度按时间gz5pxeao1#
遗憾的是,剧作家还没有像 puppet 戏中的isInterSectingViewport这样的方法。(likethis)
所以剧作家的作者在Slack社区帮助我(你可以在官方网站上找到)。
我使用此方法的案例:我想知道我点击一些元素后-我滚动到另一个元素。不幸的是,boundingBox方法在我的情况下没有帮助。
也可以将此功能添加到BasePage类中
事实上,除了一行代码外,所有代码都取自GitHub Puppeteer中isInterSectingViewport方法的实现
wqnecbli2#
使用css选择器检查元素是否在视口中:
euoag5mw3#
bwntbbo34#
除了cardinalX answer之外,您还可以使用page.waitForFunction创建帮助器函数,以等待元素进入视区