一、前言
在进行网页自动化测试脚本开发的过程中,难免会遇见需要将程序打包成可执行文件的情况,这个时候可能会出现许多问题,如打包后文件过大、依赖不匹配等问题,这里对我遇到的selenium自动化脚本打包过程中遇到的一些小问题进行一些简单的罗列。
二、打包后文件过大问题
一开始我是直接使用了Pyinstall进行打包,鉴于我对测试程序环境的管理没做好,我的许多简单的程序都是使用anaconda自创的base环境来运行的,这也导致了我的基础环境依赖非常的多,Pyinstall打包会将该环境所有的依赖库都打包进去,所以上百行的代码直接给我干到了几百M(有点不可思议),后来学习到了用虚拟环境的方法:
1.安装虚拟环境
1. 安装:pip install pipenv
2. 检测安装是否成功:pipenv --version
3. 预览一下pipenv的用法: pipenv --help
4. 激活环境: pipenv shell
5. 指定虚拟环境python版本:pipenv --python 3.6 #指定使用Python 3.6的虚拟环境
6. 在虚拟环境中安装需要的第三方库:pipenv install
7. 安装pyinstall库:pipenv install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/
8. 卸载包:pipenv uninstall numpy #在项目所在虚拟环境中卸载numpy;pipenv uninstall --all--dev #从虚拟环境中卸载所有开发包,并从Pipfile文件中移除这些包
2.打包
1.pyinstaller打包生成 .exe
pyinstaller -F -w main.py -i main.ico --workpath build路径 --distpath exe打包路径 -n exe名字
参数解释:
-F, --onefile 打包一个单个文件,如果你的代码都写在了一个py文件的话,可以使用这个命令,如果是多个py文件,就别用;
-D, --onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架的形式编写工具代码,代码易于维护;
-a, --ascii 不包含unicode编码的支持(包括默认值:如果可用)
-c, --console 使用控制台子系统执行(默认),只对windows有效
-w, --windowed, --noconsole 使用windows子系统执行,当程序启动的时候不会打开命令行(只对windows有效)
-i , --icon=<File.ico>将file.ico添加为打包的exe文件的图表,只对windows系统有效
--icon=<File.exe,n>将file.exe的第n个图标添加为可执行文件的资源,只对windows系统有效
-n Name,--name=Name 可选的项目,生成的.spec文件的名字和exe名字
-p 设置导入路径(和使用PYTHONPATH效果相似),可以使用路径分隔符(windows使用分好,linux使用冒号),制定多个目录的时候可以指定多个-p参数来设置,让pyinstaller自己去找程序的资源
--key KEY 用于加密Python字节码的密钥
--add-data 可以将一些非二进制文件添加到exe文件中进行打包,参数为格式为static;static
--distpath 指定打包后的程序存放目录,exe文件默认存放在当前目录下的dist目录中
--workpath 为输出的所有临时文件指定存放目录,默认为当前目录下的build目录
三、去除chromedriver黑框问题
想要隐藏driver的黑框控制台
1.首先找到service.py:
这个是selenium依赖库里面的,如果你是虚拟环境那么大概路径是:C:\Users\用户.virtualenvs\虚拟环境名称\Lib\site-packages\selenium\webdriver\common\service.py,如果不是那么就找到你的anaconda对应环境中的对应文件,比如:E:\Anaconda\anaconda\Lib\site-packages\selenium\webdriver\common\service.py,注意一定是webdriver下面的common文件夹。
2.打开service.py文件,找到函数start,应该是在第61行的位置
在stdin=PIPE后面加上一段代码creationflags=134217728,变成:
def start(self):
"""
Starts the Service.
:Exceptions:
- WebDriverException : Raised either when it can't start the service
or when it can't connect to the service
"""
try:
cmd = [self.path]
cmd.extend(self.command_line_args())
self.process = subprocess.Popen(cmd, env=self.env,
close_fds=platform.system() != 'Windows',
stdout=self.log_file,
stderr=self.log_file,
stdin=PIPE,
creationflags=134217728)
注意这里的可能是旧版本,最新的可以只更改类里面的变量就行:
更改之后保存就不会在执行程序的时候弹出黑框。