如何使用 Playwright 与 Google Maps 或 OpenStreetMaps 等地图进行交互?

Posted

技术标签:

【中文标题】如何使用 Playwright 与 Google Maps 或 OpenStreetMaps 等地图进行交互?【英文标题】:How do I interact with a map like Google Maps or OpenStreetMaps with Playwright? 【发布时间】:2021-08-22 01:33:15 【问题描述】:

我一直在尝试使用 Playwright 与 Google Maps 或 OpenStreetMaps 等网站的地图组件进行交互。我尝试过结合使用 browser.mouse.move()、browser.mouse.up() 和 browser.mouse.down() 以及文字作为参数。当我运行它时,它似乎根本没有对地图做任何事情。

有没有办法用 Playwright 移动地图?

我创建了一个 GitHub 存储库,以便可以轻松地复制它。我还将在下面提供代码。 https://github.com/vincent-woodward/Playwright-Map-Interaction

const  chromium  = require("playwright");

(async () => 
  const browser = await chromium.launch( headless: false );
  const page = await browser.newPage();

  //await page.goto("https://www.google.com/maps");
  await page.goto("https://www.openstreetmap.org/#map=4/38.01/-95.84");

  await page.mouse.move(600, 300);
  await page.mouse.down();
  await page.mouse.move(1200, 450);
  await page.mouse.up();

  browser.close();
)();

【问题讨论】:

我已经尝试过同样的事情,但无法让它工作。非常令人沮丧。 【参考方案1】:

好消息!看起来这是freshly added about a day ago!

View source/test implementation

查看 PR 后,您的代码应该可以工作:

await page.mouse.move(600, 300);
await page.mouse.down();
await page.mouse.move(1200, 450); // NOTE: make sure your viewport is big enough for this
await page.mouse.up();

【讨论】:

我仍然遇到一些麻烦。我没有看到这将如何用于地图。例如,在 Google 地图中,您可以在第一次使用悬停时选择地图,但不会有一个选择器可以在第二次使用悬停时用作目标。我可能遗漏了一些东西,但是我将如何使用这些方法拖动地图呢? 为清晰起见进行了更新,并添加了有关视口大小的说明。 这对我不起作用。请参阅下面关于最终正常工作的答案。 感谢@Allen,我在图像拖动界面上进行了测试...带有动画拖动和异步资源加载的地图可能需要 steps: 5 位。【参考方案2】:

这适用于我的笔记本电脑。您还可以删除延迟的循环

const  chromium  = require("playwright");
(async () => 
  const browser = await chromium.launch( headless: false );
  const page = await browser.newPage();
 //await page.goto("https://www.google.com/maps");
  await page.goto("https://www.openstreetmap.org/#map=4/38.01/-95.84");

  await page.click('#map',force:true);//here the trick
  await page.mouse.down();

  await page.mouse.move(890, 80);
  for(var i = 0;i<1000000000;i++)
  await page.mouse.move(400, 180); 
  for(var i = 0;i<1000000000;i++)
  await page.mouse.move(700, 300); 

  await page.mouse.up();
//browser.close();
)();

【讨论】:

【参考方案3】:

我发现如果将steps: 5 添加到移动命令中,它将按预期工作。我想一些关于openstreet地图的移动地图界面的事情,并且传单期望会有一系列的鼠标移动事件。

const  chromium  = require("playwright");

(async () => 
   const browser = await chromium.launch( headless: false );
   const page = await browser.newPage();

   //await page.goto("https://www.google.com/maps");
   await page.goto("https://www.openstreetmap.org/#map=4/38.01/-95.84");

   await page.mouse.move(600, 300);
   await page.mouse.down();
   await page.mouse.move(1200, 450, steps: 5);  // <-- Change here
   await page.mouse.up();

   browser.close();
)();

【讨论】:

以上是关于如何使用 Playwright 与 Google Maps 或 OpenStreetMaps 等地图进行交互?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 的 Playwright 中,我如何获取与 ElementHandle 相关的元素(孩子、父母、祖父母、兄弟姐妹)?

python+playwright 学习-37.如何在已经打开的浏览器上继续操作,绕过登录验证码

使用 Playwright for Python,如何选择(或查找)元素?

Hello Playwright:从开发到部署

如何使用 playwright-python 处理多个页面?

Hello Playwright:与元素交互