繁体   English   中英

使用py2exe将python selenium脚本构建到exe中

[英]Build a python selenium script into an exe using py2exe

我在Python3.4中编写了一个脚本,用于使用selenium导航和登录网页。 该脚本功能完美无缺。 Selenium脚本:

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将它构建到exe中,但是可执行文件每次都无法导入selenium 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文件中指定selenium webdriver的位置。 链接: 从python selenium测试生成exe文件然而,当我尝试线程的解决方案时,我仍然收到相同的错误。 这是我的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拍一张吗?

谢谢。

我最终使用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 webdriver,则只需执行此操作即可。 我认为Chromedriver也一样,但我没有测试过。

如果您使用的是Firefox,我知道您需要复制更多文件。 它们是“ webdriver.xpi ”和“ webdriver_prefs.json ”。 你可以找到它们:

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

将它们粘贴到

\dist\selenium\webdriver\firefox

现在你应该好好去!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM