Как получить исходное содержимое папки из вывода 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)

  1. base64 декодирование folder_base64
  2. Распаковка декодированного вывода

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)

  1. base64 декодирование folder_base64
  2. архивирование декодированного вывода
  3. разархивирования

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)

  1. разархивировать folder_base64
  2. 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)

  1. base64 декодирование folder_base64
  2. читать файл как zip-файл
  3. извлечь файлы

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")
Другие вопросы по тегам