如何在Selenium中检测Chrome浏览器是否为无头模式?

13

我正在编写一个Selenium测试,根据Chrome浏览器是否以无头模式启动,它具有不同的行为。我的问题是,在我的测试中,如何检测浏览器是否是无头模式,以便进行条件流程控制?


我不明白为什么这个问题会有负面评价。它是一个有效的问题! - Fernando Wittmann
5个回答

7

此链接介绍了如何检测Chrome无界面模式。为了自动化测试,一些程序需要使用Chrome无界面模式来执行操作。然而,这种模式很难与真实用户的浏览行为区分开来。本文提供了一些技巧来检测Chrome无界面模式,例如检测User-Agent字符串,检查插件,以及通过WebDriver或DevTools协议来检查不同方面的行为。

driver.execute_script("return navigator.plugins.length == 0")

3
该链接的帖子已更新,现在似乎driver.execute_script("return navigator.webdriver") is True是正确的方式。 - karlicoss

3

考虑这种情况:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920,1080")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

在我的测试中,我发现当在无头模式下运行时,driver.get_window_position() 返回 {'x': 0, 'y': 0}。 然而,当没有使用无头选项运行时,默认为 {'x': 10, 'y': 10}
我正在使用这个方法来确定我的 Chrome 实例是否在无头模式下运行,只需简单地执行以下操作:
assert driver.get_window_position()['x'] == 0
assert driver.get_window_position()['y'] == 0

1

我刚找到了一个方法。

选项是一个列表,所以你需要在里面找到“--headless”元素。

opc = Options()
opc.add_argument('headless')

在这种情况下,元素在列表中的位置是[0],所以你只需要像这样做:
if (opc.arguments[0]=="--headless"):
    print("Do something")

0

我知道这个问题是关于Chrome的,但如果你正在使用Firefox,有一个更简洁的解决方案(在Firefox 106上测试过):

if driver.caps.get("moz:headless", False):
     print("Firefox is headless")

-1

当您以无头模式启动 Chrome 实例时,需要在 chromeOptions 对象中显式添加参数“--headless”。例如,如果您正在编写一个网站的测试框架,那么您可能有一些浏览器创建类,能够为您提供不同的浏览器来使用。为什么不将该参数保存为该类的附加成员呢?

如果您的代码中没有这种工厂设计,另一个更简单的选择就是

options = webdriver.ChromeOptions
options.add_argument("--headless")
print(options.arguments)

谢谢,但我并不是真的在寻找浏览器是否以无头模式启动的验证。我想在测试的条件流程中检查这一点。例如:如果是无头模式: 做这个 否则: 做那个 - DubiousDan
如果选项参数中包含“--headless”: print("headless as fuh") print("doing condintionally headless test things now") - Trevor K
我的错,我应该让情况更清晰一些。选项设置在一个通用类中,因此测试本身不可用选项。测试中唯一可用的是初始化的驱动程序。所以,考虑到我只能访问驱动程序,是否有驱动程序的属性,例如webdriver.Chrome,可以用来检测无头属性。 - DubiousDan
你有没有在这方面有什么运气?我一直在尝试查阅Selenium的文档,但很难找到只通过访问驱动程序本身就能知道驱动程序是否为无头模式的方法。 - Trevor K
很遗憾,我查看了所有已初始化的驱动程序属性,以寻找任何关于无头的指示,但是没有找到任何信息。 - DubiousDan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接