使用cx_freeze构建后,使用selenium的程序失败

时间:2013-11-16 16:46:33

标签: selenium python-3.x webdriver selenium-webdriver cx-freeze

我正在使用Selenium(v2.37.2)开发自动网络测试仪。程序正常工作,直到我运行使用cxfreeze构建的测试(还有tkinter gui)。

有init函数

def initDriver(self):

    if self.browser == FIREFOX:
        profile = webdriver.FirefoxProfile(profile_directory=self.profile);
        self._driver = webdriver.Firefox(firefox_profile=profile)

    elif self.browser == CHROME:            
        self._driver = webdriver.Chrome(self.executable, chrome_options=profile)

    elif self.browser == IEXPLORER:
        self._driver = webdriver.Ie(self.executable)

现在,当我使用Cx_freeze构建它时,我收到此错误 Error traceback

方法redirectToBlank(...)调用initDriver(..)作为第一件事我如何将.xpi文件打包到library.zip文件 - 我必须使用setup.py中的哪个选项?我甚至不得不这样做吗?

第二个奇怪的是,当我通过点击它的图标执行.exe文件时,其他浏览器工作正常,但是当我从命令行运行它时,我甚至对chrome和IE都会出错。 (很抱歉,回溯没有完成)

Chrome traceback

所有路径都与执行的文件相关(无论您从哪里运行),

感谢您解决此问题的任何想法。

(方法redirectToBlank(...)首先调用initDriver(..))

2 个答案:

答案 0 :(得分:1)

第一个问题已解决 这是selenium的问题 - FirefoxProfile - 类,它试图将webdriver.xpi作为普通文件加载,但selenium将所有库打包为zip文件,因此selenium无法找到它。 甚至强制安装文件中的cx_freeze将webdriver.xpi添加到zip中的正确目录也无济于事。

有必要编辑FirefoxProfile(在firefox_profile模块中)类,例如这样

def _install_extension(self, addon, unpack=True):
    """
        Installs addon from a filepath, url
        or directory of addons in the profile.
        - path: url, path to .xpi, or directory of addons
        - unpack: whether to unpack unless specified otherwise in the install.rdf
    """
    if addon == WEBDRIVER_EXT:
        # altered lines
        import sdi.env
        WEBDRIVER_SUBSTITUTE = "path/to/unpacked/webdrive.xpi"
        addon = os.path.join(os.path.dirname(__file__),  WEBDRIVER_SUBSTITUTE)

        # Original lines:
        # addon = os.path.join(os.path.dirname(__file__),  WEBDRIVER_EXT)

    < the rest of the method >

第2期

OSError: win error 6: the handle is invalid问题不是由cxfreeze或selenium引起的。我从git bash运行最终的exe文件。有问题。由于某种原因,git bash不会为程序打开stdin,这就是它失败的原因。当我在标准的Windows命令行中运行它时,一切正常,或者如果我从git bash运行它,如program.exe < empty_file

答案 1 :(得分:0)

我所做的是从包列表中删除selenium。 并将其放在includefiles内,然后就可以了。

像这样:

includefiles = [(seleniumPackage,'')]

...
options = {'build_exe': {'includes':includes,
                             'excludes':excludes,
                             'optimize':2,
                             'packages':packages,
                             'include_files':includefiles,
...