На основе appium doc на http://appium.io/docs/en/commands/device/files/pull-folder/ папку можно извлечь следующим образом
folder_base64 = self.driver.pull_folder('/path/to/device/foo.bar')
Согласно документу ответ folder_base64 выглядит следующим образом: "Строка закодированных данных Base64, представляющая zip-архив содержимого запрошенной папки."
Итак, исходя из моего понимания вышеизложенного, я попробовал следующее (от A до D), которое не сработало.
A)
- base64 декодирование folder_base64
- Распаковка декодированного вывода
decoded_base64 = base64.b64decode(folder_base64)
folder_base64 = ZipFile.extractall(decoded_base64)
это не происходит со следующей ошибкой:
zipfile.py", line 1493, in extractall
AttributeError: 'bytes' object has no attribute 'namelist'
B)
- base64 декодирование folder_base64
- архивирование декодированного вывода
- разархивирования
decoded_base64 = base64.b64decode(folder_base64)
zipfile.ZipFile('out.zip', mode='w').write(decoded_base64)
завершается с ошибкой на шаге 2:
zipfile.py", line 484, in from_file
st = os.stat(filename)
ValueError: stat: embedded null character in path
C)
- разархивирование folder_base64
- base64 декодирование вывода
unzipped_base64 = ZipFile.extractall(folder_base64)
decoded_base64 = base64.b64decode(unzipped_base64)
завершается с ошибкой на шаге 1 со следующей ошибкой
zipfile.py", line 1493, in extractall
AttributeError: 'str' object has no attribute 'namelist'
D)
- base64 декодирование folder_base64
- чтение файла в виде zip-файла
- распаковать файлы
decoded_base64 = base64.b64decode(folder_base64)
zip_folder = zipfile.ZipFile(decoded_base64, 'r')
ZipFile.extractall(zip_folder, "./mp3_files")
завершается с ошибкой:
zipfile.py", line 241, in _EndRecData
fpin.seek(0, 2)
AttributeError: 'bytes' object has no attribute 'seek'
E)
Наконец-то следующее сработало , но мне интересно, почему он должен был маршрутизироваться через временный файл, чтобы он работал? Кроме того, есть ли лучший способ / более прямой способ обработки вывода appium pull_folder?
decoded_base64 = base64.b64decode(folder_base64)
with SpooledTemporaryFile() as tmp:
tmp.write(decoded_base64)
archive = ZipFile(tmp, 'r')
ZipFile.extractall(archive, "./mp3_files")
Примечание: следующие фрагменты python используются в приведенных выше фрагментах кода
import zipfile
from tempfile import SpooledTemporaryFile