Почему geckodriver заставляет библиотеку Python Splinter возвращать OSError при создании объекта Browser ()? - PullRequest
0 голосов
/ 10 октября 2018

Вопрос

Короткая версия

Я только что установил последнюю версию geckodriver ( v0.28.0 ).

Но при создании объекта браузера (b = splinter.Browser()) я сталкиваюсь с OSError: [Errno 20] Not a directory.

Как это произошло?Может ли это быть ошибкой, появившейся в новой версии geckodriver в их последней версии?

Длинная версия

Когда я открываю терминал IPython, для Python 2.7:

Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34) 
Type "copyright", "credits" or "license" for more information.

IPython 5.5.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

Тогда сделайте:

from splinter import Browser

Пока все в порядке.Поскольку библиотека Python для осколка установлена ​​правильно.

Теперь, когда я пытаюсь создать экземпляр Browser() объекта:

b = Browser()

, я получаю большую ошибку, которая пока не имеет для меня особого смыслая думаю, что между новой версией Mozilla Firefox geckodriver и splinter Python (2.7) есть некоторая несовместимость:

In [4]: b = Browser()
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-4-935d10992ede> in <module>()
----> 1 b = Browser()

/home/osboxes/.local/lib/python2.7/site-packages/splinter/browser.pyc in Browser(driver_name, *args, **kwargs)
     62     except KeyError:
     63         raise DriverNotFoundError("No driver for %s" % driver_name)
---> 64     return driver(*args, **kwargs)

/home/osboxes/.local/lib/python2.7/site-packages/splinter/driver/webdriver/firefox.pyc in __init__(self, profile, extensions, user_agent, profile_preferences, fullscreen, wait_time, timeout, capabilities, headless, incognito, **kwargs)
     76             firefox_options=firefox_options,
     77             timeout=timeout,
---> 78             **kwargs
     79         )
     80 

/home/osboxes/.local/lib/python2.7/site-packages/selenium/webdriver/firefox/webdriver.pyc in __init__(self, firefox_profile, firefox_binary, timeout, capabilities, proxy, executable_path, options, service_log_path, firefox_options, service_args, desired_capabilities, log_path, keep_alive)
    162                 service_args=service_args,
    163                 log_path=service_log_path)
--> 164             self.service.start()
    165 
    166             capabilities.update(options.to_capabilities())

/home/osboxes/.local/lib/python2.7/site-packages/selenium/webdriver/common/service.pyc in start(self)
     74                                             stdout=self.log_file,
     75                                             stderr=self.log_file,
---> 76                                             stdin=PIPE)
     77         except TypeError:
     78             raise

/usr/lib/python2.7/subprocess.pyc in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
    392                                 p2cread, p2cwrite,
    393                                 c2pread, c2pwrite,
--> 394                                 errread, errwrite)
    395         except Exception:
    396             # Preserve original exception in case os.close raises.

/usr/lib/python2.7/subprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
   1045                         raise
   1046                 child_exception = pickle.loads(data)
-> 1047                 raise child_exception
   1048 
   1049 

OSError: [Errno 20] Not a directory

In [5]: b = Browser()
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-5-935d10992ede> in <module>()
----> 1 b = Browser()

/home/osboxes/.local/lib/python2.7/site-packages/splinter/browser.pyc in Browser(driver_name, *args, **kwargs)
     62     except KeyError:
     63         raise DriverNotFoundError("No driver for %s" % driver_name)
---> 64     return driver(*args, **kwargs)

/home/osboxes/.local/lib/python2.7/site-packages/splinter/driver/webdriver/firefox.pyc in __init__(self, profile, extensions, user_agent, profile_preferences, fullscreen, wait_time, timeout, capabilities, headless, incognito, **kwargs)
     76             firefox_options=firefox_options,
     77             timeout=timeout,
---> 78             **kwargs
     79         )
     80 

/home/osboxes/.local/lib/python2.7/site-packages/selenium/webdriver/firefox/webdriver.pyc in __init__(self, firefox_profile, firefox_binary, timeout, capabilities, proxy, executable_path, options, service_log_path, firefox_options, service_args, desired_capabilities, log_path, keep_alive)
    162                 service_args=service_args,
    163                 log_path=service_log_path)
--> 164             self.service.start()
    165 
    166             capabilities.update(options.to_capabilities())

/home/osboxes/.local/lib/python2.7/site-packages/selenium/webdriver/common/service.pyc in start(self)
     74                                             stdout=self.log_file,
     75                                             stderr=self.log_file,
---> 76                                             stdin=PIPE)
     77         except TypeError:
     78             raise

/usr/lib/python2.7/subprocess.pyc in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
    392                                 p2cread, p2cwrite,
    393                                 c2pread, c2pwrite,
--> 394                                 errread, errwrite)
    395         except Exception:
    396             # Preserve original exception in case os.close raises.

/usr/lib/python2.7/subprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
   1045                         raise
   1046                 child_exception = pickle.loads(data)
-> 1047                 raise child_exception
   1048 
   1049 

OSError: [Errno 20] Not a directory

Фон

Я использую следующие версии:

  • Ubuntu 18 (64bit)
  • Python версии 2.7
  • Импортированная библиотека Python: версия splinter 0.9.0.

Я скачал и установил geckodriver (версия: geckodriver-v0.23.0-linux64.tar.gz).

Для установки geckodriver я использовал четырепошаговый метод на этот ответ в Ask Ubuntu :

  1. Перейдите на страницу выпусков geckodriver .Найдите последнюю версию драйвера для вашей платформы и загрузите его.Например:

    wget https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.18.0-linux64.tar.gz
    

ПРИМЕЧАНИЕ: самая последняя версия в настоящее время v0.28.0

Извлеките файл с помощью:

tar -xvzf geckodriver*

Сделайте его исполняемым:

chmod +x geckodriver

Добавьте драйвер к вашемуПУТЬ, чтобы другие инструменты могли его найти:

export PATH=$PATH:/path-to-extracted-file/geckodriver
...