【问题标题】:Is there documentation for Mozilla marionette protocol commands?有 Mozilla marionette 协议命令的文档吗?
【发布时间】:2020-01-12 03:56:09
【问题描述】:

Marionette 是用于远程控制 Mozilla 浏览器的协议。 Chromium 具有用于相同目的的 DevTools 协议,它是documented here

Marionette 有一些sketchy documentation here,但是否有正确的可用命令和参数列表?可以以某种方式从 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 APIs 吗?

【问题讨论】:

    标签: web-api-testing firefox-marionette


    【解决方案1】:

    geckodriverWireshark 玩了一会儿:

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

    木偶协议如下:

    • 每条消息都是一个以长度为前缀的 json 消息,没有换行符(例如,当您连接 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 source code 中找到,在我看来,那里的所有功能都有很好的文档记录。一方面,它们似乎暴露了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 的参数略有不同;Linux grep 也有向后/向前看,因此您可以将双 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Webdriver 旨在通过提供 API 来允许浏览器自动化,这些 API 允许人们模仿人类行为,例如导航到页面、移动鼠标​​、输入文本和单击元素以及检查页面对这些操作的反应的方法。这就是为什么只实现了从 DOM API 查询选择器的原因,其余的 API 可以通过在 geckodriver 支持的页面上评估任意 JS 来访问。
      • Webdriver 目标使用的是网页测试自动化,而不是在网络上导航的替代方式。
      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多