我希望能够通过传递x,y坐标来获取元素的查询选择器。
或者可能有几个满足坐标的元素。
也许我可以使用mouse.click(x, y)然后获取点击的元素,但我不想让页面执行任何操作,只是获取元素的查询选择器。
有可能吗?
或者可能有几个满足坐标的元素。
也许我可以使用mouse.click(x, y)然后获取点击的元素,但我不想让页面执行任何操作,只是获取元素的查询选择器。
有可能吗?
DocumentOrShadowRoot.elementFromPoint()
。如果您需要组成一个唯一的选择器,可以尝试从 DocumentOrShadowRoot.elementsFromPoint()
处理元素数组(在下面的示例中添加更多检查,例如类、ID、属性、子节点数量和顺序等):'use strict';
const puppeteer = require('puppeteer');
(async function main() {
try {
const browser = await puppeteer.launch();
const [page] = await browser.pages();
await page.goto('https://example.org/');
console.log(await page.evaluate(() => {
return document.elementFromPoint(100, 100).tagName;
}));
console.log(await page.evaluate(() => {
return document.elementsFromPoint(100, 100)
.map(({ tagName }) => tagName).reverse().join(' > ');
}));
await browser.close();
} catch (err) {
console.error(err);
}
})();
DIV
HTML > BODY > DIV
.map()
函数中的功能,添加一些对id、类名和具有相同标签名称的兄弟元素的检查,并通过结果放大返回的字符串。 - vsemozhebuty首先,您需要考虑可能会在同一位置获得许多元素,包括主HTML元素。
首先,您需要获取所有元素:
最初的回答
Array.prototype.slice.call(document.getElementsByTagName("*"))
getClientRects
的函数,它将返回一个“框”的数组。基于此,我们可以过滤出所有在所需坐标上具有一个框的元素:最初的回答var x = 150;
var y = 1250;
Array.prototype.slice.call(document.getElementsByTagName("*")).filter(e =>
Array.prototype.slice.call(e.getClientRects()).find(rect =>
rect.top <= x && rect.bottom >= x && rect.left <= y && rect.right >= y))
evaluate
调用中执行类似这样的操作。"Original Answer"翻译成"最初的回答"。