Как получить исходное содержимое папки из вывода Appium pull_folder?
На основании документа appium по адресу 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
1 ответ
Также получена ошибка «Объект SpooledTemporaryFile не имеет атрибута «доступный для поиска»» из вашего решения E.
Но это работает для меня:
folder_base64 = self.driver.pull_folder('/path/to/device/foo.bar')
decoded_base64 = base64.b64decode(folder_base64)
# write decoded content into a new file
with open("./archive.zip", "wb") as archive_file:
archive_file.write(decoded_base64)
# extract created archive
with ZipFile('./archive.zip', 'r') as archive_file:
archive_file.extractall("./extracted_files")
# remove original file so only extracted files remain
os.remove("./archive.zip")