2

Marionette是一种远程控制 Mozilla 浏览器的协议。Chromium 具有用于相同目的的DevTools协议,并在此处记录

Marionette在这里有一些粗略的文档,但是是否有可用命令和参数的正确列表?它可以以某种方式从 Mozilla 资源中提取吗?(就像 Chromium 有PDL一样。)

我所说的命令是指诸如[0,1,"WebDriver:Navigate",{"url":"http://awe.lv"}]}] “WebDriver:GetTitle”、[0,2,"WebDriver:ExecuteAsyncScript",{"script":"alert('Hello!')"}] “WebDriver:GetWindowHandle”、“WebDriver:GetWindowRect”、“WebDriver:TakeScreenshot”和“WebDriver:GetPageSource”之类的命令。特别是,我想像使用 DevTools 的方法一样观察网络流量Network.enable

是否有其他可用的前缀(“WebDriver:”除外)?我们可以通过 Marionette使用Web API吗?

4

2 回答 2

2

玩了一下geckodriverand Wireshark

--marionette用;启动 Firefox 我个人喜欢添加--headless --no-remote --profile $(mktemp -d),但这取决于你!打开在端口 2828 上侦听的 FireFox(有一种方法可以改变它,但我不是 100% 确定如何)。

木偶协议如下:

  • 每条消息都是没有换行符的以长度为前缀的 json 消息(例如,当您 connect 时telnet localhost 2828,您会受到 的欢迎50:{"applicationType":"gecko","marionetteProtocol":3},这50意味着 json 的长度为 50 个字节。
  • 每条消息(除了第一条消息)都是一个 4 项的 json 数组:
    • [0, messageId, command, body]对于一个请求,其中messageId是一个 int、command一个字符串和body一个对象。示例(带长度前缀)31:[0,1,"WebDriver:NewSession",{}]
    • [1, messageId, error, reply]回复。这messageId是回复的 id,或者errorresult为空(取决于是否有错误)。例如697:[1,1,null,{"sessionId":"d9dbe...", ..., "proxy":{}}}]
  • 可以在Marionette 源代码中找到所有命令的完整列表,在我看来,那里的所有函数都有很好的文档记录。一方面,它们似乎将所有 webdriver 函数都暴露在WebDriver:*.

更新:似乎https://bugzilla.mozilla.org/show_bug.cgi?id=1421766也在努力寻找正确的木偶端口/设置端口。我现在这样做的方式:

TEMPD="$(mktemp -d)"
echo 'user_pref("marionette.port", 0);' >  "${TEMPD}"/prefs.js
/Applications/Firefox.app/Contents/MacOS/firefox-bin --marionette --headless --no-remote --profile "${TEMPD}" &
PID=$!
MARIONETTE_PORT=""
while [ -z "$MARIONETTE_PORT" ]; do
  sleep 1
  MARIONETTE_PORT=$(lsof -a -p $PID -s TCP:LISTEN -i4 -nP | grep -oE ':\d+ \(LISTEN\)' | grep -oE '\d+')
done
echo "Marionette started on port $MARIONETTE_PORT"
fg

(给端口 0 使 Firefox 选择一个随机的空端口。该命令适用于 MacOS;可能需要在 Linux 上进行一些调整(我认为参数lsof略有不同;Linuxgrep也有后视/前瞻,因此您可以将双精度替换grep为单一个)。


更新 2

由于 Firefox 将编写它使用的 Marionette 端口,因此"${TEMPD}"/prefs.js甚至不需要用lsof;做“花哨”的事情。而只是检查该文件:

TEMPD="$(mktemp -d)"
echo 'user_pref("marionette.port", 0);' >  "${TEMPD}"/prefs.js
/Applications/Firefox.app/Contents/MacOS/firefox-bin --marionette --headless --no-remote --profile "${TEMPD}" &
MARIONETTE_PORT=""
while [ -z "$MARIONETTE_PORT" ]; do
  sleep 1
  MARIONETTE_PORT=$(cat "${TEMPD}"/prefs.js | grep 'user_pref("marionette.port"' | grep -oE '[1-9][0-9]*')
done
echo "Marionette started on port $MARIONETTE_PORT"
fg
于 2021-08-11T18:33:00.043 回答
1

好的,我在Geckodriver找到了source指向的命令列表。但是命令集太少了,文档也不完整!我希望人们可以通过 Marionette使用所有的Web API 。

于 2020-01-16T08:19:45.213 回答