Il programma che utilizza il selenio non riesce dopo la costruzione con cx_freeze
-
21-12-2019 - |
Domanda
Sto sviluppando un tester Web automatico utilizzando il selenio (V2.37.2). Il programma funziona correttamente fino a quando non eseguirò il test integrato con CXFreeze (c'è anche Tkinter GUI).
C'è la funzione 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)
.
Ora quando lo costruisco usando cx_freeze ottengo questo errore
Metodo rediirectoblank (...) Chiamate InitDriver (..) Come prima cosa, come faccio parte il file .xpi al file biblioteca.zip - quale opzione in setup.py devo usare? E ho anche a questo?
E la seconda cosa strana è che gli altri browser funzionano bene, quando eseguo il file .exe in facendo clic sulla sua icona, ma quando lo eseguo dalla riga di comando, ottengo errori anche per Chrome e Ie. (Mi dispiace che la traceback non sia completa)
Tutti i percorsi sono relativi dal file eseguito (indipendentemente da dove si esegue),
Grazie per qualsiasi idea per risolvere questo problema.
(metodo redirecttoblank (...) chiama l'initdriver (..) come la prima cosa)
Soluzione
Primo problema risolto È un problema con Selenium - Firefoxprofile - classe, che tenta di caricare WebDriver.XPI come file normale, ma Selenium pack tutte le librerie a un file zip, quindi il selenio non riesce a trovarlo. Anche forzare CX_Freeze nel file di installazione per aggiungere WebDriver.xpi a una directory corretta in zip non aiuterà.
È necessario modificare firefoxprofile (in classe Firefox_Profile) Classe ad esempio come questa
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 >
.
Edizione 2
Il problema OSError: win error 6: the handle is invalid
non è stato causato da cxfreeze o selenio.Gestisco il file EXE finale da Git Bash.C'è il problema.Per qualche motivo Git Bash non apri Stdin per il programma ed è per questo che fallisce.Quando lo eseguo nella riga di comando di Windows standard, tutto è OK o se lo eseguo da Git Bash come program.exe < empty_file
Altri suggerimenti
Quello che ho fatto è stato rimuovere la lista dei pacchetti del modulo Selenio.
e mettilo all'interno di includefiles
, allora funziona.
In questo modo:
includefiles = [(seleniumPackage,'')]
...
options = {'build_exe': {'includes':includes,
'excludes':excludes,
'optimize':2,
'packages':packages,
'include_files':includefiles,
...
.