使用 selenium(webdriver) 的 Python 程序不能作为单个和非控制台 exe 文件运行 (pyinstaller)

标签 python selenium webdriver pyinstaller

以下是我的Python代码:

## t.py ##

from tkinter import messagebox
from tkinter import *
from selenium import webdriver

def clicked():
    iedriver = "C:\\Program Files\\Internet Explorer\\IEDriverServer.exe"
    try:        
        driver=webdriver.Ie(iedriver)        
    except Exception as e:        
        messagebox.showerror("Error",e)
    driver.get('www.baidu.com')  
Top=Tk()
Button(Top,text='Click Me',command=clicked).pack()
Top.mainloop()

这工作正常,但是当我使用 PyInstaller(t.spec) 将其转换为单个 .exe 文件时:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['D:\\program\\Python\\t.py'],
         pathex=['D:\\program\\Python'],
         binaries=None,
         datas=None,
         hiddenimports=[],
         hookspath=None,
         runtime_hooks=None,
         excludes=None,
         win_no_prefer_redirects=None,
         win_private_assemblies=None,
         cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,       
      a.binaries,
      a.zipfiles,
      a.datas,
      name='t',
      debug=False,
      strip=None,
      upx=False,
      console=0 , icon='D:\\program\\Python\\logo\\t.ico')

点击按钮运行时会提示如下错误: Seems that IEDriver executable can't be recognized

当我将spec文件中的选项“console=0”更改为“console=1”时,单击按钮后可以运行IE。知道为什么设置“console=0”时 IE 无法运行吗?

最佳答案

我想我通过修改selenium包中的服务类解决了这个问题。我不确定这是否是 selenium(2.47.3) 的错误。原始代码在调用 subprocess.Popen 函数时仅重定向 stdoutstderr 而不是 stdin

我修改了代码:

self.process = subprocess.Popen(cmd,
                stdout=PIPE, stderr=PIPE)

致:

self.process = subprocess.Popen(cmd, stdin=PIPE,
                stdout=PIPE, stderr=PIPE)

然后问题就消失了。

关于使用 selenium(webdriver) 的 Python 程序不能作为单个和非控制台 exe 文件运行 (pyinstaller),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33867183/

相关文章:

python - 将curl转换为urllib python3

java - 让 Selenium firefox 驱动程序正确退出 - Java

java - 无法单击位于 <div> 使用 Selenium WebDriver 制作的弹出窗口上的按钮

python - EC.element_to_be_clickable 和 EC.presence_of_element_located to click() 一个元素的区别

java - 动态创建TestNG.xml文件并传递参数

java - 看不懂FluentWait中until()方法的实现

对象的 Python 探查器用法

python - 为什么在 Django 中复制发布数据而不是直接使用它?

python - 如何在 matplotlib 中制作 3D 散点图

java - 如何使用 Selenium 放心调用体内函数