2017-04-06 86 views
1

我在Python3.4中編寫了一個腳本,用於使用硒導航和登錄到網頁。腳本功能完美無瑕。 硒腳本:使用py2exe將python硒腳本構建成exe文件

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) 

我使用py2exe建立成一個可執行文件,但可執行文件無法導入每次webdriver的硒。我得到一個AttributeError:'NoneType'對象沒有'startswith'屬性。下面是在日誌文件中的錯誤:

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' 

我發現一個線程從2014說,在setup.py文件指定硒的webdriver的位置。鏈接:Make exe file from python selenium tests 但是,我仍然收到同樣的錯誤,當我嘗試線程的解決方案。 這裏是我的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, 
      } 
    } 
) 

唯一的區別是,我使用Python34,和3歲的線程使用Python27。我覺得在這段時間內事情可能會發生變化。有沒有人有任何想法或線索讓我跟隨?我應該只用27分一次嗎?

謝謝。

+0

嗨,你有沒有得到任何解決方案呢?如果是,那麼請用它更新帖子。 – pratibha

+0

謝謝您的提醒!我現在就做。 –

回答

1

我結束了使用python27得到這個工作,並解決了我的問題,把這個問題從多個線程的答案。 這裏是我使用的setup.py腳本的副本:

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 
      } 
    } 
) 

我想設置

"skip_archive" = True 

是個人喜好,但一個線程我也跟着說這樣做。

最重要的問題是py2exe在創建exe時不會複製幾個必要的文件。您可以通過在python目錄中查找文件並手動將它們複製到dist文件夾來解決此問題。

第一個是「getAttribute」和「isDisplayed」。它們可以位於

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

我的Python目錄爲C:\ python27 \,所以我的文件是在

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

拷貝這兩個文件中,瀏覽到您的DIST文件夾,並將它們粘貼到

\dist\selenium\webdriver\remote 

如果您使用的是Internet Explorer Web驅動程序,那麼您只需執行此操作。我認爲對於Chromedriver也是如此,但我還沒有測試過它。

如果您使用的是Firefox,我知道還有幾個文件需要複製。他們是「webdriver.xpi」和「webdriver_prefs.json」。你可以找到 他們:

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

它們粘貼到

\dist\selenium\webdriver\firefox 

現在你應該是好去!

相關問題