Programm, das Selenium verwendet, schlägt nach dem Erstellen mit cx_freeze fehl
-
21-12-2019 - |
Frage
Ich entwickle einen automatischen Webtester mit Selenium (v2.37.2).Das Programm funktioniert ordnungsgemäß, bis ich den mit cxfreeze erstellten Test ausführe (es gibt auch eine Tkinter-GUI).
Es gibt die Init-Funktion
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)
Wenn ich es jetzt mit Cx_freeze erstelle, erhalte ich diese Fehlermeldung
Die Methode „redirectToBlank(...)“ ruft initDriver(..) als Erstes auf. Wie packe ich also die .xpi-Datei in die Datei „library.zip“ – welche Option in setup.py muss ich verwenden?Und muss ich das überhaupt tun?
Und das zweite Merkwürdige ist, dass die anderen Browser einwandfrei funktionieren, wenn ich die .exe-Datei durch Klicken auf das entsprechende Symbol ausführe, aber wenn ich sie über die Befehlszeile ausführe, erhalte ich selbst für Chrome und IE Fehlermeldungen.(Es tut uns leid, dass der Traceback nicht vollständig ist)
Alle Pfade sind relativ zur ausgeführten Datei (unabhängig davon, von wo aus Sie sie ausführen).
Vielen Dank für alle Ideen zur Lösung dieses Problems.
(Methode „redirectToBlank(...)“ ruft initDriver(..) als erstes auf)
Lösung
Erstes Problem gelöstEs liegt ein Problem mit der Selenium-FirefoxProfile-Klasse vor, die versucht, webdriver.xpi als normale Datei zu laden, aber Selenium packt alle Bibliotheken in eine ZIP-Datei, sodass Selenium sie nicht finden kann.Selbst wenn man cx_freeze in der Setup-Datei dazu zwingt, webdriver.xpi zu einem richtigen Verzeichnis in zip hinzuzufügen, hilft das nicht.
Es ist notwendig, die Klasse FirefoxProfile (im Modul firefox_profile) beispielsweise wie folgt zu bearbeiten
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 >
Ausgabe 2
OSError: win error 6: the handle is invalid
Das Problem wurde weder durch cxfreeze noch durch Selenium verursacht.Ich führe die endgültige Exe-Datei von Git Bash aus.Da ist das Problem.Aus irgendeinem Grund öffnet Git Bash stdin nicht für das Programm und deshalb schlägt es fehl.Wenn ich es in der Standard-Windows-Befehlszeile ausführe, ist alles in Ordnung, oder wenn ich es von Git Bash aus ausführe program.exe < empty_file
Andere Tipps
Was ich getan habe, war, die Liste der Selenium-Formularpakete zu entfernen.und lege es hinein includefiles
, dann funktioniert es.
so was :
includefiles = [(seleniumPackage,'')]
...
options = {'build_exe': {'includes':includes,
'excludes':excludes,
'optimize':2,
'packages':packages,
'include_files':includefiles,
...