news 2026/9/25 2:07:20

Protractor 服务器部署与连接配置指南:Selenium Server、远程云平台与 DirectConnect 全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Protractor 服务器部署与连接配置指南:Selenium Server、远程云平台与 DirectConnect 全解析
  • 测试

【免费下载链接】protractor

E2E test framework for Angular apps

项目地址:https://gitcode.com/gh_mirrors/pr/protractor
点击查看免费下载

本文以 Protractor 的 服务器配置文档 为主线,系统讲解测试脚本与浏览器驱动之间的桥接方式:如何在本机部署并启动 Standalone Selenium Server、如何连接远程云测服务(BrowserStack、Sauce Labs、TestObject、Kobiton),以及如何跳过服务器直连 Chrome/Firefox 驱动。读完本文,你将能根据团队的基础设施与网络环境,为 Protractor 配置出最合适的 driver provider,并从配置类型定义与lib/driverProviders/源码层面理解每项配置的真实作用。

Selenium Server 在 Protractor 架构中的角色

使用 Protractor 执行 E2E 测试时,必须明确"如何连接到浏览器驱动"。测试脚本(基于 WebDriver API 编写)并不直接操作浏览器进程,而是通过 Selenium Server 中转。服务器在测试脚本与浏览器驱动之间扮演代理角色:

[Test Scripts] < ------------ > [Selenium Server] < ------------ > [Browser Drivers]
  • 服务器将脚本发出的命令转发给驱动,再把驱动的响应返回给脚本;
  • 服务器可以同时服务不同语言编写的多套脚本;
  • 服务器可以启动并管理多种版本、多种实现的浏览器。

Protractor 的配置项在 config.ts 中定义,其中与 Selenium Server 相关的选项主要分为五类:本机启动独立服务器(seleniumServerJar)、连接已在运行的服务器(seleniumAddress)、远程云测服务(sauceUser/sauceKey、browserstackUser/browserstackKey等)以及直连驱动(directConnect)。从源码看,lib/driverProviders/index.ts中的buildDriverProvider()会按优先级依次检查这些配置并实例化对应的 DriverProvider 实现。

本机部署:Standalone Selenium Server

前置条件:JDK

要在本机运行 Selenium Server,需要安装 Java Development Kit(JDK)。用java -version验证是否已安装:

java -version

使用 webdriver-manager 安装并启动服务器

Protractor 自带webdriver-manager命令行工具,按以下步骤即可手动完成服务器安装与启动:

  1. 执行更新命令,下载服务器 jar 与 ChromeDriver:

    webdriver-manager update
  2. 执行启动命令:

    webdriver-manager start

    启动后会产生大量以INFO开头的日志,最后一行应为Info - Started org.openqa.jetty.jetty.Server,表示服务器已就绪。

  3. 在测试会话期间保持服务器持续运行。

  4. 在配置文件中把seleniumAddress设置为服务器地址,默认值为http://localhost:4444/wd/hub:

    exports.config = { seleniumAddress: 'http://localhost:4444/wd/hub', // 其余配置... };

从源码看,webdriver-manager update下载的二进制文件默认放在 webdriver-manager 的selenium/目录下;若未显式指定seleniumServerJar,local.ts 会通过new WdmSeleniumServer().getBinaryPath()自动在默认位置查找 jar,找不到时会抛出错误并提示运行webdriver-manager update。

从测试脚本内部启动服务器

如果希望 Protractor 在启动测试时自动拉起 Standalone Selenium Server,可在配置文件中设置以下选项:

  • seleniumServerJar—— Standalone Selenium Server 的 jar 文件路径,需指定一个真实文件位置;
  • seleniumPort—— 启动服务器所用的端口,未指定时默认 4444;
  • seleniumArgs—— 传递给服务器的命令行参数数组;完整参数列表可通过带-help标志启动服务器查看。

参考 config.ts 的补充说明,还有几个与本地启动相关的可选配置:

  • seleniumServerStartTimeout—— 等待本地 Standalone Selenium Server 启动的超时时间,默认 30000ms;
  • localSeleniumStandaloneOpts—— 一个对象,直接透传给 SeleniumServer 类作为参数,可包含port、args和jvmArgs;若其中指定了args或port,会覆盖旧版配置项seleniumArgs与seleniumPort;
  • jvmArgs—— 附加的 JVM 命令行参数,例如['-Dwebdriver.ie.driver=IEDriverServer_Win32_2.53.1.exe']可指定其他浏览器的驱动位置;
  • chromeDriver/geckoDriver—— 分别指定 chromedriver 与 geckodriver 二进制路径,会以系统属性webdriver.chrome.driver/webdriver.gecko.driver传给 Selenium jar;未设置时使用 webdriver-manager 下载的默认版本。

在 local.ts 的setupDriverEnv()中可以看到完整启动链路:先调用addDefaultBinaryLocs_()补齐 jar 与驱动二进制路径,再以兼容逻辑合并seleniumArgs/jvmArgs/seleniumPort,推送-Dwebdriver.chrome.driver、-Dwebdriver.gecko.driver等 JVM 参数,最后构造SeleniumServer并调用start(timeout),把实际监听地址写回config.seleniumAddress,供后续连接使用。

连接已在运行的服务器

如果 Selenium Server 已由其他进程启动,只需设置一个选项:

  • seleniumAddress—— 连接到运行中的 Standalone Selenium Server,值是一个 URL,形如http://localhost:4444/wd/hub。

对应源码实现是lib/driverProviders/hosted.ts中的Hosted类,它在setupDriverEnv()中仅记录日志并直接使用配置中的地址。此外,config.ts 还提供了两个与既有会话/代理相关的补充选项:seleniumSessionId允许把 Protractor 挂载到某个已存在的 Selenium 会话上(对应 attachSession.ts,其quitDriver()为空实现以保持原会话不被关闭);webDriverProxy则指定 WebDriver 命令流量经过的代理地址。

注意:一旦设置了seleniumAddress,以下配置将被忽略:seleniumServerJar、seleniumPort、seleniumArgs、browserstackUser、browserstackKey、sauceUser、sauceKey。

远程 Selenium Server:云测平台接入

若不想自建服务器,可选用托管 Selenium Server 与浏览器驱动的云测服务。Protractor 内置支持 BrowserStack、Sauce Labs、TestObject 与 Kobiton。buildDriverProvider()的选择逻辑(见 index.ts)会按directConnect→seleniumAddress→testobject→kobiton→browserstack→sauce→seleniumServerJar→mockSelenium的顺序匹配,先命中的配置优先,且会通过logWarnings()对同时设置的冗余参数输出警告。

使用 TestObject 作为远程服务器

在配置文件中设置:

  • testobjectUser—— TestObject 账户的用户名;
  • testobjectKey—— TestObject 账户的 Key。

设置这两个选项后,kobitonUser、kobitonKey、browserstackUser、browserstackKey、seleniumServerJar、seleniumPort、seleniumArgs、sauceUser、sauceKey都会被忽略。源码实现(testObject.ts)会把用户名与 Key 写入 capabilities 的testobject.user与testobject_api_key字段,并将seleniumAddress固定为https://us1.appium.testobject.com/wd/hub。

使用 Kobiton 作为远程服务器

在配置文件中设置:

  • kobitonUser—— Kobiton 账户的用户名;
  • kobitonKey—— Kobiton 账户的 API Key。

设置这两个选项后,browserstackUser、browserstackKey、seleniumServerJar、seleniumPort、seleniumArgs、sauceUser、sauceKey都会被忽略。源码实现(kobiton.ts)会把用户名与 Key 写入 capabilities 的kobitonUser/kobitonKey字段,并拼接出带鉴权信息的https://user:key@api.kobiton.com/wd/hub作为seleniumAddress。

使用 BrowserStack 作为远程服务器

在配置文件中设置:

  • browserstackUser—— BrowserStack 账户的用户名;
  • browserstackKey—— BrowserStack 账户的 Key。

设置这两个选项后,seleniumServerJar、seleniumPort、seleniumArgs、sauceUser、sauceKey都会被忽略。可在 capabilities 中可选设置name属性,为服务器上的任务命名;否则任务只会被分配一个随机哈希。源码实现(browserStack.ts)会把用户名与 Key 写入 capabilities 的browserstack.user/browserstack.key字段,将seleniumAddress固定为http://hub.browserstack.com/wd/hub,并通过createAutomateClient建立会话管理客户端;其updateJob()会根据测试结果把会话状态更新为completed或error。另外 config.ts 还提供了browserstackProxy用于公司代理环境下的 API 连接。

使用 Sauce Labs 作为远程服务器

在配置文件中设置:

  • sauceUser—— Sauce Labs 账户的用户名;
  • sauceKey—— Sauce Labs 账户的 Key。

设置这两个选项后,seleniumServerJar、seleniumPort、seleniumArgs、browserstackUser、browserstackKey都会被忽略。同样可以在 capabilities 中可选设置name属性为任务命名,否则任务会被命名为Unnamed Job。

源码实现(sauce.ts)更为丰富:它支持sauceRegion(us对应 us-west-1,为默认;eu对应 eu-central-1)、sauceBuild、sauceSeleniumUseHttp、sauceSeleniumAddress、sauceProxy与sauceAgent等扩展配置(全部定义见 config.ts),最终拼出带鉴权的https://user:key@ondemand.saucelabs.com:443/wd/hub作为seleniumAddress。

直连浏览器驱动:DirectConnect

Protractor 可以不经过 Selenium Server,直接对 Chrome 与 Firefox 进行测试。在配置文件中设置directConnect: true:

exports.config = { directConnect: true, SELENIUM_PROMISE_MANAGER: false, framework: 'jasmine', capabilities: { browserName: 'chrome', }, specs: ['directConnect/*_spec.js'], jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000 } };

(上例取自仓库自带的 spec/directConnectConf.js,可直接作为直连模式的配置模板参考。)

  • directConnect: true—— 测试脚本直接与 ChromeDriver 或 FirefoxDriver 通信,绕过任何 Selenium Server。此模式下seleniumAddress与seleniumServerJar的设置会被忽略;若试图使用 Chrome、Firefox 以外的浏览器,会抛出错误。
  • 直连的优势是测试脚本可能启动得更快、运行更迅速,省去了服务器中转的一跳。

从源码实现(direct.ts)可以看到其内部逻辑:setupDriverEnv()只接受chrome与firefox两种browserName,其他值直接抛出BrowserError;getNewDriver()则分别使用selenium-webdriver的 chrome 与 firefox ServiceBuilder 直接创建会话,驱动二进制路径优先取chromeDriver/geckoDriver配置,未配置时回退到 webdriver-manager 的默认下载位置。另外 config.ts 还提供firefoxPath用于指定 Firefox 应用二进制的路径,为null时会在默认位置查找。

配置优先级与选择逻辑小结

场景需要设置的配置项对应 DriverProvider 源码
本机启动 Standalone Selenium ServerseleniumServerJar(可选seleniumPort、seleniumArgs、localSeleniumStandaloneOpts、chromeDriver、geckoDriver)local.ts
连接已运行的 Selenium ServerseleniumAddresshosted.ts
挂载既有会话seleniumAddress+seleniumSessionIdattachSession.ts
TestObject 云测testobjectUser+testobjectKeytestObject.ts
Kobiton 云测kobitonUser+kobitonKeykobiton.ts
BrowserStack 云测browserstackUser+browserstackKeybrowserStack.ts
Sauce Labs 云测sauceUser+sauceKeysauce.ts
直连 Chrome/Firefox 驱动directConnect: true(可选chromeDriver、geckoDriver、firefoxPath)direct.ts

实际的 provider 选择发生在 lib/driverProviders/index.ts 的buildDriverProvider()中,其判断顺序即上表的优先级顺序;同时logWarnings()会对"已选中某 provider 但配置中还残留其他 provider 参数"的情况输出警告,帮助排查配置冗余。仓库中的 scripts/test/driverProviderAttachSession.js 与spec/unit/driverProviders/下的测试用例(如 direct_test.js、local_test.js)覆盖了这些 provider 的配置解析与行为,可作为深入阅读的参考。

实践建议:单机、内网环境优先选用本机 Standalone Server(seleniumServerJar或webdriver-manager start+seleniumAddress);追求启动速度且只需 Chrome/Firefox 时使用directConnect;需要跨浏览器矩阵或移动设备覆盖时,再按团队已有账号选择对应云测平台。任何情况下都应避免同时设置多个 provider 相关参数,以免被忽略的配置造成理解偏差。

  • 测试

【免费下载链接】protractor

E2E test framework for Angular apps

项目地址:https://gitcode.com/gh_mirrors/pr/protractor
点击查看免费下载

相关推荐

上一篇:IPED数据恢复分区扫描:针对特定文件系统的优化指南
下一篇:Vue3 Vant4 Mobile:2024最新移动端开发框架,Vue3.5+Vite8+Vant4完美集成指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 2:06:58

RK固件打包check chip失败的底层原理与实战排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 2:05:14

智能物流小车硬件选型避坑指南:从主控到电源的实战经验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 2:05:14

OpenCore Legacy Patcher让2007老Mac运行macOS Sonoma

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华