python-3.x Selenium-manager.exe窗口弹出

2eafrhcq  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(122)

当尝试使用selenium设置无头浏览器时,控制台窗口会在关闭前短暂弹出,但它不是chromedriver.exe窗口,因为这是由CREATE_NO_WINDOW处理的,该窗口被称为selenium-manager.exe。
只有当我用Pyinstaller将脚本构建成可执行文件时,它才会弹出,因为当我用Python正常运行它时,它不会出现。我使用的命令是pyinstaller --windowed my_script.py,我也尝试添加--noconsole和单独使用noconsole,但没有任何工作。是什么导致了这个问题,我该如何解决?
操作系统:Windows-10-10.0.19045-SP0,Python:3.11.1, selenium :4.10.0,Pyinstaller:5.13.0

from subprocess import CREATE_NO_WINDOW
from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome, ChromeOptions

def setup_options(options: ChromeOptions) -> ChromeOptions :
    options.add_argument('--headless=new')
    options.add_argument('--disable-extensions')
    options.add_argument('--disable-infobars')
    options.add_argument('--no-sandbox')
    return options

def setup_driver() -> Chrome:
    service_chrome = Service()
    service_chrome.creation_flags = CREATE_NO_WINDOW
    options = setup_options(ChromeOptions())
    return Chrome(service=service_chrome, options=options)

driver = setup_driver()
# Do some automated work
driver.quit()

字符串
下面是窗口的截图:
x1c 0d1x的数据

b1zrtrql

b1zrtrql1#

黑客修复,导航到虚拟环境中的以下路径“.venv\lib\site-packages\selenium\webdriver\common\selenium_manager.py”。
在脚本中,SeleniumManager类中有一个名为run的方法,它启动了一个subprocess,执行selenium-manager.exe,他们忽略了,假设每个人都在控制台环境中运行脚本,或者可能没有考虑Windows用户,所以当调用subprocess.run时,他们没有添加creationflags=CREATE_NO_WINDOW
编辑如下

if sys.platform == "win32":
                completed_proc = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=subprocess.CREATE_NO_WINDOW)
            else: 
                completed_proc = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

字符串
请注意,该错误仅存在于Windows中。他们可能会在下一次更新中解决这个问题。我用修复做了合并pull request

uz75evzq

uz75evzq2#

我们可以通过在启动Chromeservice时明确地参考Chromedriver来避免这种情况。
在这个例子中,我发现路径需要是绝对路径,而不是相对路径。也许你可以用相对路径让它工作

from subprocess import CREATE_NO_WINDOW
from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome, ChromeOptions

import sys
import os

def get_path(relative_path):
    """ Get the absolute path to the resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

def setup_options(options: ChromeOptions) -> ChromeOptions:
    options.add_argument('--headless=new')
    options.add_argument('--disable-extensions')
    options.add_argument('--disable-infobars')
    options.add_argument('--no-sandbox')
    return options

def setup_driver() -> Chrome:
    service_chrome = Service((get_path('C:/absolute/path/to/driver/chromedriver.exe')))
    service_chrome.creation_flags = CREATE_NO_WINDOW
    options = setup_options(ChromeOptions())
    return Chrome(service=service_chrome, options=options)

driver = setup_driver()
# Do some automated work
driver.quit()

字符串

相关问题