如何隐藏壁虎驱动程序控制台窗口?



我在Windows 3.141上运行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:webdriversgeckodriver.exe', log_path='C:webdriversgeckodriver.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()

我破解了库,更改了代码, \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)

它适用于窗户。

我找到了一种方法,基于赵安国的解决方案,通过在导入的硒模块中将其修补到硒模块中,无需编辑硒文件本身即可解决此问题:

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)

我在硒模块中找不到它自己使用creationflags的地方,所以这应该不会破坏任何东西(截至目前(。

自然语言解释:

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

经过一番混乱之后,似乎添加options.add_argument('--disable-gpu')修复了它(有时(。

从 vscode 运行脚本有效,使用 Windows 任务计划程序运行脚本有效。 从Powershell或cmd运行不起作用。

相关内容

最新更新