inaccessible under scuttling mode

使用chromedriver打开浏览器新窗口遇到问题无法解决:

在python里使用chromedriver操作浏览器,chromedriver的配置如下:

USER_AGENTS = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
    ]

    # 从列表中随机选择一个
    User_Agent = random.choice(USER_AGENTS)
    # 配置chromedriver
    chrome_options = Options()
    # 禁止浏览器弹窗
    chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
    chrome_options.add_argument(f'user-agent={User_Agent}')
    # 解决https页面出错的问题
    # chrome_options.add_argument(self.User_Agent)
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_argument('--ignore-urlfetcher-cert-requests')
    # 关闭gpu加速
    chrome_options.add_argument('--disable-gpu')
    # 沙箱模式
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument(r'user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data')
    chrome_options.add_argument('--disable-infobars')
    chrome_options.add_argument('user-tmp=209')
     # 设置capabilities, 保留chrome devtools 中的network信息
    capabilities = DesiredCapabilities.CHROME
    # 构建webdriver的service,指定一下chromedriver的位置
    s = Service(os.path.join(modules_path, 'chromedriver.exe'))
    # 开始构建driver,我们使用chromedriver去构建,设置一下配置
    driver = webdriver.Chrome(executable_path=os.path.join(modules_path, 'chromedriver'),
                              desired_capabilities=capabilities, chrome_options=chrome_options, service=s)
    driver.implicitly_wait(10)

在主代码中,我想用driver打开一个新窗口:

driver.get("URL1")
driver.execute_script("window.open('{}')".format("URL2"))

浏览器可以正常启动,URL1也可以正常打开,但是URL2的这个新窗口就是打不开,报错为:

