天天看點

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

繼續閱讀