带有参数的 http POST 到 /session 引发的 Curl 错误:"desiredCapabilities":"browserName":"

Posted

技术标签:

【中文标题】带有参数的 http POST 到 /session 引发的 Curl 错误:"desiredCapabilities":"browserName":"chrome","platform":"ANY" with Selenium and PHPUnit【英文标题】:Curl error thrown for http POST to /session with params: "desiredCapabilities":"browserName":"chrome","platform":"ANY" with Selenium and PHPUnit带有参数的 http POST 到 /session 引发的 Curl 错误:"desiredCapabilities":"browserName":"chrome","platform":"ANY" with Selenium and PHPUnit 【发布时间】:2019-07-12 03:40:00 【问题描述】:

我正在使用 phpUnit 运行所有测试。创建了一个启动 Apache 实例的包装器,然后启动 Selenium 独立服务器,然后在 http://localhost:4444/wd/hub 创建 Chrome 远程 Webdriver 实例。这个过程 100% 的时间在我们的开发机器上运行,90% 的时间在测试服务器上运行,但有时,测试会失败:

 [exec] 1) Intranet\Pages\FinancialReportsSeleniumTest::test_changeMonthYear
 [exec] Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: "desiredCapabilities":"browserName":"chrome","platform":"ANY","chromeOptions":"binary":"","args":["--window-size=1400,900","--no-sandbox","--headless"],"goog:chromeOptions":"args":["--window-size=1400,900","--no-sandbox","--headless"]
 [exec] 
 [exec] Failed to connect to localhost port 4444: Connection refused
 [exec] 
 [exec] C:\Jenkins\jobs\Intranet-Master\workspace\vendor\facebook\webdriver\lib\Remote\HttpCommandExecutor.php:292
 [exec] C:\Jenkins\jobs\Intranet-Master\workspace\vendor\facebook\webdriver\lib\Remote\RemoteWebDriver.php:126
 [exec] C:\Jenkins\jobs\Intranet-Master\workspace\phpunit\library\Intranet\Selenium.php:364
 [exec] C:\Jenkins\jobs\Intranet-Master\workspace\phpunit\library\Intranet\Selenium.php:51
 [exec] C:\Jenkins\jobs\Intranet-Master\workspace\phpunit\library\Intranet\SeleniumTestCase.php:9

如果我们重新运行测试,下次可以正常工作。

开发机器:

Windows 10 专业版 (1809)(64 位) Apache 2.4.38(32 位) PHP 7.2.15(32 位) Java 1.8.0_192(64 位) 硒 3.141.59 Selenium Chrome 驱动程序 73.0.3683.20

测试机

Windows Server 2008 R2 x64(64 位) Apache 2.4.38(32 位) PHP 7.2.15(32 位) 詹金斯 2.1.64 Java 1.8.0_192(64 位) 硒 3.141.59 Selenium Chrome 驱动程序 73.0.3683.20

日志文件显示服务器已启动:

10:41:27.392 INFO [GridLauncherV3.launch] - Selenium build info: version: '3.14.0', revision: 'aacccce0'
10:41:27.392 INFO [GridLauncherV3$1.launch] - Launching a standalone Selenium Server on port 4444
10:41:28.562 INFO [SeleniumServer.boot] - Selenium Server is up and running on port 4444

更新 #1:我们现在将 Selenium 独立服务器作为服务启动,但仍然以相同的频率失败(每 5-10 次测试运行一次)。

更新 #2:在运行任何测试之前,我们现在将 Apache 实例和远程 Web 驱动程序作为 PHPUnit 引导文件的一部分启动。我们现在还使用 fsockopen() 测试 Web 驱动程序是否正在运行(首先,在尝试启动它之前)。故障率已降至 5% 以下,但仍时有发生。奇怪的是,实际上似乎是在我们添加 fsockopen() 调用之后出现了改进 - 也许存在某种时间问题?

【问题讨论】:

你能在页面中查看下面的 url 是什么状态吗?http://localhost:4444/grid/console 您使用的是哪个版本的selenium-server-standalone selenium-server-standalone - 3.141.59 localhost:4444/grid/console:Whoops! URL 指定了到此帮助页面的路由。有关 Selenium Standalone 的更多信息,请参阅文档和/或访问 wiki。或者您正在寻找 Selenium Standalone 控制台。祝测试愉快! 要访问控制台,我必须去这里:localhost:4444/wd/hub/static/resource/hub.html,它显示当前会话,如果服务器正在运行,但我们在测试期间启动和停止 Selenium 服务器,如果此失败发生,则服务器已经退出。 【参考方案1】:

此错误消息...

 [exec] Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: "desiredCapabilities":"browserName":"chrome","platform":"ANY","chromeOptions":"binary":"","args":["--window-size=1400,900","--no-sandbox","--headless"],"goog:chromeOptions":"args":["--window-size=1400,900","--no-sandbox","--headless"]

...暗示在初始化 Chrome 浏览器会话时抛出了 Curl 错误。

您的主要问题似乎是 desiredCapability platform 被设置为 ANY


根据 Processing capabilities - WebDriver W3C Living Document 的 platformName 部分,以下平台名称是常用的,具有易于理解的语义,并且在匹配功能时,可以通过将它们视为有效的同义词来实现最大的互操作性对于知名操作系统:

Key         System
---         ------
"linux"     Any server or desktop system based upon the Linux kernel.
"mac"       Any version of Apple’s macOS.
"windows"   Any version of Microsoft Windows, including desktop and mobile versions.

注意:此列表并不详尽。

从新会话返回功能时,返回更具体的平台名称是有效的,允许用户正确识别运行 WebDriver 实现的操作系统。

因此,与其在 desiredCapabilities 对象中传递"platform":"ANY",不如使用更具体的"platform":"windows" 方法。

【讨论】:

好的,我做了那个改变。可能需要几天才能知道这是否有效果。 没有解决问题。我还对我们的配置进行了更改——在我们启动 Selenium 独立服务器作为测试的一部分之前,但现在我们将它作为服务运行。仍然会定期失败(大约每运行 5-10 次测试一次)并出现相同的错误(“平台”:“windows”除外)。

以上是关于带有参数的 http POST 到 /session 引发的 Curl 错误:"desiredCapabilities":"browserName":"的主要内容,如果未能解决你的问题,请参考以下文章

带有正文的 Swift HTTP POST

JAVA携带参数(带有参数)直接发送POST请求

iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应

HTTP 多部分 (POST) 请求中的边界参数是啥?

带有嵌套参数的 Alamofire POST 请求不返回任何内容

C#:带有 POST 参数的 HttpClient