Я запускаю экземпляр 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...