Answer first
With Protractor 7.0.0 and directConnect: true, Protractor forks one runner per entry in multiCapabilities and each runner starts its own ChromeDriver or geckodriver session directly, bypassing Selenium Server/Grid.
Capabilities are not replaced, they are merged. The top-level capabilities block acts as a base and each multiCapabilities entry is merged over it. Per-entry keys override base keys while unspecified base keys still apply. directConnect only supports Chrome and Firefox; entries targeting other browsers will fail or behave inconsistently.
Verify the applied set per instance at runtime:
- Add a
beforeAll that logs the resolved config: browser.getProcessedConfig().then(c => console.log(c.capabilities)) or browser.getCapabilities(). Confirm browserName, chromeOptions etc match one multiCapabilities entry. - Run a single trivial spec and count driver processes / session IDs in the console to confirm one driver per capability entry.
- Give reporters unique output names derived from capabilities, e.g.
browserName + shard, to avoid overwrites. Each forked runner reports independently.
Confirmed facts
directConnect launches drivers locally, no Selenium Server involved.- Protractor 7.0.0 is the final major line and the project is end-of-life; behavior is frozen.
directConnect is limited to Chrome and Firefox.
Likely explanation for inconsistent counts and reporting
Without sharding, each capability entry runs the full spec suite, so total test count multiplies by the number of entries. That is expected behavior, not a bug.
Reporting inconsistencies are commonly caused by multiple runners writing to the same file path, e.g. one JUnit XML path. With directConnect each runner is independent, so the last writer wins.
Merge nuance: in some Protractor 7.x builds merging of nested objects is shallow. Nested chromeOptions.args may replace rather than append. Verify the resolved config instead of assuming a deep merge.
Assumption: your config uses the Protractor 7.0.0 capabilities block format and directConnect: true is set globally. If shardTestFiles and maxInstances are in use, the interaction changes the expected test count.
To tailor the recommendation, what are your current shardTestFiles and maxInstances values?