天天看点

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行代码

<code>class</code> <code>FirefoxProfile(</code><code>object</code><code>):</code>

<code>    </code><code>ANONYMOUS_PROFILE_NAME </code><code>=</code> <code>"WEBDRIVER_ANONYMOUS_PROFILE"</code>

<code>    </code><code>DEFAULT_PREFERENCES </code><code>=</code> <code>None</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>, profile_directory</code><code>=</code><code>None</code><code>):</code>

<code>        </code><code>"""</code>

<code>        </code><code>Initialises a new instance of a Firefox Profile</code>

<code>        </code><code>:args:</code>

<code>         </code><code>- profile_directory: Directory of profile that you want to use.</code>

<code>           </code><code>This defaults to None and will create a new</code>

<code>           </code><code>directory when object is created.</code>

<code>        </code><code>if</code> <code>not</code> <code>FirefoxProfile.DEFAULT_PREFERENCES:</code>

<code>            </code><code>with </code><code>open</code><code>(os.path.join(os.path.dirname(__file__),</code>

<code>                                   </code><code>WEBDRIVER_PREFERENCES)) as default_prefs:</code>

<code>                </code><code>FirefoxProfile.DEFAULT_PREFERENCES </code><code>=</code> <code>json.load(default_prefs)</code>

我们发现问题所在

<code>os.path.dirname(__file__)</code>

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

<code>            </code><code>if</code> <code>hasattr</code><code>(sys, </code><code>"frozen"</code><code>):</code>

<code>                </code><code>with </code><code>open</code><code>(os.path.join(os.path.dirname(os.path.abspath(</code><code>unicode</code><code>(sys.executable, sys.getfilesystemencoding()))),</code>

<code>                    </code><code>FirefoxProfile.DEFAULT_PREFERENCES </code><code>=</code> <code>json.load(default_prefs)</code>

<code>            </code><code>else</code><code>:</code>

<code>                </code><code>with </code><code>open</code><code>(os.path.join(os.path.dirname(__file__),</code>

<code>                                       </code><code>WEBDRIVER_PREFERENCES)) as default_prefs:</code>

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

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

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

<a href="http://s3.51cto.com/wyfs02/M00/6E/3B/wKiom1V2rW_Bz3KSAAQgUrm-hu8121.jpg" target="_blank"></a>

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

<code>    </code><code>def</code> <code>_install_extension(</code><code>self</code><code>, addon, unpack</code><code>=</code><code>True</code><code>):</code>

<code>            </code><code>Installs addon from a filepath, url</code>

<code>            </code><code>or directory of addons in the profile.</code>

<code>            </code><code>- path: url, path to .xpi, or directory of addons</code>

<code>            </code><code>- unpack: whether to unpack unless specified otherwise in the install.rdf</code>

<code>        </code><code>if</code> <code>addon </code><code>=</code><code>=</code> <code>WEBDRIVER_EXT:</code>

<code>            </code><code>addon </code><code>=</code> <code>os.path.join(os.path.dirname(__file__), WEBDRIVER_EXT)</code>

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

<code>                </code><code>addon </code><code>=</code> <code>os.path.join(os.path.dirname(os.path.abspath(</code><code>unicode</code><code>(sys.executab     le, sys.getfilesystemencoding()))),</code>

<code>                                   </code><code>WEBDRIVER_EXT)</code>

<code>                </code><code>addon </code><code>=</code> <code>os.path.join(os.path.dirname(__file__), WEBDRIVER_EXT)</code>

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

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

本文转自 leyex 51CTO博客,原文链接:http://blog.51cto.com/leyex/1660119

继续阅读