【问题标题】:How to hide geckodriver console window?如何隐藏 geckodriver 控制台窗口?
【发布时间】:2019-09-18 04:07:24
【问题描述】:

我在 Windows 10 上运行 Selenium 3.141.0 和 python 3.6.7

我的脚本以无头模式运行 Firefox 驱动程序,但仍然会弹出来自 geckodriver 的控制台窗口。

from selenium import webdriver

options = webdriver.FirefoxOptions()
options.add_argument('-headless')
driver = webdriver.Firefox(executable_path=r'c:\webdrivers\geckodriver.exe', log_path='C:\webdrivers\geckodriver.log', firefox_options=options)
driver.get('http://10.0.0.102/')

element = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, "body-home-tile-pgDevServ"))
)
button = driver.find_element_by_id('body-home-tile-pgDevServ')
button.click()
element = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, "devserv-printQ-Inp"))
)
button = driver.find_element_by_id('devserv-printQ-Inp')
button.click()

【问题讨论】:

  • 我通过获取处理程序并使用win32 api并隐藏窗口IntPtr intPtr = Win32API.FindWindow("className", null);Win32API.ShowWindow(intPtr, 0);在c#中实现了这一点

标签: python windows selenium-webdriver console geckodriver


【解决方案1】:

我找到了一种方法,基于 Anguo Zhao 的解决方案,无需编辑 selenium 文件本身即可解决此问题,方法是将其猴子修补到导入的 selenium 模块中:

import functools

from selenium import webdriver

flag = 0x08000000  # No-Window flag
# flag = 0x00000008  # Detached-Process flag, if first doesn't work
webdriver.common.service.subprocess.Popen = functools.partial(
    webdriver.common.service.subprocess.Popen, creationflags=flag)

如果您认为这可能会执行多次:

import functools
import subprocess

from selenium import webdriver

flag = 0x08000000  # No-Window flag
webdriver.common.service.subprocess.Popen = functools.partial(
    subprocess.Popen, creationflags=flag)

我在 selenium 模块中找不到一个可以单独使用 creationflags 的地方,所以这不会破坏任何东西(截至目前)。

自然语言解释:

使用functools.partial,我们创建了一个“准备好的”Popen-调用,其中已经包含creationflags-参数。
然后,我们将 selenium 尝试调用的原始 Popen 替换为准备好的 Popen
瞧,每当selenium.webdriver.common.service 中的某些东西试图创建一个Popen 对象时,它将是已准备好创建标志的对象。

【讨论】:

    【解决方案2】:

    我破解了 selenium 库,更改代码, \AppData\Roaming\Python\Python38\site-packages\selenium\webdriver\common\service.py 第 72 行及以下,

    原始代码为:

            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,
                                            stdin=PIPE)
    

    再添加两行,像这样

            try:
            cmd = [self.path]
            cmd.extend(self.command_line_args())
            CREATE_NO_WINDOW = 0x08000000
            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,
                                            stdin=PIPE)
    

    它适用于 Windows。

    【讨论】:

    • 在 python 3.8xx 上测试过,它确实有效。位置与您提到的有点不同:{安装 python 的位置}\Lib\site-packages\selenium\webdriver\common
    【解决方案3】:

    经过一番折腾之后,似乎添加options.add_argument('--disable-gpu') 可以修复它(有时)。

    从 vscode 运行脚本有效,使用 windows 任务调度程序运行脚本有效。 从 powershell 或 cmd 运行不起作用。

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 2014-11-10
      • 2014-08-23
      • 2019-07-22
      • 2012-10-14
      • 2012-10-14
      • 2010-10-10
      相关资源
      最近更新 更多