首页 > 解决方案 > 禁用在 selenium (Node.js) 中打开的选项卡

问题描述

我为 node.js 使用 selenium webdriver 并且我还加载了一个扩展,加载扩展工作正常但是当我开始我的项目时它会转到我想要的页面然后扩展立即打开一个新选项卡(谢谢你添加这个扩展 bla bla bla),我想知道是否有办法禁用我自己没有打开的标签,我试过这个:

await driver.get('https://mywebsite.com') //open my initial site
await driver.sleep(1000) //give time for the extension site to open
driver.switchTo(await driver.getAllWindowHandles()[1]) //switch to extension site
await driver.close()
driver.switchTo(await driver.getAllWindowHandles()[0]) //switch back to the main site
//rest of my code

不幸的是,这似乎不起作用,任何建议表示赞赏!

标签: javascriptnode.jsseleniumselenium-webdriverselenium-chromedriver

解决方案


无法禁用脚本未打开的选项卡。只要您不更改窗口句柄,驱动程序仍将位于原始选项卡上。您可以从那里继续执行脚本,而忽略其他打开的选项卡。

我认为我在您的代码中看到的主要问题是您将参数传递给.switchTo()而不是.window(). 应该是driver.switchTo().window(handle);

如果您想找到关闭它的新窗口,我在这个答案中编写了该代码。您需要做的就是.close()在该代码之后添加该行并切换回您在当前代码中已经拥有的原始句柄(在使用我上面的反馈修复之后)。

另一种方法很大程度上基于selenium.dev 文档

// Open the initial site
await driver.get('https://mywebsite.com')

// Store the ID of the original window
const originalWindow = await driver.getWindowHandle();

// Wait for the new window or tab
await driver.wait(async () => (await driver.getAllWindowHandles()).length === 2, 10000);

// Loop through until we find a new window handle
const windows = await driver.getAllWindowHandles();
windows.forEach(async handle => {
  if (handle !== originalWindow) {
    await driver.switchTo().window(handle);
  }
});

await driver.close()
await driver.switchTo().window(originalWindow);
// Rest of the code

推荐阅读