ヽ(´・肉・`)ノログ

How do we fighting without fighting?

Firefoxで開いているサイトの情報を外から得る

Firefox で開いているページの URL とタイトルを CLI から取得する方法.

./run_firerox_marionette.gif

Firefox には mozrepl という,ブラウザがサーバーとして振る舞うようになり,ブラウザ外から文字列によるブラウザ操作を受けつけるアドオンがあったが,Firefox55 から内部構造の変更により動かなくなってしまった.

一方,いつからか Firefox には Marionette という,ブラウザがサーバーとして振る舞うようになり,ブラウザ外から文字列によるブラウザ操作を受けつける機能が標準で組込まれるようになった.

私は mozrepl を使って Firefox で開いているページの URL とタイトルを CLI で取得していたが,新しい Firefox では利用できないため,今回 Marionette を使い同様なことができるようにする.

必要なもの

今回使うもの

OSXで作業する.

処理

pip経由でmarionette_driverをインストールする

Python3 で使えないか試したがmozrunnerでエラーになるようだったので断念した.

/Users/niku% pip3 install marionette_driver
Collecting marionette_driver
  Using cached marionette_driver-2.5.0.tar.gz
Collecting mozrunner>=6.13 (from marionette_driver)
  Using cached mozrunner-6.14.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/3x/_15gn8l57x57gr8g6cbtz6lr0000gn/T/pip-build-angswvj4/mozrunner/setup.py", line 26, in <module>
        assert sys.version_info[0] == 2
    AssertionError

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/3x/_15gn8l57x57gr8g6cbtz6lr0000gn/T/pip-build-angswvj4/mozrunner/

Python2 で使うためにインストールする.

/Users/niku% python2 --version
Python 2.7.14
/Users/niku% pip2 --version
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)
/Users/niku% docker-compose run --rm web pip --help
/Users/niku% pip2 install marionette_driver

FirefoxをMarionetteサーバー有効状態で起動する

Marionette is available in all Firefox builds; it is not enabled, however, unless you launch Firefox with the -marionette command-line argument.

Getting a Marionette-enabled Firefox Build

とあるように, 全ての Firefox で Marionette が使える .オプションに -marionette をつけて Firefox を起動すると有効になる. 私の場合はターミナルから以下のようなコマンドで起動している. (Firefox が完全に終了している状態から始める)

/Users/niku% /Applications/Firefox.app/Contents/MacOS/firefox -marionette

うまく起動すると,ブラウザの URL 入力覧がオレンジに,ロボット(?)が表示された状態になる.

./marionette_enabled.png

通常時のマリオネットが起動していない Firefox と見比べるとわかりやすい.

./marionette_disabled.png

Marionette Python ClientをMarionetteサーバーへ接続する

以下Marionetteサーバーを起動したFirefoxがある状態で作業する. python を起動して REPL で client.start_session() を実行したときに値が返ってきていれば,Marionetteサーバーへの接続が成功している.

/Users/niku% python2
Python 2.7.14 (default, Sep 25 2017, 09:53:17)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from marionette_driver.marionette import Marionette
>>> client = Marionette('localhost', port=2828)
>>> client.start_session()
{u'rotatable': False, u'browserVersion': u'57.0.1', u'acceptInsecureCerts': False, u'moz:headless': False, u'moz:webdriverClick': False, u'moz:accessibilityChecks': False, u'timeouts': {u'pageLoad': 300000, u'implicit': 0, u'script': 30000}, u'browserName': u'firefox', u'moz:profile': u'/Users/niku/Library/Application Support/Firefox/Profiles/d3kntwb9.Default User', u'platformVersion': u'15.6.0', u'moz:processID': 91903, u'pageLoadStrategy': u'normal', u'platformName': u'darwin'}
>>>

Marionette Python ClientでMarionetteサーバーからブラウザの情報を取得する

以下Marionette Python ClientをMarionetteサーバーへ接続した状態で作業する.(上の続き)

Firefoxで適当なページにアクセスする.今回は https://github.com/ へアクセスした. その状態で REPL から 操作すると以下のように URL やページタイトルが取得できている.

>>> client.get_url()
u'https://github.com/'
>>> client.title
u'GitHub'

試していない/わからなかったこと

Marionetteサーバーをオプションなしで起動させる

about:config に

marionette.defaultPrefs.enabled -> true marionette.defaultPrefs.port -> 2828

と書くことでも動かせるようだが試していない.

Marionette Python Clientでセッションをスタートさせたあと,Firefoxの新規タブを作ったときにブラウザがフォーカスしているタブの情報を取る方法がわからない

client.start_session() したあと,ブラウザのタブを増やして, そのタブを使って Web ページを見ているときに「ブラウザがフォーカスしているタブ」という情報を client で取得する方法がわからない.

client.delete_session() して再度 client.start_session() するとブラウザがフォーカスしているタブの情報が取得できるので,ワークアラウンドとして利用している.

まとめ