O programa que usa selênio falha após compilar com cx_freeze
-
21-12-2019 - |
Pergunta
Estou desenvolvendo um testador web automático usando Selenium (v2.37.2).O programa funciona corretamente até eu executar o teste construído com cxfreeze (também existe o tkinter gui).
existe a função 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)
Agora, quando eu construo usando Cx_freeze, recebo este erro
o método redirectToBlank(...) chama initDriver(..) como a primeira coisa. Então, como empacoto o arquivo .xpi no arquivo library.zip - qual opção em setup.py devo usar?E eu ainda tenho que fazer isso?
E a segunda coisa estranha é que os outros navegadores funcionam bem, quando executo o arquivo .exe clicando em seu ícone, mas quando executo na linha de comando, recebo erros até mesmo para Chrome e IE.(Lamentamos que o rastreamento não esteja completo)
Todos os caminhos são relativos ao arquivo executado (não importa de onde você o executa),
Obrigado por qualquer idéia para resolver este problema.
(o método redirectToBlank(...) chama initDriver(..) como a primeira coisa)
Solução
Primeiro problema resolvidoÉ um problema com a classe Selenium - FirefoxProfile -, que tenta carregar webdriver.xpi como um arquivo normal, mas o Selenium empacota todas as bibliotecas em um arquivo zip, então o Selenium não consegue encontrá-lo.Mesmo forçar cx_freeze no arquivo de configuração para adicionar webdriver.xpi a um diretório adequado no zip não ajudará.
É necessário editar a classe FirefoxProfile (no módulo firefox_profile) por exemplo assim
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 >
Edição 2
OSError: win error 6: the handle is invalid
o problema não foi causado por cxfreeze ou selenium.Eu executo o arquivo exe final do git bash.Aí está o problema.Por alguma razão, o git bash não abre o stdin para o programa e é por isso que ele falha.Quando eu executo na linha de comando padrão do Windows, está tudo bem ou se eu executar no git bash como program.exe < empty_file
Outras dicas
o que fiz foi remover a lista de pacotes do formulário Selenium.e coloque-o dentro includefiles
, então funciona.
assim :
includefiles = [(seleniumPackage,'')]
...
options = {'build_exe': {'includes':includes,
'excludes':excludes,
'optimize':2,
'packages':packages,
'include_files':includefiles,
...