Python:如何在Selenium中隐藏Chrome输出消息?

7

我想做什么:

我想使用Selenium ChromeDriver打开Chrome浏览器,但不希望Chrome信息输出到控制台。

我的做法:

from selenium import webdriver
driver = webdriver.Chrome(r'C:\Users\u1\Documents\scripts\chromedriver.exe')

输出:

C:\Users\u1\Documents\scripts>python test.py

DevTools listening on ws://127.0.0.1:50605/devtools/browser/11c9063a-44ce-4b39-9566-9e6c6270025c

我希望隐藏输出消息“DevTools listening on…”

我尝试解决这个问题的方法:

使用contextlib

from selenium import webdriver
import contextlib

with contextlib.redirect_stdout(None):
   driver = webdriver.Chrome(r'C:\Users\u1\Documents\scripts\chromedriver.exe')

Using devnull

from selenium import webdriver
import subprocess

devnull = subprocess.DEVNULL
subprocess.Popen(open_browser(), stdout=devnull, stderr=devnull)
def open_browser():
    driver = webdriver.Chrome(r'C:\Users\u1\Documents\scripts\chromedriver.exe')

使用日志级别=3

chrome_options = Options()
chrome_options.add_argument("--log-level=3")
driver = webdriver.Chrome(r'C:\Users\u1\Documents\scripts\chromedriver.exe', chrome_options=chrome_options)

但是仍然会显示消息。我如何在Python中隐藏输出消息“DevTools listening on…”?

请查看此讨论 https://stackoverflow.com/questions/52245604/devtools-listening-on-ws-127-0-0-157671-devtools-browser-8a586f7c-5f2c-4d10-8 - undetected Selenium
1
我已经检查了那个答案。那个答案没有解决这个问题。所以,我尝试用不同的方法来解决它。 - Dipankar
我使用Selenium作为自动化工具。我需要摆脱所有那些烦人的消息。 - scavenger
5个回答

13

将此选项添加到您的驱动程序中,您的问题将得到解决:

options = webdriver.ChromeOptions()<br>
options.add_experimental_option('excludeSwitches', ['enable-logging'])

@Pavan Kumar,我想在第一行代码中不应该有“<br>”。 - YoussefDir

7

有相似的问题在DevTools listening on ws://127.0.0.1:57671/devtools/browser/8a586f7c-5f2c-4d10-8174-7a7bf50e49b5 with Selenium and Python中。

答案如下:

在Python文件夹下的Lib\site-packages\selenium\webdriver\common\services.py中找到并编辑此文件。

通过添加creationflags=CREATE_NO_WINDOW的方式编辑Start()函数:

from win32process import CREATE_NO_WINDOW

def start(self):
    """
    Starts the Service.

    :Exceptions:
     - WebDriverException : Raised either when it can't start the service
       or when it can't connect to the service
    """
    try:
        cmd = [self.path]
        cmd.extend(self.command_line_args())
        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdout=self.log_file, stderr=self.log_file, creationflags=CREATE_NO_WINDOW)
    except TypeError:
        raise

完美适用于我(python3.7,selenium 3.141.0)

请注明我花了数小时搜索答案。


3
如果您发现一个问题有相似的答案,正确的做法是留下评论。不过在此之前,您需要先赚取一些声望。请在此期间避免发布重复的答案。 - tripleee
对我而言,完整路径是C:\Users\u1\AppData\Local\Programs\Python\Python37\Lib\site-packages\selenium\webdriver\common\service.py。 - Dipankar
我按照你的回答做了。但是我看到这个错误 from win32process import CREATE_NO_WINDOW ModuleNotFoundError: No module named 'win32process' - Dipankar
pip install win32process Gives me this error Collecting win32process Could not find a version that satisfies the requirement win32process (from versions: ) No matching distribution found for win32process - Dipankar
解决方案: 希望这能帮到大家: 路径:Lib\site-packages\selenium\webdriver\common\service.py(不是services.py,而是service.py)要修复导入错误,请使用以下内容: from subprocess import CREATE_NO_WINDOW(这将无法与Python 3.6或更早版本一起使用)对于旧版Python,请使用 CREATE_NO_WINDOW= 0x8000000适用于Python 3.6或更早版本 - Sam
显示剩余3条评论

3

这些是Chrome的消息,因此您需要设置Chrome-日志级别选项以隐藏这些消息,将日志级别设置为--log-level=3应该足够(仅显示致命的日志消息)。

from selenium.webdriver.chrome.options import Options
[...]
chrome-options = Options()
chrome-options.add_argument("--log-level=3")
driver = webdriver.Chrome(chrome_options=chrome-options)

另外,出于好奇,我能问一下为什么吗?


我已经使用过这段代码。该消息仍然被显示。这并没有解决我的问题。 - Dipankar
2
我在谷歌上搜索并找到了早先相同的解决方案。许多人在stackoverflow上建议使用此解决方案。但是这并没有解决我的问题。因此,我想用另一种方式来解决它。 - Dipankar
想到了一个可能有用的建议。顺便说一下,我会在问题中加入一个链接,说明你发现了一个对别人有效的“解决方案”,但对你无效。 - Bernhard
这并不隐藏消息,loglevel 0、1、2、3或4也不会。 - scavenger
@Dipankar,你说得对,它确实没有隐藏“DevTools listening on ws://…”消息,但它仍然隐藏了一些其他日志。 - YoussefDir

-1

传递--show-capture=no就可以完成任务


-2

有一种方法可以修改selenium库来解决这个问题。

您可以直接使用下一个路线进行搜索,以修改子进程的行,从而关闭控制台中出现的消息。

您需要前往主文件夹,在路径/venv/selenium/webdriver/common/service.py中修改下列行,请按照以下方式编写。

cmd = [self.path]
cmd.extend(self.command_line_args())
self.process = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, 
                                stderr=PIPE, shell=False,
                               creationflags=0x08000000)

使用这段代码,您将获得解决方案。


目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

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