2017-04-06 2 views
1

Ich schrieb ein Skript in Python3.4 zu navigieren und auf einer Webseite mit Selenium anmelden. Das Skript funktioniert einwandfrei. Selen Skript:Erstellen Sie ein Python-Selenium-Skript in eine Exe mit py2exe

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Firefox() 
driver.get("http://128.114.70.78/periscope") 
login = driver.find_element_by_id('keys') 
login.send_keys("username") 
login.send_keys(Keys.TAB) 
login.send_keys("pass") 
login.send_keys(Keys.RETURN) 

ich es in eine exe gebaut py2exe verwenden, aber die ausführbare Datei nicht die Selen WebDriver jedes Mal zu importieren. Ich bekomme einen AttributeError: 'NoneType' -Objekt hat kein Attribut 'startswith'. Hier ist der Fehler in der Protokolldatei:

Traceback (most recent call last): 
File "periscopeLogin.py", line 1, in <module> 
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked 
File "<frozen importlib._bootstrap>", line 1161, in 
_load_backward_compatible 
File "C:\Python34\lib\site-packages\selenium\webdriver\__init__.py", line 
18, in <module> 
from .firefox.webdriver import WebDriver as Firefox # noqa 
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked 
File "<frozen importlib._bootstrap>", line 1161, in 
_load_backward_compatible 
File "C:\Python34\lib\site- 
packages\selenium\webdriver\firefox\webdriver.py", line 34, in <module> 
from selenium.webdriver.remote.webdriver import WebDriver as 
RemoteWebDriver 
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked 
File "<frozen importlib._bootstrap>", line 1161, in 
_load_backward_compatible 
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", 
line 25, in <module> 
from .webelement import WebElement 
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked 
File "<frozen importlib._bootstrap>", line 1161, in 
_load_backward_compatible 
File "C:\Python34\lib\site- 
packages\selenium\webdriver\remote\webelement.py", line 40, in <module> 
getAttribute_js = pkgutil.get_data(__package__, 
'getAttribute.js').decode('utf8') 
File "C:\Python34\lib\pkgutil.py", line 611, in get_data 
spec = importlib.util.find_spec(package) 
File "C:\Python34\lib\importlib\util.py", line 81, in find_spec 
fullname = resolve_name(name, package) if name.startswith('.') else name 
AttributeError: 'NoneType' object has no attribute 'startswith' 

ich einen Thread von 2014 gefunden, die die Position von Selen WebDriver in der setup.py-Datei angeben sagt. Link: Make exe file from python selenium tests Allerdings erhalte ich immer noch den gleichen Fehler, wenn ich die Lösung des Threads versuche. Hier ist meine setup.py:

from distutils.core import setup 
import py2exe 

data_files = [('selenium\webdriver\Firefox', ['C:\Python34\Lib\site- 
packages\selenium\webdriver\Firefox\webdriver.xpi'])] 
# from selenium import webdriver 
# from selenium.webdriver.common.keys import Keys 

setup(
    windows = [{'script': "periscopeLogin.py"}], # the main py file 
    data_files = data_files, 
    options = { 
     'py2exe': 
      { 
       'skip_archive': True, 
       'optimize': 2, 
      } 
    } 
) 

Der einzige Unterschied ist, dass ich Python34 bin mit, und die 3-jährige Thread verwendet Python27. Ich habe das Gefühl, dass sich die Dinge in dieser Zeitspanne geändert haben könnten. Hat jemand irgendwelche Ideen oder Hinweise für mich zu folgen? Soll ich es einfach mit 27 probieren?

Vielen Dank.

+0

Hallo, Hast du irgendeine Lösung dafür? Wenn ja, dann aktualisieren Sie bitte die Post damit. – pratibha

+0

Vielen Dank für die Erinnerung! Ich werde es jetzt machen. –

Antwort

1

Ich endete mit python27, um dies zu arbeiten, und löste mein Problem, indem ich die Antworten von mehreren Threads mit diesem Problem zusammenstellte. Hier ist eine Kopie des setup.py-Skript I verwendet:

from distutils.core import setup 
import py2exe 

setup(
    console=['periscopeLogin.py'], # the main py file 
    options={ 
      "py2exe":{ 
        "packages": ["os", "linecache"], 
        "skip_archive": True, # tell script to not create a library folder 
        "unbuffered": True, 
        "optimize": 2 
      } 
    } 
) 

Ich denke

"skip_archive" = True 

ist eine persönliche Präferenz Einstellung, aber ein Thread gesagt gefolgt, es zu tun.

Das wichtigste Problem ist, dass py2exe beim Erstellen der exe nicht über einige notwendige Dateien kopiert. Sie können dies beheben, indem Sie die Dateien in Ihrem Python-Verzeichnis suchen und sie manuell in Ihren Ordner "dist" kopieren.

Die ersten sind "getAttribute" und "wirdangezeigt". Sie können bei

*pythonDirectory*\Lib\site-packages\selenium\webdriver\remote 

Mein Python-Verzeichnis C befinden: \ python27 \, so meine Dateien in

C:\Python27\Lib\site-packages\selenium\webdriver\remote. 

Kopieren Sie diese beiden Dateien gefunden wurden, navigieren Sie zu Ihrem dist-Ordner, und fügen Sie sie in

\dist\selenium\webdriver\remote 

Wenn Sie den Internet Explorer-Webdriver verwenden, ist dies alles, was Sie tun müssen. Ich denke das gleiche für Chromedriver, aber ich habe es nicht getestet.

Wenn Sie Firefox verwenden, weiß ich, dass Sie noch ein paar weitere Dateien kopieren müssen. Sie sind "webdriver.xpi" und "webdriver_prefs.json".Sie können sie suchen:

*pythonDirectory*\Lib\site-packages\selenium\webdriver\firefox 

fügen Sie sie in

\dist\selenium\webdriver\firefox 

Jetzt sollten Sie gut zu gehen!

Verwandte Themen