cx_freeze でビルドした後、Selenium を使用するプログラムが失敗する
-
21-12-2019 - |
質問
Selenium (v2.37.2) を使用して自動 Web テスターを開発しています。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 を使用してビルドすると、このエラーが発生します
メソッド redirectToBlank(...) は最初に initDriver(..) を呼び出します。それでは、.xpi ファイルを library.zip ファイルにパックする方法 - setup.py のどのオプションを使用する必要がありますか?そして、私もこれをする必要がありますか?
そして 2 つ目の奇妙な点は、アイコンをクリックして .exe ファイルを実行すると、他のブラウザは正常に動作するのですが、コマンド ラインから実行すると、Chrome や IE でもエラーが発生します。(トレースバックが完了していないのが残念です)
すべてのパスは、実行されたファイルからの相対パスです (どこから実行したかに関係なく)。
この問題を解決するためのアイデアをありがとうございます。
(メソッド redirectToBlank(...) は最初に initDriver(..) を呼び出します)
解決
最初の問題が解決されましたこれは 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 によって引き起こされたものではありません。最終的な exe ファイルを git bash から実行します。そこに問題があります。何らかの理由で git bash はプログラムの標準入力を開けず、それが失敗の原因です。標準のWindowsコマンドラインで実行すると、すべて問題ありません。または、次のようにgit bashから実行しても問題ありません。 program.exe < empty_file
他のヒント
私がしたことはSeleniumフォームパッケージリストを削除しました。
そしてそれをincludefiles
に入れて、それは機能します。
これと同じように:
includefiles = [(seleniumPackage,'')]
...
options = {'build_exe': {'includes':includes,
'excludes':excludes,
'optimize':2,
'packages':packages,
'include_files':includefiles,
...
.