File "E:\XBX\science\vertex\front_end_2.py", line 280, in open_page
    driver.execute_script("window.open('{}')".format(self.loginurl))
  File "E:\anaconda\anaconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 879, in execute_script
    return self.execute(command, {
  File "E:\anaconda\anaconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 425, in execute
    self.error_handler.check_response(response)
  File "E:\anaconda\anaconda\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.JavascriptException: Message: javascript error: LavaMoat - property "open" of globalThis is inaccessible under scuttling mode. To learn more visit https://github.com/LavaMoat/LavaMoat/pull/360.
  (Session info: chrome=111.0.5563.65)

大概解决思路:
我查了相关问题解决的方法,大多就是说把scuttling mode给disable掉,但是我这么做了依然不行(也不知道是不是我没做对)。还请帮忙解决!

在scuttling模式下不能访问,造成了错误

参考GPT和自己的思路:

这个错误提示是关于Javascript执行的问题。根据错误提示中提供的链接,可以看出是LavaMoat模块的限制导致的问题。LavaMoat模块是一种JavaScript模块沙箱,可以保护浏览器免受恶意代码的攻击。在scuttling模式下,LavaMoat会禁止访问某些全局属性和方法,比如open方法,可能会导致window.open不可用。

为了解决这个问题,您可以尝试禁用LavaMoat模块,或使用其他方法打开新窗口。另外,您可以更新ChromeDriver和Chrome浏览器版本来查看是否有已知的问题和修复。建议您检查一下LavaMoat模块和版本问题,或者可以考虑使用其他模块或库来实现相同的功能。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这个错误是由于新版本的 Chrome 浏览器在默认情况下使用了 LavaMoat 安全模式(scuttling mode),它会禁止某些 JavaScript 全局属性的使用,包括 window.open() 方法。因此,您需要在 Chrome 中将 LavaMoat 安全模式禁用才能解决这个问题。

您可以尝试在 chrome_options 中添加以下选项,以禁用 LavaMoat 安全模式:

chrome_options.add_argument('--disable-features=IsolateOrigins,site-per-process')

如果这不起作用,您也可以尝试在创建 webdriver 对象时添加相应的选项:

options = {
    'args': ['--disable-features=IsolateOrigins,site-per-process']
}
driver = webdriver.Chrome(chrome_options=chrome_options, options=options)

希望这可以帮助您解决问题。

参考GPT和自己的思路,如果您需要打开一个新窗口并在其中加载一个网址,可以尝试使用以下方法:

# 打开一个新窗口
driver.execute_script("window.open('');")
# 切换到新窗口
driver.switch_to.window(driver.window_handles[-1])
# 加载网址
driver.get("https://www.example.com")

在这个例子中,我们使用 execute_script() 方法打开一个新窗口,然后使用 switch_to.window() 方法切换到新窗口,并使用 get() 方法加载网址。

请注意,每次使用 execute_script() 方法时,都会在当前窗口中执行 JavaScript 代码。因此,我们在 switch_to.window() 方法中使用 driver.window_handles[-1] 来切换到最后打开的窗口。

另外,如果您在运行程序时遇到错误,请提供具体的错误消息,以便我们更好地理解问题并提供更好的解决方案。

参考GPT和自己的思路:根据报错信息,似乎是LavaMoat对浏览器的一些限制导致了无法访问全局对象的问题。你可以尝试在Chrome的启动选项中添加 --disable-features=IsolateOrigins,site-per-process 来禁用LavaMoat的一些限制,例如:

chrome_options.add_argument('--disable-features=IsolateOrigins,site-per-process')


另外,你也可以尝试使用Chrome的命令行参数 --disable-web-security 来关闭Chrome的同源策略,例如:

chrome_options.add_argument('--disable-web-security')


请注意,这样做可能会带来一些安全风险,请谨慎使用。

该回答引用ChatGPT

如有疑问,可以回复我!

从错误信息来看,这是由于LavaMoat限制了对window.open方法的访问。LavaMoat 是一种 JavaScript 运行时安全沙箱,用于限制第三方包的访问权限。在这种情况下,你可以尝试以下方法来解决这个问题:

1、更改浏览器版本:使用不同版本的Chrome浏览器,可能不同版本没有启用LavaMoat。卸载当前的Chrome,然后安装一个较早的版本,比如Chrome 90或91。

2、尝试其他浏览器驱动程序:使用其他浏览器驱动程序,如Firefox的geckodriver或Microsoft Edge的msedgedriver。安装所需的驱动程序,并在代码中进行相应的修改,以使用新的驱动程序。

3、使用driver.switch_to.new_window()方法:这是Selenium 4中新增的功能。首先确保你的Selenium版本升级到4.0或更高。然后,可以尝试使用此方法创建新窗口,而不是window.open:



driver.get("URL1")
driver.switch_to.new_window('tab')
driver.get("URL2")

希望以上方法之一可以帮助你解决问题。如果问题仍然存在,可能需要进一步排查LavaMoat的具体限制,或寻找其他方法来实现你的需求。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题与Chrome的新安全方案有关。

尝试将 --disable-features=IsolateOrigins,site-per-process 添加到 chrome_options

将你的代码更新为:

chrome_options.add_argument('--disable-features=IsolateOrigins,site-per-process')

即可禁用Chrome的 IsolateOrigins和site-per-process模式。

完整的代码:

USER_AGENTS = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
    ]

# 从列表中随机选择一个
User_Agent = random.choice(USER_AGENTS)

# 配置chromedriver
chrome_options = Options()
# 禁止浏览器弹窗
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_argument(f'user-agent={User_Agent}')
# 解决https页面出错的问题
# chrome_options.add_argument(self.User_Agent)

chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--ignore-urlfetcher-cert-requests')
# 关闭gpu加速
chrome_options.add_argument('--disable-gpu')
# 沙箱模式
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument(r'user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data')
chrome_options.add_argument('--disable-infobars')
chrome_options.add_argument('user-tmp=209')
chrome_options.add_argument('--disable-features=IsolateOrigins,site-per-process')


# 设置capabilities, 保留chrome devtools 中的network信息
capabilities = DesiredCapabilities.CHROME

# 构建webdriver的service,指定一下chromedriver的位置
s = Service(os.path.join(modules_path, 'chromedriver.exe'))

# 开始构建driver,我们使用chromedriver去构建,设置一下配置
driver = webdriver.Chrome(executable_path=os.path.join(modules_path, 'chromedriver'),
                          desired_capabilities=capabilities, chrome_options=chrome_options, service=s)
driver.implicitly_wait(10)

如果还有问题,请在评论中讨论。
如果我的回答解决了您的问题,请采纳!

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:
  • 根据报错信息,可以看出报错是由于 Chrome 正在使用 Scuttling 模式。Scuttling 是一个用于限制 JavaScript 运行环境中全局变量的访问权限的安全模式,在这种模式下,Chrome 会限制全局对象的一些属性和方法的访问。

解决此问题可以尝试以下几种方法:

  1. 禁止 Chrome 使用 Scuttling 模式:
    您可以在 Chrome 启动时添加一个命令行参数 --disable-features=IsolateOrigins,site-per-process,来禁止 Chrome 使用 Scuttling 模式。修改代码如下:
chrome_options.add_argument('--disable-features=IsolateOrigins,site-per-process')
  1. 修改 Chrome 配置文件:
    在 Chrome 的配置文件中添加以下内容,可以禁用 Scuttling 模式:
{
    "IsolateOrigins": false,
    "site-per-process": false
}
  1. 更新 LavaMoat:
    LavaMoat 是一个用于管理 JavaScript 运行环境中全局变量的访问权限的工具,您可以尝试升级 LavaMoat 到最新版本,或者将其禁用。您可以在 Chrome 启动时添加一个命令行参数 --disable-lava-moat 来禁用 LavaMoat,修改代码如下:
chrome_options.add_argument('--disable-lava-moat')
  • 如果以上方法仍然无法解决问题,可以尝试以下一些可能会有帮助的方案:
  1. 升级 Chrome 和 ChromeDriver 版本:
    确保您正在使用最新版本的 Chrome 和 ChromeDriver,因为旧版本的程序可能会遇到不兼容性问题。

  2. 使用 Firefox 浏览器:
    如果问题仍然存在,您可以尝试使用 Firefox 浏览器,它也提供了类似于 window.open() 的 API,例如 window.open('url', '_blank')。您需要下载并安装相应的 FirefoxDriver,并将代码中的 webdriver.Chrome 修改为 webdriver.Firefox

  3. 重新安装 Selenium、Chrome 和 ChromeDriver:
    如果以上方法都无效,您可以尝试重新安装 Selenium、Chrome 和 ChromeDriver。最好先卸载所有相关软件,然后再重新下载和安装。

  4. 检查 Chrome 扩展和插件:
    有时候,Chrome 扩展和插件也可能导致浏览器无法正常工作。您可以禁用或删除所有扩展和插件,看看是否会对问题产生影响。

希望这些方法能够帮助您解决问题,如果还有其他问题,请随时提出。

参考GPT和自己的思路:

这个问题是因为最近Chrome更新了版本,在某些情况下会启用一种叫做scuttling mode的特殊模式,导致无法访问某些全局属性和方法。可能是因为你启用了某些Chrome选项,使得scuttling mode被启用了。

解决方法是在Chrome选项中禁用scuttling mode。具体方法是:在chrome_options中添加一个"--disable-site-isolation-trials"的选项即可禁用scuttling mode。修改如下:

chrome_options.add_argument('--disable-site-isolation-trials')

然后再运行你的代码试试看,应该能够正常打开URL2的窗口了。