检测javascript是否要打开新选项卡,并强制网页在同一选项卡中打开新url(或至少截取url)

检测javascript是否要打开新选项卡,并强制网页在同一选项卡中打开新url(或至少截取url),javascript,python,selenium,google-chrome-extension,Javascript,Python,Selenium,Google Chrome Extension,我想检测一些javascript何时想要打开一个新选项卡,以便我可以强制它在当前选项卡中打开它,或者至少获取URL以在当前选项卡中加载它 我不是说删除target=“\u blank”属性,因为我处理这个案例没有问题。 上下文:我之所以想这样做,是因为在某些情况下,当我在Ubuntu服务器上以无头模式运行selenium时,使用driver.switch_将tab切换为无限期运行,最终完全不会产生任何结果(这显然是一个众所周知的错误) 因此,如果我能做到以下两件事中的任何一件,那将是一件美妙的事

我想检测一些javascript何时想要打开一个新选项卡,以便我可以强制它在当前选项卡中打开它,或者至少获取URL以在当前选项卡中加载它

我不是说删除
target=“\u blank”
属性,因为我处理这个案例没有问题。

上下文:我之所以想这样做,是因为在某些情况下,当我在Ubuntu服务器上以无头模式运行selenium时,使用driver.switch_将tab切换为无限期运行,最终完全不会产生任何结果(这显然是一个众所周知的错误)

因此,如果我能做到以下两件事中的任何一件,那将是一件美妙的事情:

  • 截取我的主窗口即将从javascript打开的选项卡的url
或者:

  • 获取我没有使用Selenium但没有调用switch_to方法的选项卡的url
是否有人在开发浏览器扩展或使用自动化框架时找到了解决此问题的方法

编辑由于一些评论导致我的Selenium webdriver的设置,这里是:

chrome_options = OptionsChrome()
chrome_options.add_experimental_option("prefs", {
   "download.default_directory": download_directory,
})
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(
  executable_path=path_to_driver,
  chrome_options=chrome_options
)
params = {'behavior': 'allow', 'downloadPath': download_directory}
driver.execute_cdp_cmd('Page.setDownloadBehavior', params)

我在Ubuntu 18.04上使用ChromeDriver 79.0.3945.16、Google Chrome 79.0.3945.130、Selenium 3.141.0。可能值得注意的是,当点击链接到pdf时,下载pdf非常有效(但如果某些javascript调用了.pdf,则不会)

您可能可以插入覆盖
窗口的js。打开
函数,或者简单地将其重新分配到location.replace。我尝试过这样做,但没有成功,我猜它没有在页面的所有脚本上全局覆盖该方法…如果覆盖得太晚,页面可能会记住window.open的初始值,或者页面可能正在从iframe调用它。无论如何,我看到有一个自动化事件,在最坏的情况下,它应该作为新Selenium中的原始调试器命令提供,但希望有更高级的方法使用它,请参阅文档。另外,对于扩展,它必须覆盖中的window.open。下面是我如何尝试覆盖默认的
window.open
函数:
var windowOpenBackup=window.open;window.open=函数(url,目标){windowOpenBackup(url,''u self')}我将contentscript中的代码(在主窗口和所有iFrame中)注入到扩展中,并在selenium中加载每个页面后立即尝试,代码被正确注入,但不起作用。。。我不知道如何使用Page.windowOpen,但我会尝试解决这个问题。或者除了
窗口还有其他功能。是否打开
?例如,在我的例子中,它打开一个新选项卡来下载一个.xls文件。可能值得注意的是,如果新选项卡上只有一个.xls文件,Selenium将无法对该内容执行任何操作。(尽管它可以关闭选项卡/窗口或导航到新的URL)发布打开选项卡的脚本会很有帮助。