码迷,mamicode.com
首页 > 其他好文 > 详细

Selenium打包成exe运行出错

时间:2015-06-09 17:38:20      阅读:365      评论:0      收藏:0      [点我收藏+]

标签:webdriver_prefs.json   selenium   打包出错   python   

Selenium打包成exe运行出错

很久没写博文了,今天解决了一个其实也不是很复杂的问题,搜了好久的谷歌、百度,发现没怎么找到相关比较好的解决方法,或许是大家都能很轻松的解决这个问题吧,但我还是把我自己的解决方法分享下吧。

 

最近刚好需要写程序调用Selenium自动化跑一些东西,写好工具后准备打包,发现无限的出错,网上搜了好久也没找到确切答案,那么自己动手吧。

 

1.Firefox引擎找不到selenium\\webdriver\\firefox\\webdriver_prefs.json文件

 技术分享

如上图所示,提示的是找不到webdriver_prefs.json文件,于是我们进入selenium所安装目录下找到对应文件,放到打包完工具同目录下

(例:C:\Python27\Lib\site-packages\selenium\webdriver\firefox

运行发现依然出现这个问题,于是我们根据提示打开firefox_profile.py,查看第65行代码

class FirefoxProfile(object):
    ANONYMOUS_PROFILE_NAME = "WEBDRIVER_ANONYMOUS_PROFILE"
    DEFAULT_PREFERENCES = None

    def __init__(self, profile_directory=None):
        """
        Initialises a new instance of a Firefox Profile

        :args:
         - profile_directory: Directory of profile that you want to use.
           This defaults to None and will create a new
           directory when object is created.
        """
        if not FirefoxProfile.DEFAULT_PREFERENCES:
            with open(os.path.join(os.path.dirname(__file__),
                                   WEBDRIVER_PREFERENCES)) as default_prefs:
                FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs)

我们发现问题所在

os.path.dirname(__file__)

该语句用于获取脚本自身路径,但在打包后就不能这么使用了,于是我们需要对代码进行修改,修改后代码放上

        if not FirefoxProfile.DEFAULT_PREFERENCES:
            if hasattr(sys, "frozen"):
                with open(os.path.join(os.path.dirname(os.path.abspath(unicode(sys.executable, sys.getfilesystemencoding()))),
                                   WEBDRIVER_PREFERENCES)) as default_prefs:
                    FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs)
            else:
                with open(os.path.join(os.path.dirname(__file__),
                                       WEBDRIVER_PREFERENCES)) as default_prefs:
                    FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs)

使用hasattr方法判断程序是否打包,如果打包就使用sys.executable方法获取自身路径

修改完成后我们重新打包,运行发现之前的问题不见了,出现了另一个问题:

2.Firefox引擎找不到selenium\\webdriver\\firefox\\webdriver.xpi文件

技术分享

如上图所示发现缺少另一个文件webdriver.xpi,同样的拷贝后发现问题依旧,于是我们继续修改代码,查看第260行代码

    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:
            addon = os.path.join(os.path.dirname(__file__), WEBDRIVER_EXT)

同样是打包后路径问题,狠下心我们继续把代码改了

        if addon == WEBDRIVER_EXT:
            if hasattr(sys, "frozen"):
                addon = os.path.join(os.path.dirname(os.path.abspath(unicode(sys.executab     le, sys.getfilesystemencoding()))),
                                   WEBDRIVER_EXT)
            else:
                addon = os.path.join(os.path.dirname(__file__), WEBDRIVER_EXT)

最后再打包一次,现在已经能够正常运行了,跑起来吧,跑起来你会赢~

(注:个中代码并不是很难,有不懂的联系下代码上下文,自己理解下吧,或者直接在博文下留言吧,有空我会回复的)


本文出自 “云驿站 -Leyex学习笔记” 博客,请务必保留此出处http://leyex.blog.51cto.com/4230949/1660119

Selenium打包成exe运行出错

标签:webdriver_prefs.json   selenium   打包出错   python   

原文地址:http://leyex.blog.51cto.com/4230949/1660119

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!