Как получить исходное содержимое папки из вывода Appium pull_folder? - PullRequest
0 голосов
/ 23 января 2019

На основе 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)

  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
...