Compare commits
11 Commits
ac4d41c70b
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 45ce9d7186 | |||
| 78bfda1ced | |||
| 4cc6a3391f | |||
| e285191149 | |||
| cfafb9d3d4 | |||
| fbdbed37f4 | |||
| 80fdc75c26 | |||
| 2cee7731b1 | |||
| e0b36aebd3 | |||
| da7a6dd045 | |||
| 2441031bb6 |
Binary file not shown.
2015
build/创建无线连/Analysis-00.toc
Normal file
2015
build/创建无线连/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
291
build/创建无线连/EXE-00.toc
Normal file
291
build/创建无线连/EXE-00.toc
Normal file
@@ -0,0 +1,291 @@
|
||||
('D:\\Projects\\cjgc_upload\\dist\\创建无线连.exe',
|
||||
True,
|
||||
False,
|
||||
False,
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico',
|
||||
None,
|
||||
False,
|
||||
False,
|
||||
b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<assembly xmlns='
|
||||
b'"urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\n <trustInfo x'
|
||||
b'mlns="urn:schemas-microsoft-com:asm.v3">\n <security>\n <requested'
|
||||
b'Privileges>\n <requestedExecutionLevel level="asInvoker" uiAccess='
|
||||
b'"false"/>\n </requestedPrivileges>\n </security>\n </trustInfo>\n '
|
||||
b'<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\n <'
|
||||
b'application>\n <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f'
|
||||
b'0}"/>\n <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\n '
|
||||
b' <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\n <s'
|
||||
b'upportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\n <supporte'
|
||||
b'dOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\n </application>\n <'
|
||||
b'/compatibility>\n <application xmlns="urn:schemas-microsoft-com:asm.v3">'
|
||||
b'\n <windowsSettings>\n <longPathAware xmlns="http://schemas.micros'
|
||||
b'oft.com/SMI/2016/WindowsSettings">true</longPathAware>\n </windowsSett'
|
||||
b'ings>\n </application>\n <dependency>\n <dependentAssembly>\n <ass'
|
||||
b'emblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version='
|
||||
b'"6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" langua'
|
||||
b'ge="*"/>\n </dependentAssembly>\n </dependency>\n</assembly>',
|
||||
True,
|
||||
False,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\创建无线连.pkg',
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\base_library.zip',
|
||||
'DATA')],
|
||||
[],
|
||||
False,
|
||||
False,
|
||||
1770711058,
|
||||
[('run.exe',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
|
||||
'EXECUTABLE')],
|
||||
'C:\\Program Files\\Python312\\python312.dll')
|
||||
267
build/创建无线连/PKG-00.toc
Normal file
267
build/创建无线连/PKG-00.toc
Normal file
@@ -0,0 +1,267 @@
|
||||
('D:\\Projects\\cjgc_upload\\build\\创建无线连\\创建无线连.pkg',
|
||||
{'BINARY': True,
|
||||
'DATA': True,
|
||||
'EXECUTABLE': True,
|
||||
'EXTENSION': True,
|
||||
'PYMODULE': True,
|
||||
'PYSOURCE': True,
|
||||
'PYZ': False,
|
||||
'SPLASH': True,
|
||||
'SYMLINK': False},
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连\\base_library.zip',
|
||||
'DATA')],
|
||||
'python312.dll',
|
||||
False,
|
||||
False,
|
||||
False,
|
||||
[],
|
||||
None,
|
||||
None,
|
||||
None)
|
||||
BIN
build/创建无线连/PYZ-00.pyz
Normal file
BIN
build/创建无线连/PYZ-00.pyz
Normal file
Binary file not shown.
1765
build/创建无线连/PYZ-00.toc
Normal file
1765
build/创建无线连/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连/base_library.zip
Normal file
BIN
build/创建无线连/base_library.zip
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/pyimod04_pywin32.pyc
Normal file
BIN
build/创建无线连/localpycs/pyimod04_pywin32.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连/localpycs/struct.pyc
Normal file
BIN
build/创建无线连/localpycs/struct.pyc
Normal file
Binary file not shown.
64
build/创建无线连/warn-创建无线连.txt
Normal file
64
build/创建无线连/warn-创建无线连.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional)
|
||||
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed)
|
||||
missing module named _sha512 - imported by random (optional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
|
||||
missing module named posix - imported by os (conditional, optional), posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named pyimod02_importers - imported by C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
|
||||
missing module named collections.Callable - imported by collections (optional), socks (optional)
|
||||
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named h2 - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
|
||||
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
|
||||
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
|
||||
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
|
||||
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
|
||||
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), selenium.webdriver.firefox.firefox_binary (delayed, optional)
|
||||
missing module named wsaccel - imported by websocket._utils (optional)
|
||||
missing module named 'python_socks.sync' - imported by websocket._http (optional)
|
||||
missing module named 'python_socks._types' - imported by websocket._http (optional)
|
||||
missing module named python_socks - imported by websocket._http (optional)
|
||||
missing module named 'wsaccel.xormask' - imported by websocket._abnf (optional)
|
||||
missing module named win_inet_pton - imported by socks (conditional, optional)
|
||||
missing module named simplejson - imported by requests.compat (conditional, optional)
|
||||
missing module named dummy_threading - imported by requests.cookies (optional)
|
||||
missing module named fcntl - imported by subprocess (optional)
|
||||
21572
build/创建无线连/xref-创建无线连.html
Normal file
21572
build/创建无线连/xref-创建无线连.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连/创建无线连.pkg
Normal file
BIN
build/创建无线连/创建无线连.pkg
Normal file
Binary file not shown.
2015
build/创建无线连接/Analysis-00.toc
Normal file
2015
build/创建无线连接/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
291
build/创建无线连接/EXE-00.toc
Normal file
291
build/创建无线连接/EXE-00.toc
Normal file
@@ -0,0 +1,291 @@
|
||||
('D:\\Projects\\cjgc_upload\\dist\\创建无线连接.exe',
|
||||
True,
|
||||
False,
|
||||
False,
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico',
|
||||
None,
|
||||
False,
|
||||
False,
|
||||
b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<assembly xmlns='
|
||||
b'"urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\n <trustInfo x'
|
||||
b'mlns="urn:schemas-microsoft-com:asm.v3">\n <security>\n <requested'
|
||||
b'Privileges>\n <requestedExecutionLevel level="asInvoker" uiAccess='
|
||||
b'"false"/>\n </requestedPrivileges>\n </security>\n </trustInfo>\n '
|
||||
b'<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\n <'
|
||||
b'application>\n <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f'
|
||||
b'0}"/>\n <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\n '
|
||||
b' <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\n <s'
|
||||
b'upportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\n <supporte'
|
||||
b'dOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\n </application>\n <'
|
||||
b'/compatibility>\n <application xmlns="urn:schemas-microsoft-com:asm.v3">'
|
||||
b'\n <windowsSettings>\n <longPathAware xmlns="http://schemas.micros'
|
||||
b'oft.com/SMI/2016/WindowsSettings">true</longPathAware>\n </windowsSett'
|
||||
b'ings>\n </application>\n <dependency>\n <dependentAssembly>\n <ass'
|
||||
b'emblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version='
|
||||
b'"6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" langua'
|
||||
b'ge="*"/>\n </dependentAssembly>\n </dependency>\n</assembly>',
|
||||
True,
|
||||
False,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\创建无线连接.pkg',
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\base_library.zip',
|
||||
'DATA')],
|
||||
[],
|
||||
False,
|
||||
False,
|
||||
1773016676,
|
||||
[('run.exe',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
|
||||
'EXECUTABLE')],
|
||||
'C:\\Program Files\\Python312\\python312.dll')
|
||||
267
build/创建无线连接/PKG-00.toc
Normal file
267
build/创建无线连接/PKG-00.toc
Normal file
@@ -0,0 +1,267 @@
|
||||
('D:\\Projects\\cjgc_upload\\build\\创建无线连接\\创建无线连接.pkg',
|
||||
{'BINARY': True,
|
||||
'DATA': True,
|
||||
'EXECUTABLE': True,
|
||||
'EXTENSION': True,
|
||||
'PYMODULE': True,
|
||||
'PYSOURCE': True,
|
||||
'PYZ': False,
|
||||
'SPLASH': True,
|
||||
'SYMLINK': False},
|
||||
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||
('PYZ-00.pyz', 'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\PYZ-00.pyz', 'PYZ'),
|
||||
('struct',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\struct.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod01_archive',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod01_archive.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod02_importers',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod02_importers.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod03_ctypes',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod03_ctypes.pyc',
|
||||
'PYMODULE'),
|
||||
('pyimod04_pywin32',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\localpycs\\pyimod04_pywin32.pyc',
|
||||
'PYMODULE'),
|
||||
('pyiboot01_bootstrap',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_inspect',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_pkgutil',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||
'PYSOURCE'),
|
||||
('pyi_rth_multiprocessing',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||
'PYSOURCE'),
|
||||
('create_a_link', 'D:\\Projects\\cjgc_upload\\create_a_link.py', 'PYSOURCE'),
|
||||
('selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe',
|
||||
'BINARY'),
|
||||
('python312.dll', 'C:\\Program Files\\Python312\\python312.dll', 'BINARY'),
|
||||
('_multiprocessing.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_multiprocessing.pyd',
|
||||
'EXTENSION'),
|
||||
('pyexpat.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\pyexpat.pyd',
|
||||
'EXTENSION'),
|
||||
('_ssl.pyd', 'C:\\Program Files\\Python312\\DLLs\\_ssl.pyd', 'EXTENSION'),
|
||||
('_hashlib.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_hashlib.pyd',
|
||||
'EXTENSION'),
|
||||
('unicodedata.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\unicodedata.pyd',
|
||||
'EXTENSION'),
|
||||
('_decimal.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_decimal.pyd',
|
||||
'EXTENSION'),
|
||||
('select.pyd', 'C:\\Program Files\\Python312\\DLLs\\select.pyd', 'EXTENSION'),
|
||||
('_lzma.pyd', 'C:\\Program Files\\Python312\\DLLs\\_lzma.pyd', 'EXTENSION'),
|
||||
('_bz2.pyd', 'C:\\Program Files\\Python312\\DLLs\\_bz2.pyd', 'EXTENSION'),
|
||||
('_ctypes.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_ctypes.pyd',
|
||||
'EXTENSION'),
|
||||
('_queue.pyd', 'C:\\Program Files\\Python312\\DLLs\\_queue.pyd', 'EXTENSION'),
|
||||
('_socket.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_socket.pyd',
|
||||
'EXTENSION'),
|
||||
('_overlapped.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_overlapped.pyd',
|
||||
'EXTENSION'),
|
||||
('_asyncio.pyd',
|
||||
'C:\\Program Files\\Python312\\DLLs\\_asyncio.pyd',
|
||||
'EXTENSION'),
|
||||
('_wmi.pyd', 'C:\\Program Files\\Python312\\DLLs\\_wmi.pyd', 'EXTENSION'),
|
||||
('_uuid.pyd', 'C:\\Program Files\\Python312\\DLLs\\_uuid.pyd', 'EXTENSION'),
|
||||
('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'C:\\Program '
|
||||
'Files\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
|
||||
'EXTENSION'),
|
||||
('api-ms-win-core-synch-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-math-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-math-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-time-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-time-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-process-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-process-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('VCRUNTIME140.dll',
|
||||
'C:\\Program Files\\Python312\\VCRUNTIME140.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('libssl-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libssl-3.dll',
|
||||
'BINARY'),
|
||||
('libcrypto-3.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libcrypto-3.dll',
|
||||
'BINARY'),
|
||||
('libffi-8.dll',
|
||||
'C:\\Program Files\\Python312\\DLLs\\libffi-8.dll',
|
||||
'BINARY'),
|
||||
('ucrtbase.dll', 'D:\\Resource\\JDK\\JavaJDK17\\bin\\ucrtbase.dll', 'BINARY'),
|
||||
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-console-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-console-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-memory-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-memory-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l2-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l2-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-util-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-util-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-profile-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-profile-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-string-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-string-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-debug-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-debug-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-synch-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-synch-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-file-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-file-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-localization-l1-2-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-localization-l1-2-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-handle-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-handle-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('api-ms-win-core-heap-l1-1-0.dll',
|
||||
'D:\\Resource\\JDK\\JavaJDK17\\bin\\api-ms-win-core-heap-l1-1-0.dll',
|
||||
'BINARY'),
|
||||
('selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v138\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\linux\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\getAttribute.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\isDisplayed.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v137\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\firefox\\webdriver_prefs.json',
|
||||
'DATA'),
|
||||
('selenium\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\py.typed',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\macos\\selenium-manager',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\mutation-listener.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\remote\\findElements.js',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\remote\\findElements.js',
|
||||
'DATA'),
|
||||
('selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\selenium\\webdriver\\common\\devtools\\v139\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\py.typed',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\py.typed',
|
||||
'DATA'),
|
||||
('certifi\\cacert.pem',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\certifi\\cacert.pem',
|
||||
'DATA'),
|
||||
('base_library.zip',
|
||||
'D:\\Projects\\cjgc_upload\\build\\创建无线连接\\base_library.zip',
|
||||
'DATA')],
|
||||
'python312.dll',
|
||||
False,
|
||||
False,
|
||||
False,
|
||||
[],
|
||||
None,
|
||||
None,
|
||||
None)
|
||||
BIN
build/创建无线连接/PYZ-00.pyz
Normal file
BIN
build/创建无线连接/PYZ-00.pyz
Normal file
Binary file not shown.
1765
build/创建无线连接/PYZ-00.toc
Normal file
1765
build/创建无线连接/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连接/base_library.zip
Normal file
BIN
build/创建无线连接/base_library.zip
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/pyimod04_pywin32.pyc
Normal file
BIN
build/创建无线连接/localpycs/pyimod04_pywin32.pyc
Normal file
Binary file not shown.
BIN
build/创建无线连接/localpycs/struct.pyc
Normal file
BIN
build/创建无线连接/localpycs/struct.pyc
Normal file
Binary file not shown.
64
build/创建无线连接/warn-创建无线连接.txt
Normal file
64
build/创建无线连接/warn-创建无线连接.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional)
|
||||
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed)
|
||||
missing module named _sha512 - imported by random (optional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
|
||||
missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional), posixpath (optional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named pyimod02_importers - imported by C:\Program Files\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
|
||||
missing module named collections.Callable - imported by collections (optional), socks (optional)
|
||||
missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named compression - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
|
||||
missing module named h2 - imported by urllib3.http2.connection (top-level)
|
||||
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
|
||||
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
|
||||
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
|
||||
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
|
||||
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
|
||||
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), selenium.webdriver.firefox.firefox_binary (delayed, optional)
|
||||
missing module named wsaccel - imported by websocket._utils (optional)
|
||||
missing module named 'python_socks.sync' - imported by websocket._http (optional)
|
||||
missing module named 'python_socks._types' - imported by websocket._http (optional)
|
||||
missing module named python_socks - imported by websocket._http (optional)
|
||||
missing module named 'wsaccel.xormask' - imported by websocket._abnf (optional)
|
||||
missing module named win_inet_pton - imported by socks (conditional, optional)
|
||||
missing module named simplejson - imported by requests.compat (conditional, optional)
|
||||
missing module named dummy_threading - imported by requests.cookies (optional)
|
||||
missing module named fcntl - imported by subprocess (optional)
|
||||
21570
build/创建无线连接/xref-创建无线连接.html
Normal file
21570
build/创建无线连接/xref-创建无线连接.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/创建无线连接/创建无线连接.pkg
Normal file
BIN
build/创建无线连接/创建无线连接.pkg
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -6421,6 +6421,7 @@
|
||||
'C:\\Program Files\\Python312\\Lib\\tracemalloc.py',
|
||||
'PYMODULE'),
|
||||
('tty', 'C:\\Program Files\\Python312\\Lib\\tty.py', 'PYMODULE'),
|
||||
('turtle', 'C:\\Program Files\\Python312\\Lib\\turtle.py', 'PYMODULE'),
|
||||
('typing', 'C:\\Program Files\\Python312\\Lib\\typing.py', 'PYMODULE'),
|
||||
('typing_extensions',
|
||||
'C:\\Users\\ADMIN\\AppData\\Roaming\\Python\\Python312\\site-packages\\typing_extensions.py',
|
||||
|
||||
Binary file not shown.
@@ -5117,7 +5117,6 @@ imported by:
|
||||
• <a href="#appium.webdriver">appium.webdriver</a>
|
||||
• <a href="#globals.driver_utils">globals.driver_utils</a>
|
||||
• <a href="#main">main</a>
|
||||
• <a href="#page_objects.screenshot_page">page_objects.screenshot_page</a>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -5234,7 +5233,6 @@ imported by:
|
||||
• <a href="#appium.options.android.uiautomator2">appium.options.android.uiautomator2</a>
|
||||
• <a href="#globals.driver_utils">globals.driver_utils</a>
|
||||
• <a href="#main">main</a>
|
||||
• <a href="#page_objects.screenshot_page">page_objects.screenshot_page</a>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -8023,7 +8021,6 @@ imported by:
|
||||
• <a href="#appium.webdriver.webelement">appium.webdriver.webelement</a>
|
||||
• <a href="#globals.driver_utils">globals.driver_utils</a>
|
||||
• <a href="#main">main</a>
|
||||
• <a href="#page_objects.screenshot_page">page_objects.screenshot_page</a>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -13242,6 +13239,7 @@ imported by:
|
||||
• <a href="#setuptools._vendor.backports.tarfile">setuptools._vendor.backports.tarfile</a>
|
||||
• <a href="#sqlalchemy.sql.util">sqlalchemy.sql.util</a>
|
||||
• <a href="#tarfile">tarfile</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#weakref">weakref</a>
|
||||
• <a href="#webbrowser">webbrowser</a>
|
||||
• <a href="#xlrd.formula">xlrd.formula</a>
|
||||
@@ -13542,6 +13540,7 @@ imported by:
|
||||
• <a href="#openpyxl.utils.datetime">openpyxl.utils.datetime</a>
|
||||
• <a href="#openpyxl.writer.excel">openpyxl.writer.excel</a>
|
||||
• <a href="#page_objects.download_tabbar_page">page_objects.download_tabbar_page</a>
|
||||
• <a href="#page_objects.more_download_page">page_objects.more_download_page</a>
|
||||
• <a href="#page_objects.screenshot_page">page_objects.screenshot_page</a>
|
||||
• <a href="#page_objects.upload_config_page">page_objects.upload_config_page</a>
|
||||
• <a href="#pandas._typing">pandas._typing</a>
|
||||
@@ -17978,6 +17977,7 @@ imports:
|
||||
• <a href="#logging">logging</a>
|
||||
• <a href="#requests">requests</a>
|
||||
• <a href="#socket">socket</a>
|
||||
• <a href="#time">time</a>
|
||||
• <a href="#typing">typing</a>
|
||||
|
||||
</div>
|
||||
@@ -18621,7 +18621,6 @@ imports:
|
||||
• <a href="#importlib">importlib</a>
|
||||
• <a href="#importlib._bootstrap">importlib._bootstrap</a>
|
||||
• <a href="#importlib._bootstrap_external">importlib._bootstrap_external</a>
|
||||
• <a href="#importlib.machinery">importlib.machinery</a>
|
||||
• <a href="#sys">sys</a>
|
||||
• <a href="#warnings">warnings</a>
|
||||
|
||||
@@ -18776,8 +18775,7 @@ imports:
|
||||
</div>
|
||||
<div class="import">
|
||||
imported by:
|
||||
<a href="#importlib">importlib</a>
|
||||
• <a href="#importlib.abc">importlib.abc</a>
|
||||
<a href="#importlib.abc">importlib.abc</a>
|
||||
• <a href="#inspect">inspect</a>
|
||||
• <a href="#packaging.tags">packaging.tags</a>
|
||||
• <a href="#pkg_resources">pkg_resources</a>
|
||||
@@ -19298,6 +19296,7 @@ imported by:
|
||||
• <a href="#sqlalchemy.sql.lambdas">sqlalchemy.sql.lambdas</a>
|
||||
• <a href="#sqlalchemy.util.compat">sqlalchemy.util.compat</a>
|
||||
• <a href="#sqlalchemy.util.langhelpers">sqlalchemy.util.langhelpers</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#typing">typing</a>
|
||||
• <a href="#typing_extensions">typing_extensions</a>
|
||||
• <a href="#unittest.async_case">unittest.async_case</a>
|
||||
@@ -20941,6 +20940,7 @@ imported by:
|
||||
• <a href="#setuptools._vendor.more_itertools.recipes">setuptools._vendor.more_itertools.recipes</a>
|
||||
• <a href="#sqlalchemy.dialects.sqlite.pysqlite">sqlalchemy.dialects.sqlite.pysqlite</a>
|
||||
• <a href="#statistics">statistics</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#urllib.parse">urllib.parse</a>
|
||||
• <a href="#xlsxwriter.worksheet">xlsxwriter.worksheet</a>
|
||||
|
||||
@@ -37782,6 +37782,7 @@ imported by:
|
||||
• <a href="#setuptools.msvc">setuptools.msvc</a>
|
||||
• <a href="#sysconfig">sysconfig</a>
|
||||
• <a href="#tracemalloc">tracemalloc</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#unittest.util">unittest.util</a>
|
||||
|
||||
</div>
|
||||
@@ -38299,6 +38300,7 @@ imported by:
|
||||
<span class="moduletype">SourceModule</span> <div class="import">
|
||||
imports:
|
||||
<a href="#appium.webdriver.common.appiumby">appium.webdriver.common.appiumby</a>
|
||||
• <a href="#datetime">datetime</a>
|
||||
• <a href="#globals.driver_utils">globals.driver_utils</a>
|
||||
• <a href="#logging">logging</a>
|
||||
• <a href="#page_objects">page_objects</a>
|
||||
@@ -38324,10 +38326,7 @@ imported by:
|
||||
<a target="code" href="///D:/Projects/cjgc_upload/page_objects/screenshot_page.py" type="text/plain"><tt>page_objects.screenshot_page</tt></a>
|
||||
<span class="moduletype">SourceModule</span> <div class="import">
|
||||
imports:
|
||||
<a href="#appium">appium</a>
|
||||
• <a href="#appium.options.android">appium.options.android</a>
|
||||
• <a href="#appium.webdriver">appium.webdriver</a>
|
||||
• <a href="#appium.webdriver.common.appiumby">appium.webdriver.common.appiumby</a>
|
||||
<a href="#appium.webdriver.common.appiumby">appium.webdriver.common.appiumby</a>
|
||||
• <a href="#datetime">datetime</a>
|
||||
• <a href="#globals.driver_utils">globals.driver_utils</a>
|
||||
• <a href="#globals.global_variable">globals.global_variable</a>
|
||||
@@ -38342,6 +38341,7 @@ imports:
|
||||
• <a href="#selenium.webdriver.support.ui">selenium.webdriver.support.ui</a>
|
||||
• <a href="#subprocess">subprocess</a>
|
||||
• <a href="#time">time</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
|
||||
</div>
|
||||
<div class="import">
|
||||
@@ -38369,6 +38369,7 @@ imports:
|
||||
• <a href="#pandas">pandas</a>
|
||||
• <a href="#re">re</a>
|
||||
• <a href="#selenium.common.exceptions">selenium.common.exceptions</a>
|
||||
• <a href="#selenium.webdriver.common.by">selenium.webdriver.common.by</a>
|
||||
• <a href="#selenium.webdriver.support">selenium.webdriver.support</a>
|
||||
• <a href="#selenium.webdriver.support.expected_conditions">selenium.webdriver.support.expected_conditions</a>
|
||||
• <a href="#selenium.webdriver.support.ui">selenium.webdriver.support.ui</a>
|
||||
@@ -53208,6 +53209,7 @@ imported by:
|
||||
• <a href="#tkinter">tkinter</a>
|
||||
• <a href="#tokenize">tokenize</a>
|
||||
• <a href="#tomllib._re">tomllib._re</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#typing">typing</a>
|
||||
• <a href="#unittest.case">unittest.case</a>
|
||||
• <a href="#unittest.loader">unittest.loader</a>
|
||||
@@ -54960,6 +54962,7 @@ imports:
|
||||
imported by:
|
||||
<a href="#appium.webdriver.common.appiumby">appium.webdriver.common.appiumby</a>
|
||||
• <a href="#appium.webdriver.webdriver">appium.webdriver.webdriver</a>
|
||||
• <a href="#page_objects.upload_config_page">page_objects.upload_config_page</a>
|
||||
• <a href="#selenium.webdriver.remote.locator_converter">selenium.webdriver.remote.locator_converter</a>
|
||||
• <a href="#selenium.webdriver.remote.shadowroot">selenium.webdriver.remote.shadowroot</a>
|
||||
• <a href="#selenium.webdriver.remote.switch_to">selenium.webdriver.remote.switch_to</a>
|
||||
@@ -70129,6 +70132,7 @@ imported by:
|
||||
• <a href="#tkinter">tkinter</a>
|
||||
• <a href="#tokenize">tokenize</a>
|
||||
• <a href="#traceback">traceback</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#types">types</a>
|
||||
• <a href="#typing">typing</a>
|
||||
• <a href="#typing_extensions">typing_extensions</a>
|
||||
@@ -70523,6 +70527,7 @@ imported by:
|
||||
• <a href="#email.generator">email.generator</a>
|
||||
• <a href="#email.utils">email.utils</a>
|
||||
• <a href="#gc">gc</a>
|
||||
• <a href="#globals.apis">globals.apis</a>
|
||||
• <a href="#globals.driver_utils">globals.driver_utils</a>
|
||||
• <a href="#gzip">gzip</a>
|
||||
• <a href="#http.cookiejar">http.cookiejar</a>
|
||||
@@ -70582,6 +70587,7 @@ imported by:
|
||||
• <a href="#subprocess">subprocess</a>
|
||||
• <a href="#tarfile">tarfile</a>
|
||||
• <a href="#threading">threading</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#unittest.case">unittest.case</a>
|
||||
• <a href="#unittest.runner">unittest.runner</a>
|
||||
• <a href="#urllib.request">urllib.request</a>
|
||||
@@ -70611,9 +70617,9 @@ imports:
|
||||
• <a href="#os">os</a>
|
||||
• <a href="#re">re</a>
|
||||
• <a href="#sys">sys</a>
|
||||
• <a href="#tkinter.commondialog">tkinter.commondialog</a>
|
||||
• <a href="#tkinter.constants">tkinter.constants</a>
|
||||
• <a href="#tkinter.messagebox">tkinter.messagebox</a>
|
||||
• <a href="#tkinter.simpledialog">tkinter.simpledialog</a>
|
||||
• <a href="#traceback">traceback</a>
|
||||
• <a href="#types">types</a>
|
||||
|
||||
@@ -70628,6 +70634,7 @@ imported by:
|
||||
• <a href="#tkinter.font">tkinter.font</a>
|
||||
• <a href="#tkinter.messagebox">tkinter.messagebox</a>
|
||||
• <a href="#tkinter.simpledialog">tkinter.simpledialog</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -70643,8 +70650,7 @@ imports:
|
||||
</div>
|
||||
<div class="import">
|
||||
imported by:
|
||||
<a href="#tkinter">tkinter</a>
|
||||
• <a href="#tkinter.filedialog">tkinter.filedialog</a>
|
||||
<a href="#tkinter.filedialog">tkinter.filedialog</a>
|
||||
• <a href="#tkinter.messagebox">tkinter.messagebox</a>
|
||||
|
||||
</div>
|
||||
@@ -70753,7 +70759,9 @@ imports:
|
||||
<div class="import">
|
||||
imported by:
|
||||
<a href="#matplotlib.backends._backend_tk">matplotlib.backends._backend_tk</a>
|
||||
• <a href="#tkinter">tkinter</a>
|
||||
• <a href="#tkinter.filedialog">tkinter.filedialog</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -71033,6 +71041,32 @@ imported by:
|
||||
|
||||
</div>
|
||||
|
||||
<div class="node">
|
||||
<a name="turtle"></a>
|
||||
<a target="code" href="///C:/Program%20Files/Python312/Lib/turtle.py" type="text/plain"><tt>turtle</tt></a>
|
||||
<span class="moduletype">SourceModule</span> <div class="import">
|
||||
imports:
|
||||
<a href="#copy">copy</a>
|
||||
• <a href="#inspect">inspect</a>
|
||||
• <a href="#math">math</a>
|
||||
• <a href="#os.path">os.path</a>
|
||||
• <a href="#re">re</a>
|
||||
• <a href="#sys">sys</a>
|
||||
• <a href="#time">time</a>
|
||||
• <a href="#tkinter">tkinter</a>
|
||||
• <a href="#tkinter.simpledialog">tkinter.simpledialog</a>
|
||||
• <a href="#types">types</a>
|
||||
• <a href="#warnings">warnings</a>
|
||||
|
||||
</div>
|
||||
<div class="import">
|
||||
imported by:
|
||||
<a href="#page_objects.screenshot_page">page_objects.screenshot_page</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="node">
|
||||
<a name="types"></a>
|
||||
<a target="code" href="///C:/Program%20Files/Python312/Lib/types.py" type="text/plain"><tt>types</tt></a>
|
||||
@@ -71147,6 +71181,7 @@ imported by:
|
||||
• <a href="#tempfile">tempfile</a>
|
||||
• <a href="#tkinter">tkinter</a>
|
||||
• <a href="#tomllib._parser">tomllib._parser</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#typing">typing</a>
|
||||
• <a href="#typing_extensions">typing_extensions</a>
|
||||
• <a href="#unittest.case">unittest.case</a>
|
||||
@@ -74112,6 +74147,7 @@ imported by:
|
||||
• <a href="#tarfile">tarfile</a>
|
||||
• <a href="#tempfile">tempfile</a>
|
||||
• <a href="#threading">threading</a>
|
||||
• <a href="#turtle">turtle</a>
|
||||
• <a href="#typing">typing</a>
|
||||
• <a href="#typing_extensions">typing_extensions</a>
|
||||
• <a href="#unittest.async_case">unittest.async_case</a>
|
||||
|
||||
Binary file not shown.
@@ -129,14 +129,33 @@ def update_device_info(account_id, device_name, device_port, device_ip):
|
||||
# =======================
|
||||
|
||||
def start_appium():
|
||||
print("🚀 启动 Appium Server ...")
|
||||
appium_port = 4723
|
||||
print(f"🚀 启动 Appium Server(端口 {appium_port})...")
|
||||
subprocess.Popen(
|
||||
["appium.cmd", "-a", "127.0.0.1", "-p", "4723"],
|
||||
["appium.cmd", "-a", "127.0.0.1", "-p", str(appium_port)],
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL
|
||||
)
|
||||
time.sleep(5) # 给 Appium 启动时间
|
||||
print("✅ Appium Server 已启动")
|
||||
# 检查端口是否就绪(替代固定sleep)
|
||||
max_wait = 30 # 最大等待30秒
|
||||
start_time = time.time()
|
||||
while time.time() - start_time < max_wait:
|
||||
try:
|
||||
# 尝试连接Appium端口,验证是否就绪
|
||||
import socket
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(1)
|
||||
result = sock.connect_ex(("127.0.0.1", appium_port))
|
||||
sock.close()
|
||||
if result == 0: # 端口就绪
|
||||
print(f"✅ Appium Server 启动成功(端口 {appium_port})")
|
||||
return True
|
||||
except Exception:
|
||||
pass
|
||||
time.sleep(1)
|
||||
|
||||
print(f"❌ Appium Server 启动超时({max_wait}秒)")
|
||||
return False
|
||||
|
||||
|
||||
# =======================
|
||||
@@ -221,7 +240,7 @@ def start_settlement_app(device_id, device_ip, device_port):
|
||||
# 无线 ADB 建链主流程
|
||||
# =======================
|
||||
|
||||
def setup_adb_wireless(yh_id="68c0dbfdb7cbcd616e7c5ab5"):
|
||||
def setup_adb_wireless(yh_id="68ef0e02b0138d25e2ac9918"):
|
||||
port = get_new_port(yh_id)
|
||||
# port = 3435
|
||||
print(f"🚀 开始无线 ADB 建链(端口 {port})")
|
||||
@@ -342,6 +361,6 @@ def setup_adb_wireless(yh_id="68c0dbfdb7cbcd616e7c5ab5"):
|
||||
if __name__ == "__main__":
|
||||
# 配置参数
|
||||
|
||||
USER_ID = "68c0dbfdb7cbcd616e7c5ab5" # 替换为实际的用户ID
|
||||
USER_ID = "68ef0e02b0138d25e2ac9918" # 替换为实际的用户ID
|
||||
|
||||
setup_adb_wireless(USER_ID)
|
||||
68
debug_page_source.xml
Normal file
68
debug_page_source.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
|
||||
<hierarchy index="0" class="hierarchy" rotation="0" width="1080" height="2029">
|
||||
|
||||
<android.widget.FrameLayout index="0" package="com.bjjw.cjgc" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][1080,2118]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="0" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][1080,2118]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.FrameLayout index="0" package="com.bjjw.cjgc" class="android.widget.FrameLayout" text="" resource-id="android:id/content" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,2118]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.RelativeLayout index="0" package="com.bjjw.cjgc" class="android.widget.RelativeLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,2118]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.support.v4.view.ViewPager index="0" package="com.bjjw.cjgc" class="android.support.v4.view.ViewPager" text="" resource-id="com.bjjw.cjgc:id/vPager" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="true" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.FrameLayout index="1" package="com.bjjw.cjgc" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.RelativeLayout index="0" package="com.bjjw.cjgc" class="android.widget.RelativeLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,89][1080,1980]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.ListView index="0" package="com.bjjw.cjgc" class="android.widget.ListView" text="" resource-id="com.bjjw.cjgc:id/upload_result_list" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,117][1052,683]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/itemContainer" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,117][1052,305]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/longclick" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[56,159][875,263]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.TextView index="0" package="com.bjjw.cjgc" class="android.widget.TextView" text="CDWZQ-2标-刚性路基156右线-462321-462390-0" resource-id="com.bjjw.cjgc:id/title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,159][875,218]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
<android.widget.TextView index="1" package="com.bjjw.cjgc" class="android.widget.TextView" text="测量时间:2026-02-02 09:59:42" resource-id="com.bjjw.cjgc:id/subtitle" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,218][590,263]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.Button index="1" package="com.bjjw.cjgc" class="android.widget.Button" text="上传" resource-id="com.bjjw.cjgc:id/upload_btn" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[875,145][1024,277]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="5" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.LinearLayout index="1" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/itemContainer" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,306][1052,494]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/longclick" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[56,348][875,452]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.TextView index="0" package="com.bjjw.cjgc" class="android.widget.TextView" text="CDWZQ-2标-三工区-任家湾特大桥-53#-56#" resource-id="com.bjjw.cjgc:id/title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,348][875,407]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
<android.widget.TextView index="1" package="com.bjjw.cjgc" class="android.widget.TextView" text="测量时间:2026-02-28 13:34:06" resource-id="com.bjjw.cjgc:id/subtitle" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,407][585,452]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.Button index="1" package="com.bjjw.cjgc" class="android.widget.Button" text="上传" resource-id="com.bjjw.cjgc:id/upload_btn" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[875,334][1024,466]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="5" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.LinearLayout index="2" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/itemContainer" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[28,495][1052,683]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.LinearLayout index="0" package="com.bjjw.cjgc" class="android.widget.LinearLayout" text="" resource-id="com.bjjw.cjgc:id/longclick" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[56,537][875,641]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false">
|
||||
|
||||
<android.widget.TextView index="0" package="com.bjjw.cjgc" class="android.widget.TextView" text="CDWZQ-2标-区间路基136号-447970-448036-136" resource-id="com.bjjw.cjgc:id/title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,537][875,596]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
<android.widget.TextView index="1" package="com.bjjw.cjgc" class="android.widget.TextView" text="测量时间:2026-02-28 11:44:46" resource-id="com.bjjw.cjgc:id/subtitle" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[84,596][583,641]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
<android.widget.Button index="1" package="com.bjjw.cjgc" class="android.widget.Button" text="上传" resource-id="com.bjjw.cjgc:id/upload_btn" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[875,523][1024,655]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="5" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" />
|
||||
|
||||
</android.widget.LinearLayout>
|
||||
|
||||
</android.widget.ListView>
|
||||
|
||||
</android.widget.RelativeLayout>
|
||||
|
||||
0
dist/appium_automation.log
vendored
Normal file
0
dist/appium_automation.log
vendored
Normal file
BIN
dist/创建无线连接.exe
vendored
Normal file
BIN
dist/创建无线连接.exe
vendored
Normal file
Binary file not shown.
BIN
dist/沉降观测自动上传.exe
vendored
BIN
dist/沉降观测自动上传.exe
vendored
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,7 @@
|
||||
import requests
|
||||
import json
|
||||
import logging
|
||||
import time
|
||||
import socket
|
||||
from typing import Optional, Dict, Any
|
||||
import globals.global_variable as global_variable
|
||||
@@ -52,58 +53,6 @@ def send_tcp_command(command="StartMultiple", host="127.0.0.1", port=8888, timeo
|
||||
logging.info(f"发送命令时发生错误: {str(e)}")
|
||||
return None
|
||||
|
||||
def get_breakpoint_list():
|
||||
"""
|
||||
获取需要处理的断点列表
|
||||
"""
|
||||
# 请求参数
|
||||
params = {
|
||||
'user_name': global_variable.get_username()
|
||||
}
|
||||
|
||||
# 请求地址
|
||||
url = "https://engineering.yuxindazhineng.com/index/index/get_name_all"
|
||||
|
||||
try:
|
||||
# 发送GET请求
|
||||
response = requests.get(url, params=params, timeout=30)
|
||||
|
||||
# 检查请求是否成功
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
|
||||
# 检查接口返回状态
|
||||
if result.get('code') == 0:
|
||||
data = result.get('data', [])
|
||||
logging.info("成功获取断点列表,数据条数:", len(data))
|
||||
|
||||
# 打印断点信息
|
||||
# for item in data:
|
||||
# logging.info(f"线路编码: {item.get('line_num')}, "
|
||||
# f"线路名称: {item.get('line_name')}, "
|
||||
# f"状态: {item.get('status')}, "
|
||||
# f"用户: {item.get('name')}")
|
||||
|
||||
return data
|
||||
else:
|
||||
logging.info(f"接口返回错误: {result.get('code')}")
|
||||
return [{"id": 37,
|
||||
"user_name": "wangshun",
|
||||
"name": "wangshun",
|
||||
"line_num": "L193588",
|
||||
"line_name": "CDWZQ-2标-155号路基左线-461221-461570-155左-平原",
|
||||
"status": 3
|
||||
}]
|
||||
else:
|
||||
logging.info(f"请求失败,状态码: {response.status_code}")
|
||||
return []
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
logging.info(f"请求异常: {e}")
|
||||
return []
|
||||
except ValueError as e:
|
||||
logging.info(f"JSON解析错误: {e}")
|
||||
return []
|
||||
|
||||
def get_measurement_task():
|
||||
"""
|
||||
@@ -388,7 +337,10 @@ def get_line_info_and_save_global(user_name: str) -> bool:
|
||||
api_url = "https://engineering.yuxindazhineng.com/index/index/get_name_all"
|
||||
request_params = {"user_name": user_name} # GET请求参数
|
||||
timeout = 10 # 请求超时时间(秒),避免卡进程
|
||||
max_retries = 3 # 最大重试次数
|
||||
retry_interval = 2 # 重试间隔(秒)
|
||||
|
||||
for retry in range(max_retries):
|
||||
try:
|
||||
# 1. 发送GET请求
|
||||
response = requests.get(
|
||||
@@ -401,6 +353,10 @@ def get_line_info_and_save_global(user_name: str) -> bool:
|
||||
# 2. 校验HTTP状态码(先确保请求本身成功)
|
||||
if response.status_code != 200:
|
||||
logging.error(f"接口请求失败,HTTP状态码异常:{response.status_code},响应内容:{response.text}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 3. 解析JSON响应(接口返回是JSON格式,需解析为字典)
|
||||
@@ -408,6 +364,10 @@ def get_line_info_and_save_global(user_name: str) -> bool:
|
||||
response_data = response.json()
|
||||
except Exception as e:
|
||||
logging.error(f"接口返回内容非合法JSON,无法解析:{response.text},错误:{str(e)}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 4. 校验业务状态码(接口约定:code=0成功,-1失败)
|
||||
@@ -416,20 +376,36 @@ def get_line_info_and_save_global(user_name: str) -> bool:
|
||||
logging.info("接口业务请求成功,开始解析数据")
|
||||
elif business_code == -1:
|
||||
logging.error(f"接口业务请求失败,业务状态码code=-1,返回数据:{response_data}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
else:
|
||||
logging.warning(f"接口返回未知业务状态码:{business_code},请确认接口文档")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 5. 提取data字段,校验数据是否存在
|
||||
api_data_list = response_data.get("data")
|
||||
if not api_data_list:
|
||||
logging.warning("接口业务成功,但data字段为空或无数据")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 6. 校验data是否为列表类型
|
||||
if not isinstance(api_data_list, list):
|
||||
logging.error(f"data字段不是列表类型,实际类型:{type(api_data_list)},内容:{api_data_list}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
found_valid_data = False
|
||||
@@ -453,7 +429,7 @@ def get_line_info_and_save_global(user_name: str) -> bool:
|
||||
# 存入全局字典:key=line_name,value=line_num
|
||||
global_variable.get_upload_breakpoint_dict()[line_name] = line_num
|
||||
|
||||
print(f"当前全局字典数据上传线路字典数据:{global_variable.get_upload_breakpoint_dict()}")
|
||||
|
||||
# 如果line_name不在列表中,则添加
|
||||
if line_name not in global_variable.get_upload_breakpoint_list():
|
||||
global_variable.get_upload_breakpoint_list().append(line_name)
|
||||
@@ -462,21 +438,38 @@ def get_line_info_and_save_global(user_name: str) -> bool:
|
||||
found_valid_data = True
|
||||
|
||||
if found_valid_data:
|
||||
# print(f"当前全局字典数据上传线路字典数据:{global_variable.get_upload_breakpoint_dict()}")
|
||||
logging.info(f"成功提取所有status=3的线路信息,当前全局字典数据:{global_variable.get_upload_breakpoint_dict()}")
|
||||
return True
|
||||
else:
|
||||
logging.warning("data列表中未找到任何status=3且字段完整的线路信息")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
# 捕获所有请求相关异常(超时、连接失败、网络异常等)
|
||||
except requests.exceptions.Timeout:
|
||||
logging.error(f"调用get_name_all接口超时,超时时间:{timeout}秒,请求参数:{request_params}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
except requests.exceptions.ConnectionError:
|
||||
logging.error(f"调用get_name_all接口连接失败,检查网络或接口地址是否正确:{api_url}")
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
except Exception as e:
|
||||
logging.error(f"调用get_name_all接口时发生未知异常:{str(e)}", exc_info=True) # exc_info=True打印异常堆栈,方便排查
|
||||
if retry < max_retries - 1:
|
||||
logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试")
|
||||
time.sleep(retry_interval)
|
||||
continue
|
||||
return False
|
||||
|
||||
def get_accounts_from_server(yh_id):
|
||||
|
||||
@@ -604,7 +604,7 @@ def launch_app_manually(driver, device_id, package_name="com.bjjw.cjgc", activit
|
||||
# 使用ADB命令设置屏幕永不休眠
|
||||
screen_timeout_cmd = [
|
||||
"adb", "-s", device_id,
|
||||
"shell", "settings", "put", "system", "screen_off_timeout", "0"
|
||||
"shell", "settings", "put", "system", "screen_off_timeout", "86400000"
|
||||
]
|
||||
timeout_result = subprocess.run(screen_timeout_cmd, capture_output=True, text=True, timeout=15)
|
||||
if timeout_result.returncode == 0:
|
||||
|
||||
@@ -31,7 +31,7 @@ def parse_time_config():
|
||||
|
||||
# 使用正则匹配用户名、时间、状态
|
||||
# 兼容 wangshun 16:40:20 true 和 cdwzq3liangchaoyong 15:06:35 true
|
||||
match = re.search(r'(\w+)\s+(\d{2}:\d{2}:\d{2})\s+true', line)
|
||||
match = re.search(r'(\w+)\s+(\d{2}:\d{2}:\d{2})\s+ok', line)
|
||||
if match:
|
||||
username = match.group(1)
|
||||
scheduled_time = match.group(2)
|
||||
@@ -49,11 +49,11 @@ def get_remote_tasks():
|
||||
# 1. 先获取本地文件中的配置
|
||||
local_times = parse_time_config()
|
||||
if not local_times:
|
||||
print("❌ time.txt 中没有有效的 true 任务或文件为空")
|
||||
print("❌ time.txt 中没有有效的 ok 任务或文件为空")
|
||||
return {}
|
||||
|
||||
# 2. 从服务器获取账户
|
||||
accounts = apis.get_accounts_from_server("68c0dbfdb7cbcd616e7c5ab5")
|
||||
accounts = apis.get_accounts_from_server("68ef0e02b0138d25e2ac9918")
|
||||
if not accounts:
|
||||
print("❌ 未从服务器获取到账户信息,终止流程")
|
||||
return {}
|
||||
|
||||
80
main.py
80
main.py
@@ -131,7 +131,10 @@ class DeviceAutomation(object):
|
||||
logging.info(f"设备 {self.device_id} 登录成功,继续执行更新操作")
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
# # 执行更新操作
|
||||
# if not self.download_tabbar_page.download_tabbar_page_manager():
|
||||
# logging.error(f"设备 {self.device_id} 更新操作执行失败")
|
||||
# return False
|
||||
|
||||
# 获取状态为3的线路。
|
||||
apis.get_line_info_and_save_global(user_name=global_variable.get_username());
|
||||
@@ -160,16 +163,76 @@ class DeviceAutomation(object):
|
||||
EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/img_2_layout"))
|
||||
)
|
||||
upload_page_btn.click()
|
||||
upload_page_btn.click()
|
||||
time.sleep(0.5)
|
||||
|
||||
upload_success_count = 0 # 上传成功的断点数量
|
||||
# 实现连续获取断点列表直到两次相同
|
||||
previous_breakpoint_list = None
|
||||
current_breakpoint_list = None
|
||||
max_attempts = 5 # 最大尝试次数
|
||||
attempt_count = 0
|
||||
while attempt_count < max_attempts:
|
||||
# 获取当前页面的断点列表
|
||||
|
||||
# 遍历断点列表,逐个执行上传操作
|
||||
upload_success_count = 0
|
||||
for breakpoint_name in global_variable.get_upload_breakpoint_list():
|
||||
# 从当前页面获取断点列表名称
|
||||
current_breakpoint_list = self.upload_config_page.get_breakpoint_list_from_page()
|
||||
attempt_count += 1
|
||||
if current_breakpoint_list is None:
|
||||
logging.warning(f"设备 {self.device_id} 没有获取到断点列表,结束上传流程")
|
||||
break
|
||||
|
||||
logging.info(f"第 {attempt_count} 次获取断点列表: {current_breakpoint_list}")
|
||||
|
||||
# 检查是否与上一次获取的列表相同
|
||||
if previous_breakpoint_list is not None and current_breakpoint_list == previous_breakpoint_list:
|
||||
logging.info("连续两次获取到相同的断点列表,结束上传")
|
||||
# 下滑一次再次检查是否一致
|
||||
# 获取列表容器
|
||||
list_container = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/upload_result_list")
|
||||
|
||||
# 计算滑动坐标
|
||||
start_x = list_container.location['x'] + list_container.size['width'] // 2
|
||||
# 向下滑动
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.95
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.05
|
||||
logging.info("向下滑动列表")
|
||||
self.driver.swipe(start_x, start_y, start_x, end_y, 500)
|
||||
current_breakpoint_list = self.upload_config_page.get_breakpoint_list_from_page()
|
||||
if previous_breakpoint_list is not None and current_breakpoint_list == previous_breakpoint_list:
|
||||
break
|
||||
|
||||
previous_breakpoint_list = current_breakpoint_list.copy() if current_breakpoint_list else None
|
||||
# 遍历当前页面列表,逐个执行上传操作
|
||||
|
||||
for breakpoint_name in current_breakpoint_list:
|
||||
|
||||
# # 遍历断点列表,逐个执行上传操作
|
||||
# upload_success_count = 0
|
||||
# for breakpoint_name in global_variable.get_upload_breakpoint_list():
|
||||
try:
|
||||
# 检查断点名称是否在当前页面列表中
|
||||
if breakpoint_name not in current_breakpoint_list:
|
||||
logging.warning(f"设备 {self.device_id} 断点 '{breakpoint_name}' 不在当前页面列表中,跳过上传")
|
||||
continue
|
||||
|
||||
logging.info(f"设备 {self.device_id} 开始处理断点 '{breakpoint_name}' 的上传")
|
||||
|
||||
# 安全地获取断点信息
|
||||
line_num = global_variable.get_upload_breakpoint_dict().get(breakpoint_name)
|
||||
# breakpoint_names = global_variable.get_upload_breakpoint_dict()
|
||||
# logging.info(f"设备 {self.device_id} 断点字典 '{breakpoint_names}' 中包含断点 '{breakpoint_name}'")
|
||||
ui_breakpoint_dict = {}
|
||||
for key, value in global_variable.get_upload_breakpoint_dict().items():
|
||||
# 去掉末尾的"-平原"
|
||||
if key.endswith('-平原'):
|
||||
ui_key = key[:-3] # 去掉最后3个字符"-平原"
|
||||
else:
|
||||
ui_key = key
|
||||
ui_breakpoint_dict[ui_key] = value
|
||||
|
||||
line_num = ui_breakpoint_dict.get(breakpoint_name)
|
||||
logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 对应的line_num为 {line_num}")
|
||||
|
||||
if line_num is None:
|
||||
logging.warning(f"设备 {self.device_id} 断点 '{breakpoint_name}' 在字典中未找到,跳过上传")
|
||||
continue
|
||||
@@ -183,6 +246,13 @@ class DeviceAutomation(object):
|
||||
upload_success_count += 1
|
||||
else:
|
||||
logging.error(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传失败")
|
||||
for i in range(3):
|
||||
if self.upload_config_page.upload_config_page_manager(self.results_dir, breakpoint_name, line_num):
|
||||
logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 重试上传成功")
|
||||
upload_success_count += 1
|
||||
break
|
||||
else:
|
||||
logging.error(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传失败,第 {i+1} 次重试")
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"设备 {self.device_id} 处理断点 '{breakpoint_name}' 时发生异常: {str(e)}")
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -59,7 +59,7 @@ class LoginPage:
|
||||
# 如果clear方法不可用,尝试其他方式
|
||||
pass
|
||||
|
||||
accounts = apis.get_accounts_from_server("68c0dbfdb7cbcd616e7c5ab5")
|
||||
accounts = apis.get_accounts_from_server("68ef0e02b0138d25e2ac9918")
|
||||
matches = [acc for acc in accounts if acc.get("username") == existing_username]
|
||||
if matches:
|
||||
password = matches[0].get("password")
|
||||
@@ -73,11 +73,15 @@ class LoginPage:
|
||||
pass
|
||||
|
||||
# 点击登录按钮
|
||||
max_retries = 3
|
||||
retry_count = 0
|
||||
|
||||
while retry_count < max_retries:
|
||||
login_btn = self.wait.until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, ids.LOGIN_BTN))
|
||||
)
|
||||
login_btn.click()
|
||||
self.logger.info("已点击登录按钮")
|
||||
self.logger.info(f"已点击登录按钮 (尝试 {retry_count + 1}/{max_retries})")
|
||||
|
||||
# 等待登录完成
|
||||
time.sleep(3)
|
||||
@@ -87,7 +91,13 @@ class LoginPage:
|
||||
self.logger.info("登录成功")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning("登录后未检测到主页面元素")
|
||||
self.logger.warning("登录后未检测到主页面元素,准备重试")
|
||||
retry_count += 1
|
||||
if retry_count < max_retries:
|
||||
self.logger.info(f"等待2秒后重新尝试登录...")
|
||||
time.sleep(2)
|
||||
|
||||
self.logger.error(f"登录失败,已尝试 {max_retries} 次")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
|
||||
@@ -5,6 +5,7 @@ from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.common.exceptions import TimeoutException, NoSuchElementException
|
||||
import logging
|
||||
import time
|
||||
from datetime import datetime
|
||||
from globals.driver_utils import launch_app_manually
|
||||
from page_objects.login_page import LoginPage
|
||||
|
||||
@@ -177,8 +178,18 @@ class MoreDownloadPage:
|
||||
def _swipe_year_wheel(self):
|
||||
"""滑动年份选择器的滚轮"""
|
||||
try:
|
||||
# # 获取年份选择器滚轮元素
|
||||
# year_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView1")
|
||||
# 获取当前日期
|
||||
current_date = datetime.now()
|
||||
current_month = current_date.month
|
||||
|
||||
# 检查月份是否小于等于3
|
||||
if current_month <= 3:
|
||||
self.logger.info(f"当前月份为{current_month}月,需要滑动年份选择器")
|
||||
|
||||
# 获取年份选择器滚轮元素
|
||||
year_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView2")
|
||||
year_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView1")
|
||||
|
||||
# 获取滚轮的位置和尺寸
|
||||
location = year_wheel.location
|
||||
@@ -191,6 +202,27 @@ class MoreDownloadPage:
|
||||
# 计算滑动距离 - 滚轮高度的1/5
|
||||
swipe_distance = size['height'] // 5
|
||||
|
||||
# 滑动一次年份选择器
|
||||
# 执行滑动操作 - 从中心向上滑动1/5高度
|
||||
self.driver.swipe(center_x, center_y - swipe_distance, center_x, center_y, 500)
|
||||
|
||||
self.logger.info("已滑动一次年份选择器")
|
||||
else:
|
||||
self.logger.info(f"当前月份为{current_month}月,不需要滑动年份选择器")
|
||||
# 获取月份选择器滚轮元素
|
||||
month_wheel = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/wheelView2")
|
||||
|
||||
# 获取滚轮的位置和尺寸
|
||||
location = month_wheel.location
|
||||
size = month_wheel.size
|
||||
|
||||
# 计算滚轮中心点坐标
|
||||
center_x = location['x'] + size['width'] // 2
|
||||
center_y = location['y'] + size['height'] // 2
|
||||
|
||||
# 计算滑动距离 - 滚轮高度的1/5
|
||||
swipe_distance = size['height'] // 5
|
||||
|
||||
for i in range(3):
|
||||
# 执行滑动操作 - 从中心向上滑动1/5高度
|
||||
self.driver.swipe(center_x, center_y - swipe_distance, center_x, center_y, 500)
|
||||
@@ -369,7 +401,7 @@ class MoreDownloadPage:
|
||||
continue
|
||||
return False
|
||||
|
||||
def wait_for_loading_dialog(self, timeout=900, download_type="unknown", retry_count=0):
|
||||
def wait_for_loading_dialog(self, timeout=1200, download_type="unknown", retry_count=0):
|
||||
"""
|
||||
检查加载弹窗的出现和消失,支持最多1次重试(总共执行2次)
|
||||
"""
|
||||
|
||||
@@ -5,6 +5,7 @@ import time
|
||||
import re
|
||||
import os
|
||||
from datetime import datetime
|
||||
from turtle import back
|
||||
from appium.webdriver.common.appiumby import AppiumBy
|
||||
from selenium.common.exceptions import NoSuchElementException, TimeoutException
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
@@ -19,7 +20,8 @@ import globals.global_variable as global_variable # 导入全局变量模块
|
||||
class ScreenshotPage:
|
||||
def __init__(self, driver, wait, device_id=None):
|
||||
self.driver = driver
|
||||
self.wait = wait
|
||||
# self.wait = wait
|
||||
self.wait = WebDriverWait(self.driver, 0.5)
|
||||
self.device_id = device_id
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.all_items = set()
|
||||
@@ -42,19 +44,19 @@ class ScreenshotPage:
|
||||
|
||||
if direction == "down":
|
||||
# 向下滑动
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.95
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.05
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.90
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.1
|
||||
self.logger.info("向下滑动列表")
|
||||
else:
|
||||
# 向上滑动
|
||||
# 记录滑动前的项目,用于判断是否滑动到顶
|
||||
before_scroll_items = self.get_current_items()
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.05
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.95
|
||||
start_y = list_container.location['y'] + list_container.size['height'] * 0.1
|
||||
end_y = list_container.location['y'] + list_container.size['height'] * 0.90
|
||||
self.logger.info("向上滑动列表")
|
||||
|
||||
# 执行滑动
|
||||
self.driver.swipe(start_x, start_y, start_x, end_y, 1000)
|
||||
self.driver.swipe(start_x, start_y, start_x, end_y, 500)
|
||||
|
||||
|
||||
# 向上滑动时,检查是否滑动到顶
|
||||
@@ -233,7 +235,7 @@ class ScreenshotPage:
|
||||
def check_apply_btn(self):
|
||||
"""检查是否有平差处理按钮"""
|
||||
try:
|
||||
apply_btn = WebDriverWait(self.driver, 5).until(
|
||||
apply_btn = WebDriverWait(self.driver, 1).until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/point_measure_btn"))
|
||||
)
|
||||
if apply_btn.is_displayed():
|
||||
@@ -548,117 +550,6 @@ class ScreenshotPage:
|
||||
self.logger.error(f"截图时发生错误: {str(e)}")
|
||||
return False
|
||||
|
||||
def wait_for_measurement_end(self, timeout=900):
|
||||
"""
|
||||
等待按钮变成"测量结束",最多15分钟,包含驱动重新初始化机制
|
||||
|
||||
Args:
|
||||
timeout: 超时时间,默认900秒(15分钟)
|
||||
|
||||
Returns:
|
||||
bool: 是否成功等到测量结束按钮
|
||||
"""
|
||||
try:
|
||||
# 更新WebDriverWait等待时间为900秒
|
||||
self.wait = WebDriverWait(self.driver, 900)
|
||||
self.logger.info(f"设备等待测量结束按钮出现,最多等待 {timeout} 秒")
|
||||
|
||||
start_time = time.time()
|
||||
reinit_attempts = 0
|
||||
max_reinit_attempts = 3 # 最大重新初始化次数
|
||||
|
||||
while time.time() - start_time < timeout:
|
||||
try:
|
||||
# 使用XPath查找文本为"测量结束"的按钮
|
||||
measurement_end_button = self.driver.find_element(
|
||||
AppiumBy.XPATH,
|
||||
"//android.widget.Button[@text='测量结束']"
|
||||
)
|
||||
|
||||
if measurement_end_button.is_displayed() and measurement_end_button.is_enabled():
|
||||
self.logger.info(f"设备检测到测量结束按钮")
|
||||
return True
|
||||
|
||||
except NoSuchElementException:
|
||||
# 按钮未找到,继续等待
|
||||
pass
|
||||
except Exception as e:
|
||||
error_msg = str(e)
|
||||
self.logger.warning(f"设备查找测量结束按钮时出现异常: {error_msg}")
|
||||
|
||||
# 检测是否是UiAutomator2服务崩溃
|
||||
if 'UiAutomator2 server' in error_msg and 'instrumentation process is not running' in error_msg and reinit_attempts < max_reinit_attempts:
|
||||
reinit_attempts += 1
|
||||
self.logger.info(f"设备检测到UiAutomator2服务崩溃,尝试第 {reinit_attempts} 次重新初始化驱动")
|
||||
|
||||
# 尝试重新初始化驱动
|
||||
if self._reinit_driver():
|
||||
self.logger.info(f"设备驱动重新初始化成功")
|
||||
else:
|
||||
self.logger.error(f"设备驱动重新初始化失败")
|
||||
# 继续尝试,而不是立即失败
|
||||
|
||||
# 等待一段时间后再次检查
|
||||
time.sleep(3)
|
||||
|
||||
# 每30秒输出一次等待状态
|
||||
if int(time.time() - start_time) % 30 == 0:
|
||||
elapsed = int(time.time() - start_time)
|
||||
self.logger.info(f"设备 {self.device_id} 已等待 {elapsed} 秒,仍在等待测量结束...")
|
||||
|
||||
self.logger.error(f"设备 {self.device_id} 等待测量结束按钮超时")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {self.device_id} 等待测量结束时发生错误: {str(e)}")
|
||||
return False
|
||||
|
||||
def _reinit_driver(self):
|
||||
"""
|
||||
重新初始化Appium驱动
|
||||
|
||||
Returns:
|
||||
bool: 是否成功重新初始化
|
||||
"""
|
||||
try:
|
||||
# 首先尝试关闭现有的驱动
|
||||
if hasattr(self, 'driver') and self.driver:
|
||||
try:
|
||||
self.driver.quit()
|
||||
except:
|
||||
self.logger.warning("关闭现有驱动时出现异常")
|
||||
|
||||
# 导入必要的模块
|
||||
from appium import webdriver
|
||||
from appium.options.android import UiAutomator2Options
|
||||
|
||||
# 重新创建驱动配置
|
||||
options = UiAutomator2Options()
|
||||
options.platform_name = "Android"
|
||||
options.device_name = self.device_id
|
||||
options.app_package = "com.bjjw.cjgc"
|
||||
options.app_activity = ".activity.LoginActivity"
|
||||
options.automation_name = "UiAutomator2"
|
||||
options.no_reset = True
|
||||
options.auto_grant_permissions = True
|
||||
options.new_command_timeout = 300
|
||||
options.udid = self.device_id
|
||||
|
||||
# 重新连接驱动
|
||||
self.logger.info(f"正在重新初始化设备 {self.device_id} 的驱动...")
|
||||
self.driver = webdriver.Remote("http://localhost:4723", options=options)
|
||||
|
||||
# 重新初始化等待对象
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
self.wait = WebDriverWait(self.driver, 1)
|
||||
|
||||
self.logger.info(f"设备 {self.device_id} 驱动重新初始化完成")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {self.device_id} 驱动重新初始化失败: {str(e)}")
|
||||
return False
|
||||
|
||||
def handle_confirmation_dialog(self, device_id, timeout=2):
|
||||
"""
|
||||
处理确认弹窗,点击"是"按钮
|
||||
@@ -671,12 +562,40 @@ class ScreenshotPage:
|
||||
bool: 是否成功处理弹窗
|
||||
"""
|
||||
# 等待弹窗出现(最多等待2秒)
|
||||
try:
|
||||
# dialog_message = WebDriverWait(self.driver, timeout).until(
|
||||
# EC.presence_of_element_located((AppiumBy.XPATH, "//android.widget.TextView[@text='是否退出测量界面?']"))
|
||||
# )
|
||||
|
||||
# self.logger.info(f"设备 {device_id} 检测到确认弹窗")
|
||||
|
||||
# # 查找并点击"是"按钮
|
||||
# confirm_button = self.driver.find_element(
|
||||
# AppiumBy.XPATH,
|
||||
# "//android.widget.Button[@text='是' and @resource-id='android:id/button1']"
|
||||
# )
|
||||
|
||||
# if confirm_button.is_displayed() and confirm_button.is_enabled():
|
||||
# self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮")
|
||||
# confirm_button.click()
|
||||
# time.sleep(0.5)
|
||||
# return True
|
||||
# else:
|
||||
# self.logger.error(f"设备 {device_id} '是'按钮不可点击")
|
||||
# return False
|
||||
|
||||
# except TimeoutException:
|
||||
# # 超时未找到弹窗,认为没有弹窗,返回成功
|
||||
# self.logger.info(f"设备 {device_id} 等待 {timeout} 秒未发现确认弹窗,可能没有弹窗,返回成功")
|
||||
# return True
|
||||
max_attempts = 2
|
||||
for attempt in range(max_attempts):
|
||||
try:
|
||||
dialog_message = WebDriverWait(self.driver, timeout).until(
|
||||
EC.presence_of_element_located((AppiumBy.XPATH, "//android.widget.TextView[@text='是否退出测量界面?']"))
|
||||
)
|
||||
|
||||
self.logger.info(f"设备 {device_id} 检测到确认弹窗")
|
||||
self.logger.info(f"设备 {device_id} 检测到确认弹窗 (第 {attempt + 1} 次)")
|
||||
|
||||
# 查找并点击"是"按钮
|
||||
confirm_button = self.driver.find_element(
|
||||
@@ -685,19 +604,28 @@ class ScreenshotPage:
|
||||
)
|
||||
|
||||
if confirm_button.is_displayed() and confirm_button.is_enabled():
|
||||
self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮")
|
||||
self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮 (第 {attempt + 1} 次)")
|
||||
confirm_button.click()
|
||||
time.sleep(0.5)
|
||||
|
||||
# 如果是第一次尝试,继续检查是否还有弹窗
|
||||
if attempt < max_attempts - 1:
|
||||
self.logger.info(f"设备 {device_id} 等待 1 秒后检查是否还有弹窗")
|
||||
time.sleep(0.5)
|
||||
continue
|
||||
return True
|
||||
else:
|
||||
self.logger.error(f"设备 {device_id} '是'按钮不可点击")
|
||||
return False
|
||||
|
||||
except TimeoutException:
|
||||
# 超时未找到弹窗,认为没有弹窗,返回成功
|
||||
self.logger.info(f"设备 {device_id} 等待 {timeout} 秒未发现确认弹窗,可能没有弹窗,返回成功")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {device_id} 处理确认弹窗时出错: {str(e)}")
|
||||
return False
|
||||
|
||||
def click_back_button(self, device_id):
|
||||
"""点击手机系统返回按钮"""
|
||||
try:
|
||||
@@ -765,7 +693,7 @@ class ScreenshotPage:
|
||||
if confirm_button and confirm_button.is_displayed() and confirm_button.is_enabled():
|
||||
self.logger.info(f"设备 {device_id} 点击确认弹窗的'是'按钮")
|
||||
confirm_button.click()
|
||||
time.sleep(1)
|
||||
time.sleep(0.5)
|
||||
|
||||
# 验证弹窗是否消失
|
||||
try:
|
||||
@@ -785,7 +713,7 @@ class ScreenshotPage:
|
||||
except Exception as e:
|
||||
self.logger.warning(f"设备 {device_id} 查找确认弹窗时出现异常: {str(e)}")
|
||||
|
||||
time.sleep(1)
|
||||
time.sleep(0.5)
|
||||
|
||||
self.logger.error(f"设备 {device_id} 等待返回确认弹窗超时")
|
||||
return False
|
||||
@@ -884,7 +812,7 @@ class ScreenshotPage:
|
||||
# time.sleep(2)
|
||||
self.logger.info(f"已点击平差处理按钮,检查是否在测量页面")
|
||||
|
||||
# 检测是否存在测量列表(修正逻辑)
|
||||
# 检测是否存在测量列表
|
||||
has_measurement_list = self.check_measurement_list(device_id)
|
||||
if not has_measurement_list:
|
||||
self.logger.info(f"设备 {device_id} 存在测量列表,重新执行平差流程")
|
||||
@@ -939,11 +867,11 @@ class ScreenshotPage:
|
||||
self.logger.info(f"已点击返回按钮,等待处理返回确认弹窗")
|
||||
if not self.handle_confirmation_dialog(device_id):
|
||||
self.logger.error(f"设备 {device_id} 处理返回确认弹窗失败")
|
||||
return False
|
||||
# return False
|
||||
|
||||
|
||||
# 3. 验证是否成功返回到上一页面
|
||||
time.sleep(1) # 等待页面跳转完成
|
||||
time.sleep(0.5) # 等待页面跳转完成
|
||||
|
||||
# 可以添加页面验证逻辑,比如检查是否返回到预期的页面
|
||||
# 这里可以根据实际应用添加特定的页面元素验证
|
||||
@@ -967,7 +895,7 @@ class ScreenshotPage:
|
||||
"""
|
||||
try:
|
||||
self.logger.info(f"设备 {device_id} 开始执行测量结束后的操作流程")
|
||||
time.sleep(5)
|
||||
time.sleep(0.5)
|
||||
|
||||
# 1. 下滑列表到最底端
|
||||
if not self.scroll_list_to_bottom(device_id):
|
||||
@@ -988,11 +916,6 @@ class ScreenshotPage:
|
||||
self.logger.error(f"设备 {device_id} 点击平差处理按钮失败")
|
||||
return False
|
||||
|
||||
# # 5. 在点击平差处理按钮后截图
|
||||
# time.sleep(2) # 等待平差处理按钮点击后的界面变化
|
||||
# if not self.take_screenshot("after_adjustment_button_click"):
|
||||
# self.logger.error(f"设备 {device_id} 截图失败")
|
||||
# return False
|
||||
|
||||
self.logger.info(f"设备 {device_id} 测量结束后操作流程完成")
|
||||
return True
|
||||
@@ -1071,7 +994,7 @@ class ScreenshotPage:
|
||||
if self.click_last_spinner(device_id):
|
||||
return True
|
||||
self.logger.warning(f"设备 {device_id} 第{attempt + 1}次点击失败,准备重试")
|
||||
time.sleep(1) # 重试前等待
|
||||
time.sleep(0.5) # 重试前等待
|
||||
except Exception as e:
|
||||
self.logger.error(f"设备 {device_id} 第{attempt + 1}次尝试失败: {str(e)}")
|
||||
|
||||
@@ -1133,7 +1056,8 @@ class ScreenshotPage:
|
||||
new_driver, new_wait = reconnect_driver(actual_device_id, self.driver)
|
||||
if new_driver:
|
||||
self.driver = new_driver
|
||||
self.wait = new_wait
|
||||
# self.wait = new_wait
|
||||
self.wait = WebDriverWait(self.driver, 2)
|
||||
self.logger.info(f"设备 {actual_device_id} 驱动重连成功")
|
||||
else:
|
||||
self.logger.error(f"设备 {actual_device_id} 驱动重连失败")
|
||||
@@ -1189,8 +1113,8 @@ class ScreenshotPage:
|
||||
|
||||
retry_count += 1
|
||||
if retry_count < max_retries:
|
||||
self.logger.info(f"设备 {device_id} 将在1秒后进行第{retry_count+1}次重试")
|
||||
time.sleep(1) # 等待1秒后重试
|
||||
self.logger.info(f"设备 {device_id} 将在0.5秒后进行第{retry_count+1}次重试")
|
||||
time.sleep(0.5) # 等待0.5秒后重试
|
||||
|
||||
self.logger.error(f"设备 {device_id} 经过{max_retries}次重试后仍无法展开下拉菜单")
|
||||
return False
|
||||
@@ -1222,7 +1146,7 @@ class ScreenshotPage:
|
||||
'percent': 0.5
|
||||
})
|
||||
|
||||
time.sleep(1)
|
||||
time.sleep(0.5)
|
||||
self.logger.info(f"设备 {device_id} 额外下滑完成")
|
||||
return True
|
||||
|
||||
@@ -1343,83 +1267,127 @@ class ScreenshotPage:
|
||||
|
||||
# 检查GLOBAL_UPLOAD_BREAKPOINT_DICT是否为空,如果为空则初始化一些测试数据
|
||||
if not global_variable.get_upload_breakpoint_dict():
|
||||
self.logger.warning("global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT为空,正在初始化测试数据")
|
||||
global_variable.set_upload_breakpoint_dict({'CDWZQ-2标-龙骨湾右线大桥-0-7号墩-平原': 'L156372', 'CDWZQ-2标-蓝家湾特大 桥-31-31-平原': 'L159206'})
|
||||
self.logger.warning("上传列表为空,无法执行平差操作")
|
||||
return False
|
||||
|
||||
# global_variable.set_upload_breakpoint_dict({'CDWZQ-2标-龙骨湾右线大桥-0-7号墩-平原': 'L156372', 'CDWZQ-2标-蓝家湾特大 桥-31-31-平原': 'L159206'})
|
||||
|
||||
breakpoint_names = list(global_variable.get_upload_breakpoint_dict().keys())
|
||||
processed_breakpoints = []
|
||||
processed_breakpoints = [] # 创建一个列表,用于记录已处理的断点
|
||||
|
||||
# 开始循环处理断点
|
||||
for breakpoint_name in breakpoint_names:
|
||||
if breakpoint_name in processed_breakpoints:
|
||||
# 检测当前页面获取到的标段是否在breakpoint_names中
|
||||
max_scroll_attempts = 100 # 最大滚动尝试次数
|
||||
scroll_count = 0
|
||||
previous_items = set() # 记录前一次获取的项目集合,用于检测是否到达边界
|
||||
found_any = False # 标记是否找到并处理了任何断点
|
||||
max_retry_attempts = 3 # 每个断点的最大重试次数
|
||||
|
||||
while scroll_count < max_scroll_attempts:
|
||||
# 获取当前页面中的所有项目
|
||||
current_items = self.get_current_items()
|
||||
self.logger.info(f"当前页面找到 {len(current_items)} 个项目")
|
||||
|
||||
# 检查当前页面的项目是否在breakpoint_names中
|
||||
for item in current_items:
|
||||
# 检查项目是否在breakpoint_names中且未处理
|
||||
if item in breakpoint_names and item not in processed_breakpoints:
|
||||
self.logger.info(f"找到目标断点: {item}")
|
||||
found_any = True
|
||||
|
||||
# 获取线路编码
|
||||
try:
|
||||
line_code = global_variable.get_upload_breakpoint_dict()[item]
|
||||
except KeyError:
|
||||
self.logger.error(f"未找到断点 {item} 的线路编码")
|
||||
continue
|
||||
line_code = global_variable.get_upload_breakpoint_dict()[breakpoint_name]
|
||||
|
||||
self.logger.info(f"开始处理要平差的断点 {breakpoint_name}")
|
||||
# 重试处理断点
|
||||
retry_count = 0
|
||||
while retry_count < max_retry_attempts:
|
||||
self.logger.info(f"开始处理断点 {item} (第 {retry_count + 1} 次尝试)")
|
||||
|
||||
# 把断点名称给find_keyword
|
||||
if not self.find_keyword(breakpoint_name):
|
||||
self.logger.error(f"设备 {device_id} 未找到包含 {breakpoint_name} 的文件名")
|
||||
continue # 继续处理下一个断点
|
||||
# 点击目标项目
|
||||
if not self.click_item_by_text(item):
|
||||
self.logger.error(f"点击目标断点失败: {item}")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
if not self.handle_measurement_dialog():
|
||||
self.logger.error(f"设备 {device_id} 处理测量弹窗失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
if not self.check_apply_btn():
|
||||
self.logger.error(f"设备 {device_id} 检查平差处理按钮失败")
|
||||
self.execute_back_navigation_steps(device_id)
|
||||
continue
|
||||
retry_count += 1
|
||||
self.driver.back()
|
||||
self.logger.info(f"设备 {device_id} 检查平差处理按钮失败,已点击手机系统返回按钮")
|
||||
break
|
||||
|
||||
# 4. 点击平差处理按钮
|
||||
# 点击平差处理按钮
|
||||
if not self.click_adjustment_button(device_id):
|
||||
self.logger.error(f"设备 {device_id} 点击平差处理按钮失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
# 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差
|
||||
if not self.handle_back_navigation(breakpoint_name, device_id):
|
||||
self.logger.error(f"{breakpoint_name}平差失败,未截图")
|
||||
if not self.handle_back_navigation(item, device_id):
|
||||
self.logger.error(f"{item}平差失败,未截图")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
|
||||
# 检测并处理"是 保留成果"弹窗
|
||||
if not self.handle_adjustment_result_dialog():
|
||||
self.logger.error("处理平差结果弹窗失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
# # 平差完成,将断点数据保存到上传列表中
|
||||
# if not self.add_breakpoint_to_upload_list(breakpoint_name, line_code):
|
||||
# self.logger.error(f"设备 {device_id} 保存断点 {breakpoint_name} 到上传列表失败")
|
||||
# continue
|
||||
|
||||
# # 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差
|
||||
# if not self.handle_back_navigation(breakpoint_name, device_id):
|
||||
# self.logger.error(f"{breakpoint_name}平差失败,未截图")
|
||||
# continue
|
||||
|
||||
# # 检测并处理"是 保留成果"弹窗
|
||||
# if not self.handle_adjustment_result_dialog():
|
||||
# self.logger.error("处理平差结果弹窗失败")
|
||||
# continue
|
||||
|
||||
|
||||
# 检查在不在测量列表页面,不在就点击返回按钮并处理弹窗
|
||||
if self.check_measurement_list(device_id):
|
||||
self.logger.error(f"设备 {device_id} 未在测量列表页面")
|
||||
# 点击返回按钮并处理弹窗
|
||||
if not self.execute_back_navigation_steps(device_id):
|
||||
self.logger.error(f"设备 {device_id} 处理返回按钮确认失败")
|
||||
retry_count += 1
|
||||
continue
|
||||
|
||||
# # 成功处理完一个断点,添加到已处理列表
|
||||
# processed_breakpoints.append(breakpoint_name)
|
||||
# self.logger.info(f"成功处理断点: {breakpoint_name}")
|
||||
# 成功处理完一个断点,添加到已处理列表
|
||||
processed_breakpoints.append(item)
|
||||
# add_breakpoint_to_upload_list(item, line_code)
|
||||
self.logger.info(f"成功处理断点: {item}")
|
||||
break # 跳出重试循环
|
||||
|
||||
# # 检查是否所有断点都处理完成
|
||||
# if len(processed_breakpoints) == len(breakpoint_names):
|
||||
# self.logger.info(f"设备 {device_id} 平差页面操作执行完成")
|
||||
# return True
|
||||
# else:
|
||||
# self.logger.warning(f"设备 {device_id} 部分断点处理失败,已成功处理 {len(processed_breakpoints)}/{len(breakpoint_names)} 个断点")
|
||||
# return True
|
||||
self.logger.warning(f"设备 {device_id} 平差线路到上传页面流程执行完成")
|
||||
# 检查是否重试次数用完仍未成功
|
||||
if retry_count == max_retry_attempts-1:
|
||||
self.logger.error(f"断点 {item} 经过 {max_retry_attempts} 次重试后仍然失败")
|
||||
|
||||
# 重新获取当前页面项目,因为可能有新的项目加载
|
||||
continue
|
||||
# 向下滑动列表以加载更多项目
|
||||
if not self.scroll_list(direction="down"):
|
||||
self.logger.error("向下滑动列表失败")
|
||||
continue
|
||||
|
||||
# 检查是否到达底部:连续两次获取的项目相同
|
||||
if current_items == previous_items and len(current_items) > 0:
|
||||
self.logger.info("连续两次获取的项目相同,已到达列表底部")
|
||||
break
|
||||
|
||||
# 更新前一次项目集合
|
||||
previous_items = current_items.copy()
|
||||
|
||||
scroll_count += 1
|
||||
self.logger.info(f"第 {scroll_count} 次向下滑动,继续查找...")
|
||||
|
||||
# 检查是否所有断点都处理完成
|
||||
if len(processed_breakpoints) == len(breakpoint_names):
|
||||
self.logger.info(f"设备 {device_id} 平差页面操作执行完成")
|
||||
return True
|
||||
elif found_any:
|
||||
self.logger.warning(f"设备 {device_id} 部分断点处理完成,已成功处理 {len(processed_breakpoints)}/{len(breakpoint_names)} 个断点")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning(f"设备 {device_id} 未找到任何目标断点")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
@@ -1451,22 +1419,3 @@ class ScreenshotPage:
|
||||
time.sleep(10)
|
||||
|
||||
return False
|
||||
def run_automation_test(self):
|
||||
# 滑动列表到底部
|
||||
if not self.scroll_list_to_bottom(self.device_id):
|
||||
self.logger.error(f"设备 {self.device_id} 下滑列表到底部失败")
|
||||
return False
|
||||
|
||||
# 2. 点击最后一个spinner
|
||||
if not self.click_last_spinner_with_retry(self.device_id):
|
||||
self.logger.error(f"设备 {self.device_id} 点击最后一个spinner失败")
|
||||
return False
|
||||
|
||||
# 3. 再下滑一次
|
||||
if not self.scroll_down_once(self.device_id):
|
||||
self.logger.warning(f"设备 {self.device_id} 再次下滑失败,但继续执行")
|
||||
|
||||
# 4. 点击平差处理按钮
|
||||
if not self.click_adjustment_button(self.device_id):
|
||||
self.logger.error(f"设备 {self.device_id} 点击平差处理按钮失败")
|
||||
return False
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# \page_objects\test_upload_config_page.py
|
||||
from appium.webdriver.common.appiumby import AppiumBy
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.common.exceptions import TimeoutException, NoSuchElementException
|
||||
import logging
|
||||
@@ -20,11 +21,74 @@ import globals.global_variable as global_variable
|
||||
class UploadConfigPage:
|
||||
def __init__(self, driver, wait, device_id):
|
||||
self.driver = driver
|
||||
self.wait = wait
|
||||
self.wait = WebDriverWait(driver, 2)
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.more_download_page = MoreDownloadPage(driver, wait,device_id)
|
||||
self.device_id = device_id
|
||||
|
||||
|
||||
def get_breakpoint_list_from_page(self):
|
||||
"""
|
||||
从当前页面获取断点列表的断点名称
|
||||
Returns:
|
||||
list: 断点名称列表
|
||||
"""
|
||||
breakpoint_list = []
|
||||
try:
|
||||
# 优化点1: 等待列表容器出现,确保页面已加载
|
||||
self.wait.until(EC.presence_of_element_located((By.ID, "com.bjjw.cjgc:id/upload_result_list")))
|
||||
|
||||
# 优化点2: 等待至少一个itemContainer出现,确保列表有数据
|
||||
self.wait.until(EC.presence_of_element_located((By.ID, "com.bjjw.cjgc:id/itemContainer")))
|
||||
|
||||
# 方法1: 直接获取所有标题元素(最直接高效)
|
||||
title_elements = self.driver.find_elements(By.ID, "com.bjjw.cjgc:id/title")
|
||||
|
||||
if title_elements:
|
||||
for element in title_elements:
|
||||
breakpoint_name = element.text
|
||||
if breakpoint_name and breakpoint_name.strip(): # 增加空值过滤
|
||||
breakpoint_list.append(breakpoint_name.strip())
|
||||
print(f"✅ 直接通过title获取到 {len(breakpoint_list)} 个断点")
|
||||
|
||||
# 方法2: 如果方法1失败,通过itemContainer获取(备选方案)
|
||||
if not breakpoint_list:
|
||||
print("⚠️ 直接获取title失败,尝试通过itemContainer获取...")
|
||||
item_containers = self.driver.find_elements(By.ID, "com.bjjw.cjgc:id/itemContainer")
|
||||
for container in item_containers:
|
||||
try:
|
||||
title_element = container.find_element(By.ID, "com.bjjw.cjgc:id/title")
|
||||
breakpoint_name = title_element.text
|
||||
if breakpoint_name and breakpoint_name.strip():
|
||||
breakpoint_list.append(breakpoint_name.strip())
|
||||
except:
|
||||
continue
|
||||
print(f"✅ 通过itemContainer获取到 {len(breakpoint_list)} 个断点")
|
||||
|
||||
# 打印结果
|
||||
if breakpoint_list:
|
||||
print(f"📋 断点列表:")
|
||||
for i, name in enumerate(breakpoint_list, 1):
|
||||
print(f" {i}. {name}")
|
||||
else:
|
||||
print("⚠️ 未获取到任何断点,列表可能为空")
|
||||
|
||||
return breakpoint_list
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 获取断点列表失败: {str(e)}")
|
||||
# 可以在这里打印更多调试信息
|
||||
try:
|
||||
page_source = driver.page_source
|
||||
print("📄 当前页面源码已保存,可用于调试")
|
||||
# 可以将page_source保存到文件,方便分析
|
||||
with open("debug_page_source.xml", "w", encoding="utf-8") as f:
|
||||
f.write(page_source)
|
||||
except:
|
||||
pass
|
||||
return breakpoint_list
|
||||
|
||||
|
||||
def go_upload_config_page(self):
|
||||
"""点击img_2_layout(上传页面按钮)"""
|
||||
try:
|
||||
@@ -40,7 +104,7 @@ class UploadConfigPage:
|
||||
except Exception as e:
|
||||
self.logger.error(f"获取当前activity时出错: {str(e)}")
|
||||
|
||||
# 尝试返回到主页面(如果不在主页面)
|
||||
# 尝试返回到主页面(如果不在主页面)保存上传
|
||||
self.logger.info("尝试返回到主页面...")
|
||||
max_back_presses = 5 # 最多按返回键次数
|
||||
back_press_count = 0
|
||||
@@ -139,6 +203,45 @@ class UploadConfigPage:
|
||||
EC.presence_of_element_located((AppiumBy.XPATH, item_container_xpath))
|
||||
)
|
||||
# self.logger.info(f"找到包含断点 {breakpoint_name} 的itemContainer")
|
||||
# 1. 获取测量时间并比较是不是今天
|
||||
# 在itemContainer内查找subtitle元素
|
||||
try:
|
||||
subtitle_element = item_container.find_element(
|
||||
AppiumBy.ID,
|
||||
"com.bjjw.cjgc:id/subtitle"
|
||||
)
|
||||
measurement_time_text = subtitle_element.text
|
||||
self.logger.info(f"找到测量时间文本: {measurement_time_text}")
|
||||
|
||||
# 提取时间部分(去掉"测量时间:"前缀)
|
||||
if "测量时间:" in measurement_time_text:
|
||||
# 方法1:使用split提取年月日部分
|
||||
time_str = measurement_time_text.replace("测量时间:", "")
|
||||
# 只取年月日部分(假设格式为 YYYY-MM-DD HH:MM:SS)
|
||||
measurement_date_str = time_str.split()[0] # 取空格前的部分
|
||||
self.logger.info(f"提取到的测量日期: {measurement_date_str}")
|
||||
|
||||
try:
|
||||
# 将字符串日期转换为datetime对象进行比较
|
||||
measurement_date = datetime.strptime(measurement_date_str, "%Y-%m-%d").date()
|
||||
today_date = datetime.now().date()
|
||||
|
||||
self.logger.info(f"测量日期: {measurement_date}, 今天日期: {today_date}")
|
||||
|
||||
# 判断逻辑:测量日期 > 今天 → 不允许上传
|
||||
if measurement_date > today_date:
|
||||
self.logger.warning(f"测量日期 {measurement_date} 是未来日期,不允许上传")
|
||||
return False
|
||||
|
||||
# 测量日期 <= 今天 → 允许上传
|
||||
self.logger.info(f"✓ 测量日期 {measurement_date} 小于等于今天,允许上传")
|
||||
|
||||
except ValueError as e:
|
||||
self.logger.error(f"日期格式解析失败: {measurement_date_str}, 错误: {str(e)}")
|
||||
return False
|
||||
except Exception as e:
|
||||
self.logger.warning(f"获取测量时间失败: {str(e)};不点击线路{breakpoint_name}的上传按钮")
|
||||
return False
|
||||
|
||||
# 在itemContainer中查找上传按钮
|
||||
upload_btn = item_container.find_element(
|
||||
@@ -151,17 +254,7 @@ class UploadConfigPage:
|
||||
self.logger.info(f"已点击断点 {breakpoint_name} 的上传按钮")
|
||||
|
||||
# 等待上传操作开始
|
||||
time.sleep(3)
|
||||
|
||||
# # 检查上传是否开始
|
||||
# try:
|
||||
# upload_indicator = WebDriverWait(self.driver, 20).until(
|
||||
# EC.presence_of_element_located((AppiumBy.XPATH, "//*[contains(@text, '上传') or contains(@text, 'Upload')]"))
|
||||
# )
|
||||
# self.logger.info(f"上传操作已开始: {upload_indicator.text}")
|
||||
# except TimeoutException:
|
||||
# self.logger.warning("未检测到明确的上传开始提示,但按钮点击已完成")
|
||||
|
||||
# time.sleep(3)
|
||||
return True
|
||||
|
||||
except TimeoutException:
|
||||
@@ -314,8 +407,8 @@ class UploadConfigPage:
|
||||
'com.bjjw.cjgc:id/point_values'
|
||||
)
|
||||
|
||||
self.logger.info(f"找到 {len(point_name_elements)} 个测点")
|
||||
self.logger.info(f"找到 {len(point_value_elements)} 个数据元素")
|
||||
# self.logger.info(f"找到 {len(point_name_elements)} 个测点")
|
||||
# self.logger.info(f"找到 {len(point_value_elements)} 个数据元素")
|
||||
|
||||
# 提取每个测点的数据
|
||||
for i, (name_element, value_element) in enumerate(zip(point_name_elements, point_value_elements)):
|
||||
@@ -354,7 +447,7 @@ class UploadConfigPage:
|
||||
|
||||
point_data.append(point_info)
|
||||
|
||||
self.logger.info(f"测点 {i+1}: {point_name}")
|
||||
# self.logger.info(f"测点 {i+1}: {point_name}")
|
||||
# self.logger.info(f"完整数据: {point_value}")
|
||||
|
||||
except Exception as e:
|
||||
@@ -458,54 +551,54 @@ class UploadConfigPage:
|
||||
self.logger.error(f"检查上传配置页面时发生意外错误: {str(e)}")
|
||||
return False
|
||||
|
||||
def collect_all_point_data(self, results_dir):
|
||||
"""循环滑动收集所有测点数据,直到没有新数据出现"""
|
||||
all_point_data = []
|
||||
seen_point_names = set() # 用于跟踪已经见过的测点名称
|
||||
max_scroll_attempts = 20 # 最大滑动次数,防止无限循环
|
||||
scroll_attempt = 0
|
||||
# def collect_all_point_data(self, results_dir):
|
||||
# """循环滑动收集所有测点数据,直到没有新数据出现"""
|
||||
# all_point_data = []
|
||||
# seen_point_names = set() # 用于跟踪已经见过的测点名称
|
||||
# max_scroll_attempts = 20 # 最大滑动次数,防止无限循环
|
||||
# scroll_attempt = 0
|
||||
|
||||
self.logger.info("开始循环滑动收集所有测点数据...")
|
||||
# self.logger.info("开始循环滑动收集所有测点数据...")
|
||||
|
||||
while scroll_attempt < max_scroll_attempts:
|
||||
scroll_attempt += 1
|
||||
self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
# while scroll_attempt < max_scroll_attempts:
|
||||
# scroll_attempt += 1
|
||||
# self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
|
||||
# 获取当前屏幕的测点数据
|
||||
current_point_data = self.get_point_data()
|
||||
# # 获取当前屏幕的测点数据
|
||||
# current_point_data = self.get_point_data()
|
||||
|
||||
if not current_point_data:
|
||||
self.logger.info("当前屏幕没有测点数据,停止滑动")
|
||||
break
|
||||
# if not current_point_data:
|
||||
# self.logger.info("当前屏幕没有测点数据,停止滑动")
|
||||
# break
|
||||
|
||||
# 统计新发现的测点
|
||||
new_points_count = 0
|
||||
for point in current_point_data:
|
||||
point_name = point.get('point_name')
|
||||
if point_name and point_name not in seen_point_names:
|
||||
# 新测点,添加到结果集
|
||||
all_point_data.append(point)
|
||||
seen_point_names.add(point_name)
|
||||
new_points_count += 1
|
||||
# # 统计新发现的测点
|
||||
# new_points_count = 0
|
||||
# for point in current_point_data:
|
||||
# point_name = point.get('point_name')
|
||||
# if point_name and point_name not in seen_point_names:
|
||||
# # 新测点,添加到结果集
|
||||
# all_point_data.append(point)
|
||||
# seen_point_names.add(point_name)
|
||||
# new_points_count += 1
|
||||
|
||||
self.logger.info(f"本次获取到 {len(current_point_data)} 个测点,其中 {new_points_count} 个是新测点")
|
||||
# self.logger.info(f"本次获取到 {len(current_point_data)} 个测点,其中 {new_points_count} 个是新测点")
|
||||
|
||||
# 如果没有新数据,停止滑动
|
||||
if new_points_count == 0:
|
||||
self.logger.info("没有发现新测点,停止滑动")
|
||||
break
|
||||
# # 如果没有新数据,停止滑动
|
||||
# if new_points_count == 0:
|
||||
# self.logger.info("没有发现新测点,停止滑动")
|
||||
# break
|
||||
|
||||
# 滑动到下一页
|
||||
self.logger.info("滑动到下一页...")
|
||||
if not self.swipe_up():
|
||||
self.logger.warning("滑动失败,停止收集")
|
||||
break
|
||||
# # 滑动到下一页
|
||||
# self.logger.info("滑动到下一页...")
|
||||
# if not self.swipe_up():
|
||||
# self.logger.warning("滑动失败,停止收集")
|
||||
# break
|
||||
|
||||
# 等待页面稳定
|
||||
time.sleep(1)
|
||||
# # 等待页面稳定
|
||||
# time.sleep(1)
|
||||
|
||||
self.logger.info(f"数据收集完成,共获取 {len(all_point_data)} 个测点数据")
|
||||
return all_point_data
|
||||
# self.logger.info(f"数据收集完成,共获取 {len(all_point_data)} 个测点数据")
|
||||
# return all_point_data
|
||||
|
||||
def collect_check_all_point_data(self, max_variation):
|
||||
"""循环滑动收集所有测点数据,直到没有新数据出现"""
|
||||
@@ -518,7 +611,7 @@ class UploadConfigPage:
|
||||
|
||||
while scroll_attempt < max_scroll_attempts:
|
||||
scroll_attempt += 1
|
||||
self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
# self.logger.info(f"第 {scroll_attempt} 次尝试获取数据...")
|
||||
|
||||
# 获取当前屏幕的测点数据
|
||||
current_point_data = self.get_point_data()
|
||||
@@ -922,7 +1015,7 @@ class UploadConfigPage:
|
||||
|
||||
if workinfo_names:
|
||||
workinfo_name = workinfo_names[0] # 主要工况
|
||||
self.logger.info(f"为{work_type_name}({work_type_str})选择主要工况: {workinfo_name}")
|
||||
# self.logger.info(f"为{work_type_name}({work_type_str})选择主要工况: {workinfo_name}")
|
||||
|
||||
try:
|
||||
# 点击工况选择按钮
|
||||
@@ -931,6 +1024,44 @@ class UploadConfigPage:
|
||||
)
|
||||
condition_button.click()
|
||||
self.logger.info(f"成功点击{work_type_name}工况选择按钮")
|
||||
except TimeoutException:
|
||||
self.logger.error(f"等待{work_type_name}工况选择按钮超时")
|
||||
id_list = [
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_suidao",
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_luji",
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_qiaoliang",
|
||||
"com.bjjw.cjgc:id/all_point_workinfo_sp_handong",
|
||||
]
|
||||
for id in id_list:
|
||||
if id == button_id:
|
||||
continue
|
||||
try:
|
||||
self.wait.until(
|
||||
EC.element_to_be_clickable((AppiumBy.ID, id))
|
||||
)
|
||||
self.driver.find_element(AppiumBy.ID, id).click()
|
||||
self.logger.info(f"成功点击{work_type_name}其他工况选择按钮: {id}")
|
||||
except TimeoutException:
|
||||
self.logger.error(f"等待{work_type_name}其他工况选择按钮超时: {id}")
|
||||
# return False
|
||||
except Exception as e:
|
||||
self.logger.error(f"点击{work_type_name}工况按钮时出错: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
|
||||
# 检查是否有ListView,如果没有就再次点击
|
||||
try:
|
||||
# 尝试查找ListView
|
||||
self.wait.until(
|
||||
EC.presence_of_element_located((AppiumBy.CLASS_NAME, "android.widget.ListView"))
|
||||
)
|
||||
self.logger.info(f"找到{work_type_name}工况选择的ListView")
|
||||
except TimeoutException:
|
||||
# 没有找到ListView,再次点击按钮
|
||||
self.logger.warning(f"未找到{work_type_name}工况选择的ListView,再次点击按钮")
|
||||
condition_button.click()
|
||||
self.logger.info(f"再次成功点击{work_type_name}工况选择按钮")
|
||||
|
||||
# 选择主要的工况选项
|
||||
if self._select_condition_option(workinfo_name):
|
||||
@@ -939,10 +1070,10 @@ class UploadConfigPage:
|
||||
else:
|
||||
self.logger.warning(f"未能为{work_type_name}选择主要工况: {workinfo_name}")
|
||||
|
||||
except TimeoutException:
|
||||
self.logger.error(f"等待{work_type_name}工况选择按钮超时")
|
||||
except Exception as e:
|
||||
self.logger.error(f"点击{work_type_name}工况按钮时出错: {str(e)}")
|
||||
# except TimeoutException:
|
||||
# self.logger.error(f"等待{work_type_name}工况选择按钮超时")
|
||||
# except Exception as e:
|
||||
# self.logger.error(f"点击{work_type_name}工况按钮时出错: {str(e)}")
|
||||
|
||||
# 第二步:如果有次要工况,滑动页面处理
|
||||
if minor_conditions_list:
|
||||
@@ -1120,10 +1251,24 @@ class UploadConfigPage:
|
||||
"com.bjjw.cjgc:id/point_workinfo_sp"
|
||||
)
|
||||
|
||||
|
||||
# 验证按钮是否可见和可用
|
||||
if workinfo_button.is_displayed() and workinfo_button.is_enabled():
|
||||
workinfo_button.click()
|
||||
self.logger.info(f"已点击测点 {point_id} 的工况选择按钮")
|
||||
self.logger.info(f"已点击测点 {point_id} 的次要工况选择按钮")
|
||||
# 检查是否有ListView,如果没有就再次点击
|
||||
try:
|
||||
# 尝试查找ListView
|
||||
self.wait.until(
|
||||
EC.presence_of_element_located((AppiumBy.CLASS_NAME, "android.widget.ListView"))
|
||||
)
|
||||
self.logger.info(f"找到{point_id}次要工况选择的ListView")
|
||||
except TimeoutException:
|
||||
# 没有找到ListView,再次点击按钮
|
||||
self.logger.warning(f"未找到{point_id}次要工况选择的ListView,再次点击按钮")
|
||||
workinfo_button.click()
|
||||
self.logger.info(f"再次成功点击{point_id}次要工况选择按钮")
|
||||
|
||||
|
||||
# 选择对应的工况选项
|
||||
if self._select_minor_conditions_option(workinfoname, work_type):
|
||||
@@ -1370,33 +1515,6 @@ class UploadConfigPage:
|
||||
|
||||
return points
|
||||
|
||||
def _set_single_point_work_condition(self, point_data: Dict, workinfo_name: str, work_type: str) -> bool:
|
||||
"""为单个测点设置工况信息"""
|
||||
try:
|
||||
point_name = point_data.get('point_name')
|
||||
self.logger.info(f"开始为测点 {point_name} 设置工况: {workinfo_name}")
|
||||
|
||||
# 使用保存的元素引用点击工况选择按钮
|
||||
workinfo_element = point_data.get('workinfo_element')
|
||||
if workinfo_element:
|
||||
workinfo_element.click()
|
||||
time.sleep(1) # 等待选项弹出
|
||||
|
||||
# 选择指定的工况
|
||||
if self._select_condition_option(workinfo_name):
|
||||
self.logger.info(f"成功为测点 {point_name} 设置工况: {workinfo_name}")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning(f"为测点 {point_name} 选择工况选项失败")
|
||||
return False
|
||||
else:
|
||||
self.logger.warning(f"未找到测点 {point_name} 的工况选择按钮")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"为测点 {point_name} 设置工况时出错: {str(e)}")
|
||||
return False
|
||||
|
||||
def _select_condition_option(self, condition_name: str) -> bool:
|
||||
"""选择具体的工况选项
|
||||
|
||||
@@ -1416,7 +1534,7 @@ class UploadConfigPage:
|
||||
EC.element_to_be_clickable((AppiumBy.XPATH, option_xpath))
|
||||
)
|
||||
option_element.click()
|
||||
self.logger.info(f"通过文本定位成功选择工况: {condition_name}")
|
||||
# self.logger.info(f"通过文本定位成功选择工况: {condition_name}")
|
||||
return True
|
||||
except TimeoutException:
|
||||
self.logger.debug(f"通过文本'{condition_name}'未找到工况选项")
|
||||
@@ -1434,18 +1552,18 @@ class UploadConfigPage:
|
||||
self.logger.debug("未找到列表项形式的工况选项")
|
||||
|
||||
# 方法3: 尝试点击屏幕特定位置(备选方案)
|
||||
try:
|
||||
# 获取屏幕尺寸
|
||||
window_size = self.driver.get_window_size()
|
||||
x = window_size['width'] // 2
|
||||
y = window_size['height'] // 2
|
||||
# try:
|
||||
# # 获取屏幕尺寸
|
||||
# window_size = self.driver.get_window_size()
|
||||
# x = window_size['width'] // 2
|
||||
# y = window_size['height'] // 2
|
||||
|
||||
# 点击屏幕中央(假设选项在中间)
|
||||
self.driver.tap([(x, y)])
|
||||
self.logger.info("通过点击屏幕中央选择工况")
|
||||
return True
|
||||
except Exception as e:
|
||||
self.logger.debug(f"点击屏幕中央失败: {str(e)}")
|
||||
# # 点击屏幕中央(假设选项在中间)
|
||||
# self.driver.tap([(x, y)])
|
||||
# self.logger.info("通过点击屏幕中央选择工况")
|
||||
# return True
|
||||
# except Exception as e:
|
||||
# self.logger.debug(f"点击屏幕中央失败: {str(e)}")
|
||||
|
||||
self.logger.error(f"所有方法都无法选择工况选项: {condition_name}")
|
||||
return False
|
||||
@@ -1483,12 +1601,12 @@ class UploadConfigPage:
|
||||
# return False
|
||||
# 跳转到上传配置页面
|
||||
if not go_main_click_tabber_button(self.driver, self.device_id, "com.bjjw.cjgc:id/img_2_layout"):
|
||||
logging.error(f"设备 {self.device_id} 跳转到上传配置页面失败")
|
||||
logging.error(f"设备 {self.device_id} 跳转到上传配置页面失败(下载操作)")
|
||||
return False
|
||||
|
||||
# 根据断点名称点击上传按钮
|
||||
if not self.click_upload_by_breakpoint_name(breakpoint_name):
|
||||
self.logger.error("点击上传按钮失败")
|
||||
self.logger.error("点击上传按钮失败(下载操作)")
|
||||
return False
|
||||
|
||||
if not self.handle_upload_dialog():
|
||||
@@ -1606,7 +1724,7 @@ class UploadConfigPage:
|
||||
self.logger.info("开始等待上传完成")
|
||||
|
||||
# 等待弹窗显示
|
||||
upload_list = WebDriverWait(self.driver, 10).until(
|
||||
upload_list = WebDriverWait(self.driver, 2).until(
|
||||
EC.presence_of_element_located((AppiumBy.ID, "android:id/customPanel"))
|
||||
)
|
||||
#等待弹窗消失
|
||||
@@ -1666,7 +1784,7 @@ class UploadConfigPage:
|
||||
minor_conditions_list = [] # 次要工况列表 [{point_id, work_type, workinfoname}]
|
||||
|
||||
# 定义阈值:出现次数少于这个值的认为是次要工况
|
||||
minor_threshold = 3 # 可以根据实际情况调整
|
||||
minor_threshold = 2 # 可以根据实际情况调整
|
||||
|
||||
for work_type, workinfoname_counts in work_type_stats.items():
|
||||
if workinfoname_counts:
|
||||
@@ -1736,7 +1854,7 @@ class UploadConfigPage:
|
||||
|
||||
# 跳转到上传配置页面
|
||||
if not go_main_click_tabber_button(self.driver, self.device_id, "com.bjjw.cjgc:id/img_2_layout"):
|
||||
logging.error(f"设备 {self.device_id} 跳转到测量页面失败")
|
||||
logging.error(f"设备 {self.device_id} 跳转到上传配置页面失败")
|
||||
return False
|
||||
|
||||
# 根据断点名称点击上传按钮
|
||||
@@ -1817,17 +1935,7 @@ class UploadConfigPage:
|
||||
|
||||
# 获取线路的所有工况信息
|
||||
work_conditions = apis.get_work_conditions_by_linecode(self.line_num)
|
||||
# work_conditions = {'1962527': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2},
|
||||
# '0299815Z2': {'sjName': '王顺', 'workinfoname': '冬休', 'work_type': 2},
|
||||
# '0299820H1': {'sjName': '王顺', 'workinfoname': '架桥机(运梁车) 首次通过后', 'work_type': 4},
|
||||
# '0431248D1': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 4},
|
||||
# '0431248D2': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 4},
|
||||
# '0299815Z1': {'sjName': '王顺', 'workinfoname': '架桥机(运梁车) 首次通过前', 'work_type': 2},
|
||||
# '0431289D2': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 4},
|
||||
# '0431330D1': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2},
|
||||
# '0431330D2': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2},
|
||||
# '0431370D1': {'sjName': '王顺', 'workinfoname': '轨道板(道床)铺设后,第1个月', 'work_type': 2}}
|
||||
self.logger.info(f"获取线路工况信息成功: {work_conditions}")
|
||||
# self.logger.info(f"获取线路工况信息成功: {work_conditions}")
|
||||
if not work_conditions:
|
||||
self.logger.error("获取工况信息失败")
|
||||
return False
|
||||
@@ -1869,6 +1977,7 @@ class UploadConfigPage:
|
||||
|
||||
# # 暂不上传,使用返回按钮替代。
|
||||
# self.driver.back()
|
||||
# return True
|
||||
|
||||
|
||||
# 等待上传,查看loading弹窗。没有就下一个
|
||||
|
||||
99
scheduler.py
99
scheduler.py
@@ -30,14 +30,6 @@ def update_file_status(username, from_status, to_status):
|
||||
with open(TIME_FILE_PATH, 'r', encoding='utf-8') as f:
|
||||
lines = f.readlines()
|
||||
|
||||
# new_lines = []
|
||||
# for line in lines:
|
||||
# clean_line = line.strip()
|
||||
# # 匹配逻辑:包含用户名 且 以 from_status 结尾
|
||||
# if f" {username} " in line and clean_line.endswith(from_status):
|
||||
# line = line.replace(from_status, to_status)
|
||||
# success = True
|
||||
# new_lines.append(line)
|
||||
new_lines = []
|
||||
for line in lines:
|
||||
# 使用正则确保精准匹配用户名和结尾状态
|
||||
@@ -60,7 +52,7 @@ def update_file_status(username, from_status, to_status):
|
||||
|
||||
def parse_time_config():
|
||||
"""
|
||||
解析 time.txt,只获取状态为 true 的任务
|
||||
解析 time.txt,只获取状态为 ok 的任务
|
||||
"""
|
||||
time_map = {}
|
||||
if not os.path.exists(TIME_FILE_PATH):
|
||||
@@ -72,8 +64,8 @@ def parse_time_config():
|
||||
with open(TIME_FILE_PATH, 'r', encoding='utf-8') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
# 匹配:用户名 时间 true (仅获取待处理任务)
|
||||
match = re.search(r'(\w+)\s+(\d{1,2}:\d{2}:\d{2})\s+true$', line)
|
||||
# 匹配:用户名 时间 ok (仅获取待处理任务)
|
||||
match = re.search(r'([\w-]+)\s+(\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{2}:\d{2})\s+ok$', line)
|
||||
if match:
|
||||
username, scheduled_time = match.group(1), match.group(2)
|
||||
time_map[username] = scheduled_time
|
||||
@@ -81,22 +73,56 @@ def parse_time_config():
|
||||
print(f"❌ 解析 time.txt 失败: {e}")
|
||||
return time_map
|
||||
|
||||
|
||||
|
||||
def normalize_datetime(time_str):
|
||||
"""
|
||||
将时间字符串格式化为标准格式:YYYY-MM-DD HH:MM:SS
|
||||
补全单数字的月、日、时
|
||||
例如:2024-1-15 9:52:20 -> 2024-01-15 09:52:20
|
||||
"""
|
||||
try:
|
||||
# 分割日期和时间部分
|
||||
if ' ' in time_str:
|
||||
date_part, time_part = time_str.split(' ', 1)
|
||||
|
||||
# 补全日期部分的单数字
|
||||
date_parts = date_part.split('-')
|
||||
if len(date_parts) == 3:
|
||||
year = date_parts[0]
|
||||
month = date_parts[1].zfill(2) # 月补零
|
||||
day = date_parts[2].zfill(2) # 日补零
|
||||
date_part = f"{year}-{month}-{day}"
|
||||
|
||||
# 补全时间部分的单数字小时
|
||||
time_parts = time_part.split(':')
|
||||
if len(time_parts) >= 1:
|
||||
hour = time_parts[0].zfill(2) # 小时补零
|
||||
time_part = f"{hour}:{':'.join(time_parts[1:])}"
|
||||
|
||||
return f"{date_part} {time_part}"
|
||||
return time_str
|
||||
except Exception as e:
|
||||
print(f"⚠️ 时间格式标准化失败 ({time_str}): {e}")
|
||||
return time_str
|
||||
|
||||
def get_combined_tasks():
|
||||
"""
|
||||
结合接口(is_ok==1)和本地文件(true)筛选任务
|
||||
结合接口(is_ok==1)和本地文件(ok)筛选任务
|
||||
"""
|
||||
try:
|
||||
local_times = parse_time_config()
|
||||
print(f"📝 [文件解析]local_times: {local_times}")
|
||||
if not local_times:
|
||||
return {}
|
||||
|
||||
# 调用你的 API 接口获取账号信息
|
||||
accounts = apis.get_accounts_from_server("68c0dbfdb7cbcd616e7c5ab5")
|
||||
accounts = apis.get_accounts_from_server("68ef0e02b0138d25e2ac9918")
|
||||
if not accounts:
|
||||
return {}
|
||||
|
||||
task_list = {}
|
||||
today = datetime.now().strftime("%Y-%m-%d")
|
||||
# today = datetime.now().strftime("%Y-%m-%d")
|
||||
|
||||
for account in accounts:
|
||||
if account.get('is_ok') == 1:
|
||||
@@ -104,19 +130,13 @@ def get_combined_tasks():
|
||||
ip = account.get('device_ip')
|
||||
port = account.get('device_port')
|
||||
|
||||
# 只有在 time.txt 中是 true 的账号才会被加入
|
||||
# 只有在 time.txt 中是 ok 的账号才会被加入
|
||||
if user in local_times and ip and port:
|
||||
address = f"{ip}:{port}"
|
||||
# full_time = f"{today} {local_times[user]}"
|
||||
# 确保时间是两位数格式
|
||||
raw_time = local_times[user]
|
||||
# 将时间格式化为两位数:9:52:20 -> 09:52:20
|
||||
if ':' in raw_time:
|
||||
parts = raw_time.split(':')
|
||||
if len(parts[0]) == 1:
|
||||
raw_time = f"0{raw_time}" # 补齐前导零
|
||||
|
||||
full_time = f"{today} {raw_time}"
|
||||
full_time = normalize_datetime(raw_time)
|
||||
task_list[address] = {"time": full_time, "user": user}
|
||||
|
||||
return task_list
|
||||
@@ -126,24 +146,29 @@ def get_combined_tasks():
|
||||
|
||||
def run_task(address, target_time, username):
|
||||
"""
|
||||
单个执行线程:锁定状态 -> 等待 -> 执行 -> 完成
|
||||
单个执行线程:检查时间 -> 锁定状态 -> 执行 -> 完成
|
||||
"""
|
||||
# 1. 尝试将状态从 true 改为 running (锁定任务)
|
||||
print(f"📅 [任务检查] 设备: {address} | 用户: {username} | 计划时间: {target_time}")
|
||||
|
||||
try:
|
||||
# 1. 检查当前时间是否到达计划时间
|
||||
target_dt = datetime.strptime(target_time, "%Y-%m-%d %H:%M:%S")
|
||||
current_dt = datetime.now()
|
||||
|
||||
# 如果当前时间还未到达计划时间,直接返回,等待下次轮询
|
||||
if current_dt < target_dt:
|
||||
time_diff = int((target_dt - current_dt).total_seconds())
|
||||
print(f"⏰ {username} 计划时间未到,距离执行还有 {time_diff} 秒,等待下次轮询")
|
||||
return f"⏰ {username} 计划时间未到,等待下次轮询"
|
||||
|
||||
# 2. 开始执行前,尝试将状态从 ok 改为 running (锁定任务)
|
||||
# 如果此时文件状态已被其他逻辑修改,则放弃执行,防止重复
|
||||
if not update_file_status(username, "true", "running"):
|
||||
print(f"🔒 [准备锁定] 尝试锁定任务状态: {username}")
|
||||
if not update_file_status(username, "ok", "running"):
|
||||
return f"⏭️ {username} 状态已变更,跳过执行。"
|
||||
|
||||
print(f"🚀 [任务锁定] 设备: {address} | 用户: {username} | 计划时间: {target_time}")
|
||||
|
||||
try:
|
||||
# 2. 计算并执行等待逻辑
|
||||
target_dt = datetime.strptime(target_time, "%Y-%m-%d %H:%M:%S")
|
||||
wait_secs = (target_dt - datetime.now()).total_seconds()
|
||||
|
||||
if wait_secs > 0:
|
||||
print(f"⏳ {username} 距离执行还有 {int(wait_secs)} 秒...")
|
||||
time.sleep(wait_secs)
|
||||
|
||||
# 3. 调用 main.py 中的自动化逻辑
|
||||
print(f"▶️ [正在执行] {username} 开始自动化操作...")
|
||||
automation = DeviceAutomation(address)
|
||||
@@ -155,11 +180,15 @@ def run_task(address, target_time, username):
|
||||
|
||||
except Exception as e:
|
||||
# 如果中间报错,将状态改为 error 方便排查
|
||||
# 只有在状态已经改为 running 的情况下才需要改为 error
|
||||
try:
|
||||
update_file_status(username, "running", "error")
|
||||
except:
|
||||
pass
|
||||
return f"❌ {username} 执行异常: {str(e)}"
|
||||
|
||||
def monitor_center():
|
||||
"""调度中心:每半小时检查一次"""
|
||||
"""调度中心:每10分钟检查一次"""
|
||||
while True:
|
||||
now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||
print(f"\n{'='*20} 周期性检查开始 ({now_str}) {'='*20}")
|
||||
|
||||
80
test.py
Normal file
80
test.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from globals.driver_utils import init_appium_driver
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
import permissions # 导入权限处理模块
|
||||
import logging
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
import main # 导入权限处理模块
|
||||
def get_breakpoint_list_from_page():
|
||||
driver, wait = init_appium_driver("77a6ac91")
|
||||
"""
|
||||
从当前页面获取断点列表的断点名称
|
||||
Returns:
|
||||
list: 断点名称列表
|
||||
"""
|
||||
breakpoint_list = []
|
||||
try:
|
||||
# 优化点1: 等待列表容器出现,确保页面已加载
|
||||
wait.until(EC.presence_of_element_located((By.ID, "com.bjjw.cjgc:id/upload_result_list")))
|
||||
|
||||
# 优化点2: 等待至少一个itemContainer出现,确保列表有数据
|
||||
wait.until(EC.presence_of_element_located((By.ID, "com.bjjw.cjgc:id/itemContainer")))
|
||||
|
||||
# 方法1: 直接获取所有标题元素(最直接高效)
|
||||
title_elements = driver.find_elements(By.ID, "com.bjjw.cjgc:id/title")
|
||||
|
||||
if title_elements:
|
||||
for element in title_elements:
|
||||
breakpoint_name = element.text
|
||||
if breakpoint_name and breakpoint_name.strip(): # 增加空值过滤
|
||||
breakpoint_list.append(breakpoint_name.strip())
|
||||
print(f"✅ 直接通过title获取到 {len(breakpoint_list)} 个断点")
|
||||
|
||||
# 方法2: 如果方法1失败,通过itemContainer获取(备选方案)
|
||||
if not breakpoint_list:
|
||||
print("⚠️ 直接获取title失败,尝试通过itemContainer获取...")
|
||||
item_containers = driver.find_elements(By.ID, "com.bjjw.cjgc:id/itemContainer")
|
||||
for container in item_containers:
|
||||
try:
|
||||
title_element = container.find_element(By.ID, "com.bjjw.cjgc:id/title")
|
||||
breakpoint_name = title_element.text
|
||||
if breakpoint_name and breakpoint_name.strip():
|
||||
breakpoint_list.append(breakpoint_name.strip())
|
||||
except:
|
||||
continue
|
||||
print(f"✅ 通过itemContainer获取到 {len(breakpoint_list)} 个断点")
|
||||
|
||||
# 打印结果
|
||||
if breakpoint_list:
|
||||
print(f"📋 断点列表:")
|
||||
for i, name in enumerate(breakpoint_list, 1):
|
||||
print(f" {i}. {name}")
|
||||
else:
|
||||
print("⚠️ 未获取到任何断点,列表可能为空")
|
||||
|
||||
return breakpoint_list
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 获取断点列表失败: {str(e)}")
|
||||
# 可以在这里打印更多调试信息
|
||||
try:
|
||||
page_source = driver.page_source
|
||||
print("📄 当前页面源码已保存,可用于调试")
|
||||
# 可以将page_source保存到文件,方便分析
|
||||
with open("debug_page_source.xml", "w", encoding="utf-8") as f:
|
||||
f.write(page_source)
|
||||
except:
|
||||
pass
|
||||
return breakpoint_list
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if permissions.grant_appium_permissions("77a6ac91"):
|
||||
logging.info(f"设备 77a6ac91 权限授予成功")
|
||||
else:
|
||||
logging.warning(f"设备 77a6ac91 权限授予失败")
|
||||
|
||||
# 确保Appium服务器正在运行
|
||||
main.ensure_appium_server_running(4723)
|
||||
|
||||
get_breakpoint_list_from_page()
|
||||
6
test_results/上传失败的断点.txt
Normal file
6
test_results/上传失败的断点.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
YKYGZQ-7-长房子特大桥0-3号墩-DK626+571-DK626+675-01-平原
|
||||
YKYGZQ-7-长房子泄水洞隧道大里程第四段-DK628+639-DK628+791-01-平原
|
||||
YKYGZQ-7-长房子泄水洞隧道大里程第二段-DK627+900-DK628+236-01-平原
|
||||
YKYGZQ-7-长房子泄水洞隧道大里程第一段-DK627+276-DK627+668-01-平原
|
||||
YKYGZQ-7-长房子泄水洞隧道大里程第三段-DK628+236-628+524-01-平原
|
||||
YKYGZQ-7-长房子泄水洞隧道大里程第五段-DK628+919-DK629+191-01-平原
|
||||
0
test_results/上传成功的断点.txt
Normal file
0
test_results/上传成功的断点.txt
Normal file
38
创建无线连.spec
Normal file
38
创建无线连.spec
Normal file
@@ -0,0 +1,38 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['create_a_link.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
hiddenimports=['appium', 'urllib3.connection'],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name='创建无线连',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
)
|
||||
38
创建无线连接.spec
Normal file
38
创建无线连接.spec
Normal file
@@ -0,0 +1,38 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['create_a_link.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name='创建无线连接',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
)
|
||||
Reference in New Issue
Block a user