【问题标题】:Selenium 4.x trying to POST CDP: "UnsupportedCommandException"Selenium 4.x 尝试发布 CDP:\"UnsupportedCommandException\"
【发布时间】:2022-11-01 14:02:18
【问题描述】:

我正在尝试通过 CDP 执行一些命令,但是无论我使用 Selenium/Driver/Chrome 的哪种组合,结果总是相同的。

最后测试:

  • 硒 4.1.1
  • Chrome + 驱动程序 96.0.4664.110

该项目是用 C 语言制作的,所以我通过 CURL 手动发布到 Selenium。除了 CDP 之外的所有其他命令都可以正常工作。

我检查了 Selenium,Chrome 驱动程序;它们都内置了 CDP 支持。

我试图发布的 URL 是:

- /session/id/goog/cdp/execute
- /session/id/{}/cdp/execute

发布的数据格式为:“cmd”+“params”(json对象)。

两者都以相同的结果结束:org.openqa.selenium.UnsupportedCommandException.

我还尝试以不同的模式运行 Selenium,独立、集线器/节点,结果相同。

有人可以告诉我我做错了什么吗?还是我误解了用法?

【问题讨论】:

  • 你用chromedriver吗?您可以为创建新会话的 curl 示例收费吗?
  • @MaxDaroshchanka 只需对 huburl/session 做一个简单的 POST,将 desiredCapabilities + requiredCapabilities 作为 JSON 对象。
  • @Mecanic 我尝试为 chromedriver 运行 CDP 命令,POST /session/id/goog/cdp/execute 对我有用。请参阅我的答案中的详细信息。
  • 经过一番调查,我发现,使用本地 chromedriver 和 selenium-grid 是有区别的。我怀疑当您使用 selenium 网格创建会话时,您将获得带有 cdp url 的 se:options 对象。 cdp 端点应该用于 cdp 命令。
  • 对于 selenium-grid,我看到 ws:// cdp url 返回,我认为这意味着 selenium-grid 不支持 cdp 命令端点,并且将 cdp 请求委托给客户端直接执行。您必须使用某些 ws 命令行工具而不是 curl 来发送和接收 ws 消息。所以,我认为使用 chromedriver 可执行文件是更简单的方法。

标签: selenium selenium-webdriver selenium-chromedriver selenium-grid


【解决方案1】:

使用 chromedriver 可执行文件

这对我有用(Windows + Postman),但也适用于 CURL Linux/Mac。

1 为您的 chrome 版本下载 chromedriver:https://chromedriver.chromium.org/downloads

2 启动chromedriver

start chromedriver.exe

输出:

Starting ChromeDriver 97.0.4692.71 on port 9515...

3 向 localhost:9515/ 发送请求

  • 3.1 创建会话:
POST localhost:9515/session

request json body:
{"capabilities":{"goog:chromeOptions": {}}}

status 200

response:
 "value": {
        "capabilities": {
            ...
        },
        "sessionId": "b8ac49ce2203739fa0d32dfe8d1a23b5"
  • 3.2 浏览一些网址(可选,只需通过 sessionId 检查请求即可):
POST localhost:9515/session/b8ac49ce2203739fa0d32dfe8d1a23b5/url

request json body:
{"url": "https://example.com"}

status 200
  • 3.3 执行CDP命令(截图):
POST localhost:9515/session/b8ac49ce2203739fa0d32dfe8d1a23b5/goog/cdp/execute

request json body:
{"cmd":"Page.captureScreenshot", "params":{}}

status 200

response:
{
    "value": {
        "data": "iVBORw0KGgoAAAANSUhEUgA...."
    }
}

允许远程连接

默认情况下,chromedriver 只允许本地连接。

要允许一些远程 IP:

start chromedriver.exe --allowed-ips="some-remote-ip"

参考:https://sites.google.com/a/chromium.org/chromedriver/security-considerations

使用 Selenium Grid 运行 CDP 命令

最终,它开始对我有用

  • Chrome 驱动程序 97.0.4692.71
  • 硒服务器4.1.1
  • Chrome 97.0.4692.71(官方版本)(64 位)

注意:Content-Type 标头应该有 charset=utf-8 Content-Type:application/json;charset=utf-8 用于 Selenium Grid HTTP 请求。

先决条件

1 根据下载并运行 selenium 服务器https://www.selenium.dev/documentation/grid/getting_started/

java -jar selenium-server-<version>.jar standalone --driver-configuration display-name='Chrome' stereotype='{"browserName":"chrome"}'

2 创建会话:

POST localhost:4444/wd/hub/session

request json body:
{
  "desiredCapabilities": {
    "browserName": "chrome",
    "goog:chromeOptions": {
      "args": [
      ],
      "extensions": [
      ]
    }
  },
  "capabilities": {
    "firstMatch": [
      {
        "browserName": "chrome",
        "goog:chromeOptions": {
          "args": [
          ],
          "extensions": [
          ]
        }
      }
    ]
  }
}

status 200

response:
{
    "status": 0,
    "sessionId": "69ac1c82306f72c7aaf53cfbb28a30e7",
    ...
    }
}

3 执行 CDP 命令(截图):

POST localhost:4444/wd/hub/session/69ac1c82306f72c7aaf53cfbb28a30e7/goog/cdp/execute

request json body:
{"cmd":"Page.captureScreenshot", "params":{}}

status 200

response:
{
    "value": {
        "data": "iVBORw0KGgoAAAANSUhEUgA...."
    }
}

【讨论】:

  • 感谢您的深入解释,我决定走web socket路线。我自己实现了通过网络套接字发送命令的必要代码,但是它被无限卡住了。另一方面,通过命令进行测试,我总是得到“JSON:位置 0 处的无效令牌”;即使它是有效的 JSON。我真的不明白人们如何在这种状态下使用 Selenium ......
  • 我对如何使它工作有最后一个想法,我会尽力提供反馈。
  • @Mecanik 嘿,最终它也开始对我使用 selenium-grid。我将更新 Selenium Grid 部分。
  • 非常感谢,我很好奇如何。
  • @Mecanik 诀窍在于新的会话请求正文中......我观看了 selenium-client 新会话请求有效负载并复制了它。它有效。
猜你喜欢
  • 2022-11-09
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 2021-08-25
  • 2014-08-17
  • 1970-01-01
  • 2011-06-05
  • 2011-04-05
相关资源
最近更新 更多