5

*nux ボックスに Fabric からデプロイした後、いくつかのブラウザー自動化タスクを実行する目的で、Win2k8 EC2 インスタンスを実行しています。

Mac および Linux で動作する私のスクリプトは、cygwin Python を使用した cygwin で次のエラーを表示します。

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

cygwin ( selenium )での Webdriver のサポートには、既知のバグ/関心の欠如があります。

仲間の SO ユーザーはより役に立ち、ここに解決策があります: https://stackoverflow.com/a/11104952/1668057

その方法は、Mac/* nix で私のコードを壊すようです。

それを実装し、コードの移植性を維持するにはどうすればよいですか?

(私の Selenium は PIP からインストールされるため、モジュール ファイルを編集するよりもメソッドをオーバーライドすることをお勧めします)

編集:

ジェフの答えに提案されたよりpythonicな方法を見て、私は次のことを思いつきました(私のスクリプトはすでに画像を無効にするために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 では、これで例外がキャッチされ、通常どおり続行されますが、cygwin パスが検出される Win2k8 ボックスでは、次のエラーで失敗します。

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 がローカルで cygwin bash を介して、またはリモートで SSH を介して Firefox を起動できるかどうかを確認することだと思います...

4

1 に答える 1

4

OK、露骨に明らかですが、Win2k8 cygwin で PATH 変数を手動で設定した後、Jeff の回答のコードが機能し、リモートの Linux マシンを介して Win2k8 マシンで Firefox を快適に実行しています。

不正行為だと思って 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)

うまくいけば、その旅が誰かが似たようなことをするのに役立つことを願っています.

于 2013-05-19T19:12:45.457 に答える