Разрешить Selenium Webdriver находить путь Firefox в cygwin и стандартных установках

Я запускаю экземпляр Win2k8 EC2 для запуска нескольких задач автоматизации браузера после развертывания из Fabric на *nux box.

Мой скрипт, который работает на Mac и Linux, представляет следующую ошибку в cygwin с cygwin Python:

File "/home/Myuser/.virtualenvs/myproject/lib/python2.7/site-packages/selenium/webdriver/firefox/firefox_binary.py", line 141, in _get_firefox_start_cmd
    " Please specify the firefox binary location or install firefox")
RuntimeError: Could not find firefox in your system PATH. Please specify the firefox binary location or install firefox

Существует известная ошибка/отсутствие интереса к поддержке Webdriver под cygwin (selenium ).

Другой пользователь SO более полезен и имеет решение здесь: https://stackoverflow.com/a/11104952/1668057

Похоже, что этот метод сломает мой код под Mac/*nix.

Как я могу реализовать это и сохранить переносимость кода?

(мой Selenium установлен из PIP, поэтому я бы предпочел переопределить этот метод, чем редактировать какие-либо файлы модулей)

ИЗМЕНИТЬ:

Увидев более питонический способ, предложенный Джеффу, я придумал следующее (обратите внимание, что мой скрипт уже создал подкласс/переопределил класс FirefoxProfile для отключения изображений):

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from subprocess import Popen, PIPE

class CygwinFirefoxProfile(FirefoxProfile):

    @property
    def path(self):

        path = self.profile_dir

        try:
            proc = Popen(['cygpath','-d',path], stdout=PIPE, stderr=PIPE)
            stdout, stderr = proc.communicate()
            path = stdout.split('\n', 1)[0]
            print("cygwin path found")

        except OSError:
            print("No cygwin path found")

        return path

class CarServiceOnlineBookingsTest(unittest.TestCase):    

    def setUp(self):

        firefoxProfile = CygwinFirefoxProfile()

        ## Disable CSS
        firefoxProfile.set_preference('permissions.default.stylesheet', 2)
        ## Disable images
        firefoxProfile.set_preference('permissions.default.image', 2)
        ## Disable Flash
        firefoxProfile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')

        self.driver = webdriver.Firefox(firefoxProfile)

На моем Mac это теперь перехватывает исключение и продолжается как обычно, но в окне Win2k8, где обнаружен путь cygwin, все еще происходит сбой со следующей ошибкой:

Traceback (most recent call last):
  File "myscript.py", line 45, in setUp
    self.driver = webdriver.Firefox(firefoxProfile)
  File "/home/Myuser/.virtualenvs/myenv/lib/python2.7/site-packages/selenium/webdriver/firefox/webdriver.py", line 50, in __init__
    self.binary = FirefoxBinary()
  File "/home/Myuser/.virtualenvs/myenv/lib/python2.7/site-packages/selenium/webdriver/firefox/firefox_binary.py", line 33, in __init__
    self._start_cmd = self._get_firefox_start_cmd()
  File "/home/Myuser/.virtualenvs/myenv/lib/python2.7/site-packages/selenium/webdriver/firefox/firefox_binary.py", line 141, in _get_firefox_start_cmd
    " Please specify the firefox binary location or install firefox")
RuntimeError: Could not find firefox in your system PATH. Please specify the firefox binary location or install firefox

Я совсем не знаком с Popen или тем, что я ожидаю вернуть за положительный результат. т.е. я должен ожидать что-то вроде C:\Program Files (x86)\Firefox\Firefox.exe?

Где следующий шаг отладки?

РЕДАКТИРОВАНИЕ № 2:

Выполнение этой команды из оболочки cygwin bash открывает Firefox:

/cygdrive/c/Program\ Files\ \(x86\)/Mozilla\ Firefox/firefox.exe

Я думаю, что мой следующий шаг — жестко закодировать это в скрипт и посмотреть, позволит ли Selenium запускать Firefox либо локально через cygwin bash, либо удаленно через SSH...


person ljs.dev    schedule 19.05.2013    source источник


Ответы (1)


Хорошо, это очевидно, но после ручной установки переменной PATH на Win2k8 cygwin код из ответа Джеффа работает, и теперь я с радостью запускаю Firefox на машине Win2k8 через удаленную машину Linux.

Я не устанавливал PATH вручную, думая, что это читерство, но даже это можно сделать как часть скрипта Fabric, если я хочу полной автоматизации...

Вот код, который теперь отлично работает как на Mac, так и на Windows:

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from subprocess import Popen, PIPE

class CygwinFirefoxProfile(FirefoxProfile):

    @property
    def path(self):

        path = self.profile_dir

        # cygwin requires to manually specify Firefox path a below:
        # PATH=/cygdrive/c/Program\ Files\ \(x86\)/Mozilla\ Firefox/:$PATH
        try:
            proc = Popen(['cygpath','-d',path], stdout=PIPE, stderr=PIPE)
            stdout, stderr = proc.communicate()
            path = stdout.split('\n', 1)[0]

        except OSError:
            print("No cygwin path found")

        return path

class CarServiceOnlineBookingsTest(unittest.TestCase):    

    def setUp(self):

        firefoxProfile = CygwinFirefoxProfile()

        ## Disable CSS
        firefoxProfile.set_preference('permissions.default.stylesheet', 2)
        ## Disable images
        firefoxProfile.set_preference('permissions.default.image', 2)
        ## Disable Flash
        firefoxProfile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')

        self.driver = webdriver.Firefox(firefoxProfile)

Надеюсь, это путешествие поможет кому-то сделать что-то подобное.

person ljs.dev    schedule 19.05.2013