Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[rust] Increase user awareness of their right to opt-out #15317

Open
wants to merge 1 commit into
base: trunk
Choose a base branch
from

Conversation

titusfortner
Copy link
Member

@titusfortner titusfortner commented Feb 20, 2025

User description

Motivation and Context

This should address the concerns raised in #14588

To clarify:

  1. Selenium Manager does not collect personally identifying information
  2. As implemented it does not actually have an applicable first communication event, so notification in changelog and documentation is sufficient

BUT, it's a nice thing to be as up front as possible about what's happening, and I think a one time message is reasonable.

The message will only appear the first time the user attempts to send data to Plausible after the cache has been created or cleared.

Looks like:

     Running `target/debug/selenium-manager --browser chrome --clear-cache`

Selenium Manager collects anonymous telemetry to improve the project.
Detailed information and instructions for opting out may be found at:
https://www.selenium.dev/privacy/

[2025-02-20T22:56:12.712Z INFO ] Driver path: /Users/titusfortner/.cache/selenium/chromedriver/mac-x64/133.0.6943.126/chromedriver
[2025-02-20T22:56:12.712Z INFO ] Browser path: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

This is in draft until I get the privacy policy posted, but looking for feedback on idea and implementation while that's in progress.


PR Type

Enhancement


Description

  • Added a one-time message to inform users about anonymous telemetry collection.

  • Implemented a mechanism to check and create a marker for the first report.

  • Enhanced user awareness of opt-out rights with a clear message.


Changes walkthrough 📝

Relevant files
Enhancement
lib.rs
Add telemetry opt-out awareness message functionality       

rust/src/lib.rs

  • Introduced a first_report_msg function to display a one-time message.
  • Added logic to check and create a marker file in the cache directory.
  • Integrated the message display into the stats function.
  • +17/-0   

    Need help?
  • Type /help how to ... in the comments thread for any questions about Qodo Merge usage.
  • Check out the documentation for more information.
  • …anager is used
    
    This increases the awareness of users that they have the right to opt-out
    Copy link
    Contributor

    qodo-merge-pro bot commented Feb 20, 2025

    CI Feedback 🧐

    (Feedback updated until commit 82c8c3c)

    A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

    Action: Test / All RBE tests

    Failed stage: Run Bazel [❌]

    Failed test name: //rb/spec/integration/selenium/webdriver:action_builder-firefox-remote

    Failure summary:

    Two tests failed in the build:
    1. //rb:lint failed due to multiple "Useless private access modifier
    for constant scope" warnings in Ruby files. The linter detected 6 instances where private access
    modifiers for constants were unnecessary.
    2.
    //rb/spec/integration/selenium/webdriver:action_builder-firefox-remote failed because the test
    "scrolls by given amount" unexpectedly passed when it was expected to fail with the message "returns
    false on firefox".

    Relevant error logs:
    1:  ##[group]Operating System
    2:  Ubuntu
    ...
    
    947:  Package 'php-symfony-asset' is not installed, so not removed
    948:  Package 'php-symfony-asset-mapper' is not installed, so not removed
    949:  Package 'php-symfony-browser-kit' is not installed, so not removed
    950:  Package 'php-symfony-clock' is not installed, so not removed
    951:  Package 'php-symfony-debug-bundle' is not installed, so not removed
    952:  Package 'php-symfony-doctrine-bridge' is not installed, so not removed
    953:  Package 'php-symfony-dom-crawler' is not installed, so not removed
    954:  Package 'php-symfony-dotenv' is not installed, so not removed
    955:  Package 'php-symfony-error-handler' is not installed, so not removed
    ...
    
    1141:  Package 'php-uopz-all-dev' is not installed, so not removed
    1142:  Package 'php8.3-uploadprogress' is not installed, so not removed
    1143:  Package 'php-uploadprogress-all-dev' is not installed, so not removed
    1144:  Package 'php8.3-uuid' is not installed, so not removed
    1145:  Package 'php-uuid-all-dev' is not installed, so not removed
    1146:  Package 'php-validate' is not installed, so not removed
    1147:  Package 'php-vlucas-phpdotenv' is not installed, so not removed
    1148:  Package 'php-voku-portable-ascii' is not installed, so not removed
    1149:  Package 'php-wmerrors' is not installed, so not removed
    ...
    
    1845:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/click_test.html -> javascript/atoms/test/click_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1846:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/clientrect_test.html -> javascript/atoms/test/clientrect_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1847:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/color_test.html -> javascript/atoms/test/color_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1848:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/deps.js -> javascript/atoms/test/deps.js obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1849:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/dom_test.html -> javascript/atoms/test/dom_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1850:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/drag_test.html -> javascript/atoms/test/drag_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1851:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/enabled_test.html -> javascript/atoms/test/enabled_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1852:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/enter_submit_test.html -> javascript/atoms/test/enter_submit_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    1853:  (23:01:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:398:19: runfiles symlink javascript/atoms/test/error_test.html -> javascript/atoms/test/error_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    ...
    
    1936:  warning: [options] source value 8 is obsolete and will be removed in a future release
    1937:  warning: [options] target value 8 is obsolete and will be removed in a future release
    1938:  warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
    1939:  (23:01:47) �[32mAnalyzing:�[0m 2156 targets (1630 packages loaded, 59504 targets configured)
    1940:  �[32m[4,282 / 5,587]�[0m 4 / 595 tests;�[0m Copying file common/src/web/elementObscuredByInvisibleElement.html; 0s remote, remote-cache ... (46 actions, 4 running)
    1941:  (23:01:52) �[32mAnalyzing:�[0m 2156 targets (1631 packages loaded, 60037 targets configured)
    1942:  �[32m[6,582 / 7,954]�[0m 9 / 1173 tests;�[0m [Prepa] Executing genrule //common/devtools/chromium/v132:js_protocol ... (41 actions, 12 running)
    1943:  (23:01:53) �[32mINFO: �[0mFrom Building java/src/org/openqa/selenium/remote/libapi-class.jar (70 source files):
    1944:  java/src/org/openqa/selenium/remote/ErrorHandler.java:46: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1945:  private final ErrorCodes errorCodes;
    1946:  ^
    1947:  java/src/org/openqa/selenium/remote/ErrorHandler.java:60: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1948:  this.errorCodes = new ErrorCodes();
    1949:  ^
    1950:  java/src/org/openqa/selenium/remote/ErrorHandler.java:68: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1951:  public ErrorHandler(ErrorCodes codes, boolean includeServerErrors) {
    1952:  ^
    1953:  java/src/org/openqa/selenium/remote/Response.java:97: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1954:  ErrorCodes errorCodes = new ErrorCodes();
    1955:  ^
    1956:  java/src/org/openqa/selenium/remote/Response.java:97: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1957:  ErrorCodes errorCodes = new ErrorCodes();
    1958:  ^
    1959:  java/src/org/openqa/selenium/remote/ProtocolHandshake.java:181: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1960:  response.setStatus(ErrorCodes.SUCCESS);
    1961:  ^
    1962:  java/src/org/openqa/selenium/remote/ProtocolHandshake.java:182: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1963:  response.setState(ErrorCodes.SUCCESS_STRING);
    1964:  ^
    1965:  java/src/org/openqa/selenium/remote/W3CHandshakeResponse.java:53: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1966:  new ErrorCodes().toStatus((String) rawError, Optional.of(tuple.getStatusCode())));
    1967:  ^
    1968:  java/src/org/openqa/selenium/remote/W3CHandshakeResponse.java:56: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1969:  new ErrorCodes().getExceptionType((String) rawError);
    1970:  ^
    1971:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:44: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1972:  private final ErrorCodes errorCodes = new ErrorCodes();
    1973:  ^
    1974:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:44: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1975:  private final ErrorCodes errorCodes = new ErrorCodes();
    1976:  ^
    1977:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:55: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1978:  int status = response.getStatus() == ErrorCodes.SUCCESS ? HTTP_OK : HTTP_INTERNAL_ERROR;
    1979:  ^
    1980:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:101: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1981:  response.setStatus(ErrorCodes.UNKNOWN_COMMAND);
    1982:  ^
    1983:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:103: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1984:  response.setStatus(ErrorCodes.UNHANDLED_ERROR);
    1985:  ^
    1986:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:117: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1987:  response.setStatus(ErrorCodes.SUCCESS);
    1988:  ^
    1989:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:118: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1990:  response.setState(errorCodes.toState(ErrorCodes.SUCCESS));
    1991:  ^
    1992:  java/src/org/openqa/selenium/remote/codec/AbstractHttpResponseCodec.java:124: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1993:  response.setState(errorCodes.toState(ErrorCodes.SUCCESS));
    1994:  ^
    1995:  java/src/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodec.java:70: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1996:  private final ErrorCodes errorCodes = new ErrorCodes();
    1997:  ^
    1998:  java/src/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodec.java:70: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    1999:  private final ErrorCodes errorCodes = new ErrorCodes();
    2000:  ^
    2001:  java/src/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodec.java:93: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2002:  response.setStatus(ErrorCodes.UNKNOWN_COMMAND);
    2003:  ^
    2004:  java/src/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodec.java:98: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2005:  response.setStatus(ErrorCodes.UNHANDLED_ERROR);
    2006:  ^
    2007:  java/src/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodec.java:145: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2008:  response.setStatus(ErrorCodes.SUCCESS);
    ...
    
    2146:  2 installed gems you directly depend on are looking for funding.
    2147:  Run `bundle fund` for details
    2148:  (23:02:02) �[32mAnalyzing:�[0m 2156 targets (1634 packages loaded, 62907 targets configured)
    2149:  �[32m[10,175 / 11,099]�[0m 82 / 1826 tests;�[0m Creating source manifest for //py:common-edge-bidi-test/selenium/webdriver/common/virtual_authenticator_tests.py; 0s local ... (42 actions, 22 running)
    2150:  (23:02:07) �[32mINFO: �[0mFrom PackageZip javascript/grid-ui/react-zip.jar:
    2151:  /mnt/engflow/worker/work/1/exec/bazel-out/k8-opt-exec-ST-a934f86a68ba/bin/external/rules_pkg+/pkg/private/zip/build_zip.runfiles/rules_python++python+python_3_9_x86_64-unknown-linux-gnu/lib/python3.9/zipfile.py:1522: UserWarning: Duplicate name: 'grid-ui/'
    2152:  return self._open_to_write(zinfo, force_zip64=force_zip64)
    2153:  (23:02:07) �[32mAnalyzing:�[0m 2156 targets (1635 packages loaded, 63162 targets configured)
    2154:  �[32m[10,405 / 11,409]�[0m 95 / 1876 tests;�[0m [Prepa] Testing //rb/spec/integration/selenium/webdriver:error-chrome-bidi ... (8 actions, 0 running)
    ...
    
    2165:  (23:02:37) �[32mAnalyzing:�[0m 2156 targets (1635 packages loaded, 63355 targets configured)
    2166:  �[32m[10,681 / 12,323]�[0m 221 / 2077 tests;�[0m Testing //javascript/node/selenium-webdriver:test-bidi-bidi-test.js-chrome; 1s remote, remote-cache ... (50 actions, 1 running)
    2167:  (23:02:42) �[32mAnalyzing:�[0m 2156 targets (1635 packages loaded, 63410 targets configured)
    2168:  �[32m[10,835 / 12,415]�[0m 327 / 2134 tests;�[0m Testing //rb:lint; 4s remote, remote-cache ... (50 actions, 2 running)
    2169:  (23:02:45) �[32mINFO: �[0mAnalyzed 2156 targets (1635 packages loaded, 63431 targets configured).
    2170:  (23:02:47) �[32m[11,129 / 12,581]�[0m 453 / 2156 tests;�[0m Testing //rb:lint; 9s remote, remote-cache ... (49 actions, 2 running)
    2171:  (23:02:52) �[32m[11,573 / 12,956]�[0m 600 / 2156 tests;�[0m Testing //rb:lint; 14s remote, remote-cache ... (46 actions, 2 running)
    2172:  (23:02:54) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/libsmall-tests-test-lib.jar (5 source files) and running annotation processors (AutoServiceProcessor):
    2173:  java/test/org/openqa/selenium/remote/WebDriverFixture.java:170: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2174:  response.setStatus(new ErrorCodes().toStatus(state, Optional.of(400)));
    2175:  ^
    2176:  (23:02:55) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/ErrorHandlerTest.jar (1 source file) and running annotation processors (AutoServiceProcessor):
    2177:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:79: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2178:  handler.throwIfResponseFailed(createResponse(ErrorCodes.SUCCESS), 100);
    2179:  ^
    2180:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:85: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2181:  assertThrowsCorrectExceptionType(ErrorCodes.NO_SUCH_WINDOW, NoSuchWindowException.class);
    2182:  ^
    2183:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:86: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2184:  assertThrowsCorrectExceptionType(ErrorCodes.NO_SUCH_FRAME, NoSuchFrameException.class);
    2185:  ^
    2186:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:87: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2187:  assertThrowsCorrectExceptionType(ErrorCodes.NO_SUCH_ELEMENT, NoSuchElementException.class);
    2188:  ^
    2189:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:88: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2190:  assertThrowsCorrectExceptionType(ErrorCodes.UNKNOWN_COMMAND, UnsupportedCommandException.class);
    2191:  ^
    2192:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:90: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2193:  ErrorCodes.METHOD_NOT_ALLOWED, UnsupportedCommandException.class);
    2194:  ^
    2195:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:92: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2196:  ErrorCodes.STALE_ELEMENT_REFERENCE, StaleElementReferenceException.class);
    2197:  ^
    2198:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:94: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2199:  ErrorCodes.INVALID_ELEMENT_STATE, InvalidElementStateException.class);
    2200:  ^
    2201:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:95: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2202:  assertThrowsCorrectExceptionType(ErrorCodes.XPATH_LOOKUP_ERROR, InvalidSelectorException.class);
    2203:  ^
    2204:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:107: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2205:  Response response = createResponse(ErrorCodes.UNHANDLED_ERROR);
    2206:  ^
    2207:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:120: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2208:  createResponse(ErrorCodes.UNHANDLED_ERROR, "boom"), 123))
    2209:  ^
    2210:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:133: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2211:  createResponse(ErrorCodes.UNHANDLED_ERROR, ImmutableMap.of("message", "boom")),
    2212:  ^
    2213:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:147: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2214:  ErrorCodes.UNHANDLED_ERROR,
    2215:  ^
    2216:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:167: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2217:  ErrorCodes.UNHANDLED_ERROR,
    2218:  ^
    2219:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:193: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2220:  createResponse(ErrorCodes.UNHANDLED_ERROR, toMap(serverError)), 123))
    2221:  ^
    2222:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:214: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2223:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2224:  ^
    2225:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:248: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2226:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2227:  ^
    2228:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:280: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2229:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2230:  ^
    2231:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:308: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2232:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2233:  ^
    2234:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:327: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2235:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2236:  ^
    2237:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:355: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2238:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2239:  ^
    2240:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:394: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2241:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2242:  ^
    2243:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:426: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2244:  createResponse(ErrorCodes.UNHANDLED_ERROR, toMap(serverError)), 123))
    2245:  ^
    2246:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:435: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2247:  exceptions.put(ErrorCodes.NO_SUCH_SESSION, NoSuchSessionException.class);
    2248:  ^
    2249:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:436: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2250:  exceptions.put(ErrorCodes.NO_SUCH_ELEMENT, NoSuchElementException.class);
    2251:  ^
    2252:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:437: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2253:  exceptions.put(ErrorCodes.NO_SUCH_FRAME, NoSuchFrameException.class);
    2254:  ^
    2255:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:438: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2256:  exceptions.put(ErrorCodes.UNKNOWN_COMMAND, UnsupportedCommandException.class);
    2257:  ^
    2258:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:439: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2259:  exceptions.put(ErrorCodes.STALE_ELEMENT_REFERENCE, StaleElementReferenceException.class);
    2260:  ^
    2261:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:440: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2262:  exceptions.put(ErrorCodes.INVALID_ELEMENT_STATE, InvalidElementStateException.class);
    2263:  ^
    2264:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:441: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2265:  exceptions.put(ErrorCodes.UNHANDLED_ERROR, WebDriverException.class);
    2266:  ^
    2267:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:442: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2268:  exceptions.put(ErrorCodes.JAVASCRIPT_ERROR, JavascriptException.class);
    2269:  ^
    2270:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:443: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2271:  exceptions.put(ErrorCodes.XPATH_LOOKUP_ERROR, InvalidSelectorException.class);
    2272:  ^
    2273:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:444: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2274:  exceptions.put(ErrorCodes.TIMEOUT, TimeoutException.class);
    2275:  ^
    2276:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:445: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2277:  exceptions.put(ErrorCodes.NO_SUCH_WINDOW, NoSuchWindowException.class);
    2278:  ^
    2279:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:446: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2280:  exceptions.put(ErrorCodes.INVALID_COOKIE_DOMAIN, InvalidCookieDomainException.class);
    2281:  ^
    2282:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:447: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2283:  exceptions.put(ErrorCodes.UNABLE_TO_SET_COOKIE, UnableToSetCookieException.class);
    2284:  ^
    2285:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:448: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2286:  exceptions.put(ErrorCodes.UNEXPECTED_ALERT_PRESENT, UnhandledAlertException.class);
    2287:  ^
    2288:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:449: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2289:  exceptions.put(ErrorCodes.NO_ALERT_PRESENT, NoAlertPresentException.class);
    2290:  ^
    2291:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:450: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2292:  exceptions.put(ErrorCodes.ASYNC_SCRIPT_TIMEOUT, ScriptTimeoutException.class);
    2293:  ^
    2294:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:451: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2295:  exceptions.put(ErrorCodes.INVALID_SELECTOR_ERROR, InvalidSelectorException.class);
    2296:  ^
    2297:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:452: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2298:  exceptions.put(ErrorCodes.SESSION_NOT_CREATED, SessionNotCreatedException.class);
    2299:  ^
    2300:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:453: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2301:  exceptions.put(ErrorCodes.MOVE_TARGET_OUT_OF_BOUNDS, MoveTargetOutOfBoundsException.class);
    2302:  ^
    2303:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:454: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2304:  exceptions.put(ErrorCodes.INVALID_XPATH_SELECTOR, InvalidSelectorException.class);
    2305:  ^
    2306:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:455: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2307:  exceptions.put(ErrorCodes.INVALID_XPATH_SELECTOR_RETURN_TYPER, InvalidSelectorException.class);
    2308:  ^
    2309:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:469: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2310:  ? ErrorCodes.INVALID_SELECTOR_ERROR
    2311:  ^
    2312:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:471: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2313:  assertThat(new ErrorCodes().toStatusCode(e)).isEqualTo(expected);
    2314:  ^
    2315:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:483: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2316:  response.setState(new ErrorCodes().toState(status));
    2317:  ^
    2318:  (23:02:56) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodecTest.jar (1 source file):
    2319:  java/test/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodecTest.java:26: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2320:  import static org.openqa.selenium.remote.ErrorCodes.METHOD_NOT_ALLOWED;
    2321:  ^
    2322:  java/test/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodecTest.java:55: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2323:  assertThat(decoded.getStatus()).isEqualTo(ErrorCodes.SUCCESS);
    2324:  ^
    2325:  java/test/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodecTest.java:81: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2326:  assertThat(decoded.getStatus()).isEqualTo(ErrorCodes.UNHANDLED_ERROR);
    2327:  ^
    2328:  java/test/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodecTest.java:107: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2329:  assertThat(decoded.getStatus()).isEqualTo(ErrorCodes.UNHANDLED_ERROR);
    2330:  ^
    2331:  (23:02:57) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/RemotableByTest.jar (1 source file) and running annotation processors (AutoServiceProcessor):
    2332:  java/test/org/openqa/selenium/remote/RemotableByTest.java:23: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2333:  import static org.openqa.selenium.remote.ErrorCodes.SUCCESS_STRING;
    2334:  ^
    2335:  java/test/org/openqa/selenium/remote/RemotableByTest.java:23: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2336:  import static org.openqa.selenium.remote.ErrorCodes.SUCCESS_STRING;
    2337:  ^
    2338:  java/test/org/openqa/selenium/remote/RemotableByTest.java:23: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2339:  import static org.openqa.selenium.remote.ErrorCodes.SUCCESS_STRING;
    2340:  ^
    2341:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2342:  private final ErrorCodes errorCodes = new ErrorCodes();
    2343:  ^
    2344:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2345:  private final ErrorCodes errorCodes = new ErrorCodes();
    2346:  ^
    2347:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2348:  private final ErrorCodes errorCodes = new ErrorCodes();
    2349:  ^
    2350:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2351:  private final ErrorCodes errorCodes = new ErrorCodes();
    2352:  ^
    2353:  (23:02:57) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/json/JsonTest.jar (1 source file):
    2354:  java/test/org/openqa/selenium/json/JsonTest.java:430: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2355:  assertThat(response.getState()).isEqualTo(new ErrorCodes().toState(0));
    2356:  ^
    2357:  java/test/org/openqa/selenium/json/JsonTest.java:441: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2358:  assertThat(response.getState()).isEqualTo(new ErrorCodes().toState(0));
    2359:  ^
    2360:  java/test/org/openqa/selenium/json/JsonTest.java:454: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2361:  assertThat(response.getState()).isEqualTo(new ErrorCodes().toState(32));
    ...
    
    2369:  Build Script Warning: bzip2-1.0.8/compress.c: In function ‘sendMTFValues’:
    2370:  Build Script Warning: bzip2-1.0.8/compress.c:243:19: warning: variable ‘nBytes’ set but not used [-Wunused-but-set-variable]
    2371:  Build Script Warning:   243 |    Int32 nGroups, nBytes;
    2372:  Build Script Warning:       |                   ^~~~~~
    2373:  (23:03:19) �[32mINFO: �[0mFrom Compiling webdriver-netstandard2.0 (internals ref-only dll):
    2374:  dotnet/src/webdriver/BiDi/Modules/Script/RemoteValue.cs(252,35): warning CS8766: Nullability of reference types in return type of 'string? Node.SharedId.get' doesn't match implicitly implemented member 'string ISharedReference.SharedId.get' (possibly because of nullability attributes).
    2375:  (23:03:20) �[32mINFO: �[0mFrom Compiling webdriver-net8.0:
    2376:  dotnet/src/webdriver/BiDi/Modules/Script/RemoteValue.cs(252,35): warning CS8766: Nullability of reference types in return type of 'string? Node.SharedId.get' doesn't match implicitly implemented member 'string ISharedReference.SharedId.get' (possibly because of nullability attributes).
    2377:  dotnet/src/webdriver/WebDriver.cs(778,30): warning CS0618: 'WebDriverResult.ElementNotDisplayed' is obsolete: 'This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30'
    2378:  dotnet/src/webdriver/WebDriver.cs(782,30): warning CS0618: 'WebDriverResult.ElementNotSelectable' is obsolete: 'This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30'
    2379:  dotnet/src/webdriver/WebDriver.cs(785,30): warning CS0618: 'WebDriverResult.NoSuchDocument' is obsolete: 'This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30'
    2380:  dotnet/src/webdriver/Response.cs(126,33): warning CS8602: Dereference of a possibly null reference.
    2381:  dotnet/src/webdriver/JavaScriptEngine.cs(430,43): warning CS8601: Possible null reference assignment.
    2382:  dotnet/src/webdriver/Chromium/ChromiumDriver.cs(333,67): warning CS8604: Possible null reference argument for parameter 'endpointAddress' in 'DevToolsSession.DevToolsSession(string endpointAddress, DevToolsOptions options)'.
    2383:  dotnet/src/webdriver/DevTools/DevToolsSession.cs(499,36): warning CS8604: Possible null reference argument for parameter 'url' in 'Task WebSocketConnection.Start(string url)'.
    2384:  (23:03:20) �[32mINFO: �[0mFrom Compiling webdriver-netstandard2.0:
    2385:  dotnet/src/webdriver/BiDi/Modules/Script/RemoteValue.cs(252,35): warning CS8766: Nullability of reference types in return type of 'string? Node.SharedId.get' doesn't match implicitly implemented member 'string ISharedReference.SharedId.get' (possibly because of nullability attributes).
    2386:  dotnet/src/webdriver/WebDriver.cs(778,30): warning CS0618: 'WebDriverResult.ElementNotDisplayed' is obsolete: 'This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30'
    2387:  dotnet/src/webdriver/WebDriver.cs(782,30): warning CS0618: 'WebDriverResult.ElementNotSelectable' is obsolete: 'This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30'
    2388:  dotnet/src/webdriver/WebDriver.cs(785,30): warning CS0618: 'WebDriverResult.NoSuchDocument' is obsolete: 'This error status is no longer returned by the WebDriver Specification https://www.w3.org/TR/webdriver2/#errors. Will be removed in 4.30'
    ...
    
    2407:  (23:04:27) �[32m[15,536 / 15,538]�[0m 2154 / 2156 tests;�[0m Testing //rb:lint; 109s remote, remote-cache ... (2 actions running)
    2408:  (23:04:28) �[31m�[1mFAIL: �[0m//rb/spec/integration/selenium/webdriver:action_builder-firefox-remote (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/integration/selenium/webdriver/action_builder-firefox-remote/test_attempts/attempt_1.log)
    2409:  (23:04:33) �[32m[15,536 / 15,538]�[0m 2154 / 2156 tests;�[0m Testing //rb:lint; 114s remote, remote-cache ... (2 actions running)
    2410:  (23:05:00) �[32m[15,536 / 15,538]�[0m 2154 / 2156 tests;�[0m Testing //rb:lint; 142s remote, remote-cache ... (2 actions running)
    2411:  (23:05:19) �[32m[15,536 / 15,538]�[0m 2154 / 2156 tests;�[0m Testing //rb:lint; 161s remote, remote-cache ... (2 actions running)
    2412:  (23:05:20) �[31m�[1mFAIL: �[0m//rb:lint (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/lint/test_attempts/attempt_1.log)
    2413:  (23:05:28) �[32m[15,536 / 15,538]�[0m 2154 / 2156 tests;�[0m Testing //rb:lint; 169s remote, remote-cache ... (2 actions running)
    2414:  (23:05:33) �[31m�[1mFAIL: �[0m//rb/spec/integration/selenium/webdriver:action_builder-firefox-remote (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/integration/selenium/webdriver/action_builder-firefox-remote/test.log)
    2415:  �[31m�[1mFAILED: �[0m//rb/spec/integration/selenium/webdriver:action_builder-firefox-remote (Summary)
    ...
    
    2453:  moves one element to another
    2454:  #drag_and_drop_by
    2455:  moves one element a provided distance
    2456:  #move_to_location
    2457:  moves pointer to specified coordinates
    2458:  pen stylus
    2459:  sets pointer event properties (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};)
    2460:  #scroll_to
    2461:  scrolls to element (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2462:  #scroll_by
    2463:  scrolls by given amount (FAILED - 1)
    2464:  #scroll_from
    2465:  scrolls from element by given amount (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2466:  scrolls from element by given amount with offset (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2467:  raises MoveTargetOutOfBoundsError when origin offset from element is out of viewport
    2468:  scrolls by given amount with offset
    2469:  raises MoveTargetOutOfBoundsError when origin offset is out of viewport
    2470:  Pending: (Failures listed here are expected and do not affect your suite's status)
    2471:  1) Selenium::WebDriver::ActionBuilder pen stylus sets pointer event properties
    2472:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};
    2473:  Failure/Error: actions.perform
    2474:  Selenium::WebDriver::Error::UnknownError:
    2475:  Error: Unimplemented pointerMove for pointerType pen
    2476:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2477:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2481:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2482:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2483:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2484:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2485:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2486:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:280:in `block in WebDriver'
    2487:  # ------------------
    2488:  # --- Caused by: ---
    2489:  # Selenium::WebDriver::Error::WebDriverError:
    2490:  #   pointerMove@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2393:11
    2491:  performPointerMoveStep@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1628:31
    2492:  dispatch/<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1595:20
    2493:  moveOverTime/transitions<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2320:9
    2494:  2) Selenium::WebDriver::ActionBuilder#scroll_to scrolls to element
    2495:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2496:  Failure/Error: driver.action.scroll_to(iframe).perform
    2497:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2498:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    2499:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2500:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2504:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2505:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2506:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2507:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2508:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2509:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:313:in `block in WebDriver'
    2510:  # ------------------
    2511:  # --- Caused by: ---
    2512:  # Selenium::WebDriver::Error::WebDriverError:
    2513:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2514:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:197:5
    2515:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:493:5
    2516:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3097:11
    2517:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2518:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:203:42
    2519:  3) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount
    2520:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2521:  Failure/Error: driver.action.scroll_from(scroll_origin, 0, 200).perform
    2522:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2523:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    2524:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2525:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2529:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2530:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2531:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2532:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2533:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2534:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:339:in `block in WebDriver'
    2535:  # ------------------
    2536:  # --- Caused by: ---
    2537:  # Selenium::WebDriver::Error::WebDriverError:
    2538:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2539:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:197:5
    2540:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:493:5
    2541:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3097:11
    2542:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2543:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:203:42
    2544:  4) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount with offset
    2545:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2546:  Failure/Error: driver.action.scroll_from(scroll_origin, 0, 200).perform
    2547:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2548:  Move target (640, 2967) is out of bounds of viewport dimensions (1280, 819)
    2549:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2550:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2554:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2555:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2556:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2557:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2558:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2559:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:353:in `block in WebDriver'
    2560:  # ------------------
    2561:  # --- Caused by: ---
    2562:  # Selenium::WebDriver::Error::WebDriverError:
    2563:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2564:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:197:5
    2565:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:493:5
    2566:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3097:11
    2567:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2568:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:203:42
    2569:  Failures:
    2570:  1) Selenium::WebDriver::ActionBuilder#scroll_by scrolls by given amount FIXED
    2571:  Expected pending 'Test guarded; Guarded by {:browser=>:firefox, :reason=>"returns false on firefox"};' to fail. No error was raised.
    2572:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:320
    2573:  Finished in 51.08 seconds (files took 2.37 seconds to load)
    2574:  27 examples, 1 failure, 4 pending
    2575:  Failed examples:
    ...
    
    2614:  moves one element to another
    2615:  #drag_and_drop_by
    2616:  moves one element a provided distance
    2617:  #move_to_location
    2618:  moves pointer to specified coordinates
    2619:  pen stylus
    2620:  sets pointer event properties (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};)
    2621:  #scroll_to
    2622:  scrolls to element (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2623:  #scroll_by
    2624:  scrolls by given amount (FAILED - 1)
    2625:  #scroll_from
    2626:  scrolls from element by given amount (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2627:  scrolls from element by given amount with offset (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2628:  raises MoveTargetOutOfBoundsError when origin offset from element is out of viewport
    2629:  scrolls by given amount with offset
    2630:  raises MoveTargetOutOfBoundsError when origin offset is out of viewport
    2631:  Pending: (Failures listed here are expected and do not affect your suite's status)
    2632:  1) Selenium::WebDriver::ActionBuilder pen stylus sets pointer event properties
    2633:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};
    2634:  Failure/Error: actions.perform
    2635:  Selenium::WebDriver::Error::UnknownError:
    2636:  Error: Unimplemented pointerMove for pointerType pen
    2637:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2638:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2642:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2643:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2644:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2645:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2646:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2647:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:280:in `block in WebDriver'
    2648:  # ------------------
    2649:  # --- Caused by: ---
    2650:  # Selenium::WebDriver::Error::WebDriverError:
    2651:  #   pointerMove@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2393:11
    2652:  performPointerMoveStep@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1628:31
    2653:  dispatch/<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1595:20
    2654:  moveOverTime/transitions<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2320:9
    2655:  2) Selenium::WebDriver::ActionBuilder#scroll_to scrolls to element
    2656:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2657:  Failure/Error: driver.action.scroll_to(iframe).perform
    2658:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2659:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    2660:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2661:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2665:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2666:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2667:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2668:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2669:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2670:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:313:in `block in WebDriver'
    2671:  # ------------------
    2672:  # --- Caused by: ---
    2673:  # Selenium::WebDriver::Error::WebDriverError:
    2674:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2675:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:197:5
    2676:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:493:5
    2677:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3097:11
    2678:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2679:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:203:42
    2680:  3) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount
    2681:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2682:  Failure/Error: driver.action.scroll_from(scroll_origin, 0, 200).perform
    2683:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2684:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    2685:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2686:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2690:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2691:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2692:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2693:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2694:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2695:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:339:in `block in WebDriver'
    2696:  # ------------------
    2697:  # --- Caused by: ---
    2698:  # Selenium::WebDriver::Error::WebDriverError:
    2699:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2700:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:197:5
    2701:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:493:5
    2702:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3097:11
    2703:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2704:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:203:42
    2705:  4) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount with offset
    2706:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2707:  Failure/Error: driver.action.scroll_from(scroll_origin, 0, 200).perform
    2708:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2709:  Move target (640, 2967) is out of bounds of viewport dimensions (1280, 819)
    2710:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2711:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    ...
    
    2715:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2716:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2717:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:685:in `execute'
    2718:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:413:in `send_actions'
    2719:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2720:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:353:in `block in WebDriver'
    2721:  # ------------------
    2722:  # --- Caused by: ---
    2723:  # Selenium::WebDriver::Error::WebDriverError:
    2724:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2725:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:197:5
    2726:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:493:5
    2727:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3097:11
    2728:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2729:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:203:42
    2730:  Failures:
    2731:  1) Selenium::WebDriver::ActionBuilder#scroll_by scrolls by given amount FIXED
    2732:  Expected pending 'Test guarded; Guarded by {:browser=>:firefox, :reason=>"returns false on firefox"};' to fail. No error was raised.
    2733:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:320
    2734:  Finished in 50.47 seconds (files took 2.38 seconds to load)
    2735:  27 examples, 1 failure, 4 pending
    2736:  Failed examples:
    2737:  rspec ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:320 # Selenium::WebDriver::ActionBuilder#scroll_by scrolls by given amount
    2738:  Execution result: https://gypsum.cluster.engflow.com/actions/executions/ChCgHfMQ0UNCiqLjEC0JFA-PEgdkZWZhdWx0GiUKIN5_MWHfNEa3yedI_QgIuvoLJGjGGZpkrUrAQ1kf1pd9EJ8D
    2739:  ================================================================================
    2740:  (23:05:33) �[32mINFO: �[0mFrom Testing //rb/spec/integration/selenium/webdriver:action_builder-firefox-remote:
    2741:  (23:05:38) �[32m[15,537 / 15,538]�[0m 2155 / 2156 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb:lint; 179s remote, remote-cache
    2742:  (23:05:44) �[32m[15,537 / 15,538]�[0m 2155 / 2156 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb:lint; 186s remote, remote-cache
    2743:  (23:06:14) �[32m[15,537 / 15,538]�[0m 2155 / 2156 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb:lint; 216s remote, remote-cache
    2744:  (23:07:14) �[32m[15,537 / 15,538]�[0m 2155 / 2156 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb:lint; 276s remote, remote-cache
    2745:  (23:07:55) �[32m[15,537 / 15,538]�[0m 2155 / 2156 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb:lint; 317s remote, remote-cache
    2746:  (23:07:56) �[31m�[1mFAIL: �[0m//rb:lint (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/lint/test.log)
    2747:  �[31m�[1mFAILED: �[0m//rb:lint (Summary)
    ...
    
    2762:  Offenses:
    2763:  rb/lib/selenium/webdriver/common/manager.rb:113:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2764:  SECONDS_PER_DAY = 86_400.0
    2765:  ^^^^^^^^^^^^^^^^^^^^^^^^^^
    2766:  rb/lib/selenium/webdriver/common/socket_poller.rb:57:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2767:  CONNECT_TIMEOUT = 5
    2768:  ^^^^^^^^^^^^^^^^^^^
    2769:  rb/lib/selenium/webdriver/common/socket_poller.rb:59:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2770:  NOT_CONNECTED_ERRORS = [Errno::ECONNREFUSED, Errno::ENOTCONN, SocketError].tap { |arr| ...
    2771:  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    2772:  rb/lib/selenium/webdriver/common/socket_poller.rb:63:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2773:  CONNECTED_ERRORS = [Errno::EISCONN].tap { |arr| ...
    2774:  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    2775:  rb/lib/selenium/webdriver/remote/http/default.rb:68:11: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2776:  MAX_RETRIES = 3
    2777:  ^^^^^^^^^^^^^^^
    2778:  rb/spec/integration/selenium/webdriver/spec_support/test_environment.rb:213:9: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2779:  MAX_ERRORS = 4
    ...
    
    2795:  Offenses:
    2796:  rb/lib/selenium/webdriver/common/manager.rb:113:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2797:  SECONDS_PER_DAY = 86_400.0
    2798:  ^^^^^^^^^^^^^^^^^^^^^^^^^^
    2799:  rb/lib/selenium/webdriver/common/socket_poller.rb:57:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2800:  CONNECT_TIMEOUT = 5
    2801:  ^^^^^^^^^^^^^^^^^^^
    2802:  rb/lib/selenium/webdriver/common/socket_poller.rb:59:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2803:  NOT_CONNECTED_ERRORS = [Errno::ECONNREFUSED, Errno::ENOTCONN, SocketError].tap { |arr| ...
    2804:  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    2805:  rb/lib/selenium/webdriver/common/socket_poller.rb:63:7: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2806:  CONNECTED_ERRORS = [Errno::EISCONN].tap { |arr| ...
    2807:  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    2808:  rb/lib/selenium/webdriver/remote/http/default.rb:68:11: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2809:  MAX_RETRIES = 3
    2810:  ^^^^^^^^^^^^^^^
    2811:  rb/spec/integration/selenium/webdriver/spec_support/test_environment.rb:213:9: W: Lint/UselessConstantScoping: Useless private access modifier for constant scope.
    2812:  MAX_ERRORS = 4
    2813:  ^^^^^^^^^^^^^^
    2814:  294 files inspected, 6 offenses detected
    2815:  Execution result: https://gypsum.cluster.engflow.com/actions/executions/ChCgHfMQ0UNCiqLjEC0JFA-PEgdkZWZhdWx0GiUKIHOimLTFW037aSnRzkeH3Z0RL4-DYmoAk-RInb4gCzPuEJ8D
    2816:  ================================================================================
    2817:  (23:07:56) �[32mINFO: �[0mFound 2156 test targets...
    2818:  (23:07:56) �[32mINFO: �[0mElapsed time: 486.010s, Critical Path: 331.30s
    2819:  (23:07:56) �[32mINFO: �[0m14739 processes: 7370 remote cache hit, 7304 internal, 50 local, 15 remote.
    2820:  (23:07:56) �[32mINFO: �[0mBuild completed, 2 tests FAILED, 14739 total actions
    ...
    
    2933:  //dotnet/test/common:ElementFindingTest-edge                    �[0m�[32m(cached) PASSED�[0m in 27.7s
    2934:  //dotnet/test/common:ElementFindingTest-firefox                 �[0m�[32m(cached) PASSED�[0m in 33.9s
    2935:  //dotnet/test/common:ElementPropertyTest-chrome                 �[0m�[32m(cached) PASSED�[0m in 6.3s
    2936:  //dotnet/test/common:ElementPropertyTest-edge                   �[0m�[32m(cached) PASSED�[0m in 6.8s
    2937:  //dotnet/test/common:ElementPropertyTest-firefox                �[0m�[32m(cached) PASSED�[0m in 10.3s
    2938:  //dotnet/test/common:ElementSelectingTest-chrome                �[0m�[32m(cached) PASSED�[0m in 10.1s
    2939:  //dotnet/test/common:ElementSelectingTest-edge                  �[0m�[32m(cached) PASSED�[0m in 11.1s
    2940:  //dotnet/test/common:ElementSelectingTest-firefox               �[0m�[32m(cached) PASSED�[0m in 21.5s
    2941:  //dotnet/test/common:ErrorsTest-chrome                          �[0m�[32m(cached) PASSED�[0m in 5.3s
    2942:  //dotnet/test/common:ErrorsTest-edge                            �[0m�[32m(cached) PASSED�[0m in 6.4s
    2943:  //dotnet/test/common:ErrorsTest-firefox                         �[0m�[32m(cached) PASSED�[0m in 9.5s
    ...
    
    3293:  //java/test/org/openqa/selenium:ElementFindingTest-edge         �[0m�[32m(cached) PASSED�[0m in 93.5s
    3294:  //java/test/org/openqa/selenium:ElementFindingTest-firefox-beta �[0m�[32m(cached) PASSED�[0m in 27.8s
    3295:  //java/test/org/openqa/selenium:ElementFindingTest-spotbugs     �[0m�[32m(cached) PASSED�[0m in 9.9s
    3296:  //java/test/org/openqa/selenium:ElementSelectingTest            �[0m�[32m(cached) PASSED�[0m in 23.8s
    3297:  //java/test/org/openqa/selenium:ElementSelectingTest-chrome     �[0m�[32m(cached) PASSED�[0m in 14.6s
    3298:  //java/test/org/openqa/selenium:ElementSelectingTest-edge       �[0m�[32m(cached) PASSED�[0m in 25.2s
    3299:  //java/test/org/openqa/selenium:ElementSelectingTest-firefox-beta �[0m�[32m(cached) PASSED�[0m in 26.4s
    3300:  //java/test/org/openqa/selenium:ElementSelectingTest-spotbugs   �[0m�[32m(cached) PASSED�[0m in 7.8s
    3301:  //java/test/org/openqa/selenium:ErrorsTest                      �[0m�[32m(cached) PASSED�[0m in 10.4s
    3302:  //java/test/org/openqa/selenium:ErrorsTest-chrome               �[0m�[32m(cached) PASSED�[0m in 7.6s
    3303:  //java/test/org/openqa/selenium:ErrorsTest-edge                 �[0m�[32m(cached) PASSED�[0m in 8.6s
    3304:  //java/test/org/openqa/selenium:ErrorsTest-firefox-beta         �[0m�[32m(cached) PASSED�[0m in 11.9s
    3305:  //java/test/org/openqa/selenium:ErrorsTest-spotbugs             �[0m�[32m(cached) PASSED�[0m in 5.9s
    ...
    
    4024:  //java/test/org/openqa/selenium/os:ExternalProcessTest          �[0m�[32m(cached) PASSED�[0m in 2.3s
    4025:  //java/test/org/openqa/selenium/os:ExternalProcessTest-spotbugs �[0m�[32m(cached) PASSED�[0m in 8.9s
    4026:  //java/test/org/openqa/selenium/os:OsProcessTest                �[0m�[32m(cached) PASSED�[0m in 4.1s
    4027:  //java/test/org/openqa/selenium/os:OsProcessTest-spotbugs       �[0m�[32m(cached) PASSED�[0m in 10.0s
    4028:  //java/test/org/openqa/selenium/remote:AugmenterTest            �[0m�[32m(cached) PASSED�[0m in 5.1s
    4029:  //java/test/org/openqa/selenium/remote:AugmenterTest-spotbugs   �[0m�[32m(cached) PASSED�[0m in 9.4s
    4030:  //java/test/org/openqa/selenium/remote:DesiredCapabilitiesTest  �[0m�[32m(cached) PASSED�[0m in 1.7s
    4031:  //java/test/org/openqa/selenium/remote:DesiredCapabilitiesTest-spotbugs �[0m�[32m(cached) PASSED�[0m in 10.1s
    4032:  //java/test/org/openqa/selenium/remote:ErrorCodecTest           �[0m�[32m(cached) PASSED�[0m in 1.9s
    4033:  //java/test/org/openqa/selenium/remote:ErrorCodecTest-spotbugs  �[0m�[32m(cached) PASSED�[0m in 7.8s
    4034:  //java/test/org/openqa/selenium/remote:ErrorHandlerTest         �[0m�[32m(cached) PASSED�[0m in 2.4s
    4035:  //java/test/org/openqa/selenium/remote:ErrorHandlerTest-spotbugs �[0m�[32m(cached) PASSED�[0m in 9.6s
    ...
    
    4622:  //py:unit-test/unit/selenium/webdriver/chrome/chrome_options_tests.py �[0m�[32m(cached) PASSED�[0m in 2.8s
    4623:  //py:unit-test/unit/selenium/webdriver/common/cdp_module_fallback_tests.py �[0m�[32m(cached) PASSED�[0m in 2.8s
    4624:  //py:unit-test/unit/selenium/webdriver/common/common_options_tests.py �[0m�[32m(cached) PASSED�[0m in 2.3s
    4625:  //py:unit-test/unit/selenium/webdriver/common/fedcm/account_tests.py �[0m�[32m(cached) PASSED�[0m in 2.3s
    4626:  //py:unit-test/unit/selenium/webdriver/common/fedcm/dialog_tests.py �[0m�[32m(cached) PASSED�[0m in 2.2s
    4627:  //py:unit-test/unit/selenium/webdriver/common/print_page_options_tests.py �[0m�[32m(cached) PASSED�[0m in 2.2s
    4628:  //py:unit-test/unit/selenium/webdriver/edge/edge_options_tests.py �[0m�[32m(cached) PASSED�[0m in 3.0s
    4629:  //py:unit-test/unit/selenium/webdriver/firefox/firefox_options_tests.py �[0m�[32m(cached) PASSED�[0m in 3.3s
    4630:  //py:unit-test/unit/selenium/webdriver/remote/error_handler_tests.py �[0m�[32m(cached) PASSED�[0m in 2.8s
    ...
    
    4662:  //rb/spec/integration/selenium/webdriver:element-edge-bidi      �[0m�[32m(cached) PASSED�[0m in 15.4s
    4663:  //rb/spec/integration/selenium/webdriver:element-edge-remote    �[0m�[32m(cached) PASSED�[0m in 45.3s
    4664:  //rb/spec/integration/selenium/webdriver:element-firefox        �[0m�[32m(cached) PASSED�[0m in 59.6s
    4665:  //rb/spec/integration/selenium/webdriver:element-firefox-beta   �[0m�[32m(cached) PASSED�[0m in 58.0s
    4666:  //rb/spec/integration/selenium/webdriver:element-firefox-beta-bidi �[0m�[32m(cached) PASSED�[0m in 18.8s
    4667:  //rb/spec/integration/selenium/webdriver:element-firefox-beta-remote �[0m�[32m(cached) PASSED�[0m in 66.2s
    4668:  //rb/spec/integration/selenium/webdriver:element-firefox-bidi   �[0m�[32m(cached) PASSED�[0m in 18.5s
    4669:  //rb/spec/integration/selenium/webdriver:element-firefox-remote �[0m�[32m(cached) PASSED�[0m in 67.4s
    4670:  //rb/spec/integration/selenium/webdriver:error-chrome           �[0m�[32m(cached) PASSED�[0m in 17.1s
    4671:  //rb/spec/integration/selenium/webdriver:error-chrome-bidi      �[0m�[32m(cached) PASSED�[0m in 12.8s
    4672:  //rb/spec/integration/selenium/webdriver:error-chrome-remote    �[0m�[32m(cached) PASSED�[0m in 19.2s
    4673:  //rb/spec/integration/selenium/webdriver:error-edge             �[0m�[32m(cached) PASSED�[0m in 20.4s
    4674:  //rb/spec/integration/selenium/webdriver:error-edge-bidi        �[0m�[32m(cached) PASSED�[0m in 14.9s
    4675:  //rb/spec/integration/selenium/webdriver:error-edge-remote      �[0m�[32m(cached) PASSED�[0m in 20.3s
    4676:  //rb/spec/integration/selenium/webdriver:error-firefox          �[0m�[32m(cached) PASSED�[0m in 23.4s
    4677:  //rb/spec/integration/selenium/webdriver:error-firefox-beta     �[0m�[32m(cached) PASSED�[0m in 24.7s
    4678:  //rb/spec/integration/selenium/webdriver:error-firefox-beta-bidi �[0m�[32m(cached) PASSED�[0m in 18.3s
    4679:  //rb/spec/integration/selenium/webdriver:error-firefox-beta-remote �[0m�[32m(cached) PASSED�[0m in 10.3s
    4680:  //rb/spec/integration/selenium/webdriver:error-firefox-bidi     �[0m�[32m(cached) PASSED�[0m in 17.8s
    4681:  //rb/spec/integration/selenium/webdriver:error-firefox-remote   �[0m�[32m(cached) PASSED�[0m in 24.5s
    ...
    
    4968:  //rb/spec/unit/selenium/webdriver/support:event_firing          �[0m�[32m(cached) PASSED�[0m in 14.2s
    4969:  //rb/spec/unit/selenium/webdriver/support:select                �[0m�[32m(cached) PASSED�[0m in 16.0s
    4970:  //rust:selenium-manager-fmt                                     �[0m�[32m(cached) PASSED�[0m in 0.2s
    4971:  //dotnet/test/common:BiDi/Network/NetworkEventsTest-firefox              �[0m�[32mPASSED�[0m in 37.2s
    4972:  //java/test/org/openqa/selenium/remote/http:HttpMessageTest              �[0m�[32mPASSED�[0m in 1.8s
    4973:  //rust:selenium_manager-fmt                                              �[0m�[32mPASSED�[0m in 0.7s
    4974:  //rust:unit                                                              �[0m�[32mPASSED�[0m in 0.1s
    4975:  //rust:unit-fmt                                                          �[0m�[32mPASSED�[0m in 0.4s
    4976:  //rb:lint                                                                �[...

    @aeris
    Copy link

    aeris commented Feb 20, 2025

    Selenium Manager does not collect personally identifying information

    Those ARE personally identifying information

    image

    @titusfortner
    Copy link
    Member Author

    That's a much more broad interpretation of PII than what has been established by case law. For data to be considered PII under the GDPR, the organization collecting it must either be able to directly identify an individual or have reasonable means to access additional data that would allow such identification. Aggregated information about browsers and operating systems among millions of users does not meet that standard.

    Regardless, I'm not interested in playing a game of yes it is/no it isn't, so thank you for providing your opinion, but I'm only interested in specific feedback for how we might make this implementation better, not how to remove it, and I would appreciate your being respectful of that.

    @bonigarcia bonigarcia marked this pull request as ready for review February 21, 2025 08:49
    Copy link
    Contributor

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
    🧪 No relevant tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Error Handling

    The fs::write operation for creating the marker file could fail silently since the error is just passed up. Consider adding explicit error handling or logging for file creation failures.

    fs::write(first_report_marker, "")?;
    Race Condition

    Potential race condition between checking marker file existence and creating it. Multiple concurrent executions could show the message multiple times.

    if !first_report_marker.exists() {
        println!("\nSelenium Manager collects anonymous telemetry to improve the project.");
        println!("Detailed information and instructions for opting out may be found at:");
        println!("https://www.selenium.dev/privacy/\n");
    
        create_path_if_not_exists(&cache_dir)?;
        fs::write(first_report_marker, "")?;
    }

    Copy link
    Contributor

    PR Code Suggestions ✨

    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Impact
    Possible issue
    Handle file system errors gracefully

    Handle potential file system errors gracefully when creating the marker file to
    prevent program crashes in environments with restricted permissions.

    rust/src/lib.rs [1684-1691]

     if !first_report_marker.exists() {
         println!("\nSelenium Manager collects anonymous telemetry to improve the project.");
         println!("Detailed information and instructions for opting out may be found at:");
         println!("https://www.selenium.dev/privacy/\n");
     
    -    create_path_if_not_exists(&cache_dir)?;
    -    fs::write(first_report_marker, "")?;
    +    if let Err(e) = create_path_if_not_exists(&cache_dir).and_then(|_| fs::write(first_report_marker, "")) {
    +        eprintln!("Warning: Could not create marker file: {}", e);
    +    }
     }
    • Apply this suggestion
    Suggestion importance[1-10]: 8

    __

    Why: The suggestion improves error handling by gracefully handling file system errors instead of propagating them, which prevents program crashes in restricted environments while still allowing the main functionality to continue.

    Medium
    Learned
    best practice
    Include specific path information in error messages to improve debugging experience when file operations fail

    The error handling in first_report_msg() should include the actual path in error
    messages when file operations fail. Add context about the specific path that
    caused the error to help with debugging.

    rust/src/lib.rs [1689-1690]

    -create_path_if_not_exists(&cache_dir)?;
    -fs::write(first_report_marker, "")?;
    +create_path_if_not_exists(&cache_dir)
    +    .map_err(|e| anyhow!("Failed to create cache directory at {:?}: {}", cache_dir, e))?;
    +fs::write(&first_report_marker, "")
    +    .map_err(|e| anyhow!("Failed to create marker file at {:?}: {}", first_report_marker, e))?;
    • Apply this suggestion
    Suggestion importance[1-10]: 6
    Low
    • More

    Copy link
    Member

    @bonigarcia bonigarcia left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    I believe it is a good idea to display this message. However, the implementation can be improved as follows:

    1. The message should be logged using the Logger struct since this is how bindings capture the output (currently using the JSON format).
    2. There is no need to create this empty file called initialized. Selenium Manager already manages a metadata file called se-metadata.json, which is located in the cache root. If you want to display that message once, you simply can check if that file exists.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    That's a much more broad interpretation of PII than what has been established by case law.

    No, that's not. I guess you restrict PII to data allowing you to namely identify a person. That a huge mistake.
    Data that are NOT PII MUST be robust to:

    • individualisation: you can distinguish a single person from data. This is currently the case, or at least you can't proof you will never be able to identify a single person (for example the single one on haiku riscv64).
    • correlation: it must not be possible to link together separate sets of data concerning the same individual. That's the case here, and at least all the session of the same user, sharing the same fingerprint during a short time, can be correlated
    • inference: it must not be possible to deduce, with near certainty, new information about an individual. That's the case here, measuring the previous work session time.

    So your data are not anonymous, and so are only at most pseudonymous, and so are PII.

    User agent was already declared PII by the CNIL, in Criteo fine:

    https://gdprhub.eu/index.php?title=CNIL_(France)_-_SAN-2023-009

    1. Thus, the Restricted Committee notes that if the company does not directly have the identity of the natural persons to whom the terminals on which cookies are registered are linked, re-identification may be facilitated by the fact that, in certain cases, the company collects, in addition to data related to browsing events, other data that facilitates re-identification such as the email addresses of people who have made their browsing journey from an authenticated (or "logged in") environment in hashed form, identifiers corresponding generated by other actors, the IP address in hashed form or even the user agent of the terminal used.
    2. Consequently, when the company is able to re-identify persons by reasonable means, the data processed retains a personal character, within the meaning of Article 4, 1) of the GDPR.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    not how to remove it, and I would appreciate your being respectful of that.

    Sure. I'm not exposing my opinion but the law. And so I go this day open a claim on my APD because Selenium infringe the law. Good luck.

    @titusfortner
    Copy link
    Member Author

    Your generic critiques do not apply to us, and we'll happily cooperate with any authority who asks for this information.

    To reiterate
    Individualization: Selenium Manager does not track or store unique identifiers that would allow distinguishing a single individual. The presence of one user on an uncommon architecture combination does not inherently mean they are personally identifiable, unless additional identifiable information is collected and linked—which Selenium does not do.

    Correlation: Selenium Manager does not persistently track users across sessions or associate multiple telemetry events.
    Each telemetry event is stateless and not linked to prior interactions, making session correlation impossible.

    Inference: The collected data does not allow for behavioral profiling or inference about an individual’s actions or preferences.
    Work session duration, for example, is not measured, stored, or associated with a specific user.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    You are totally wrong. PII definition don't suppose you ACTIVELY want to identicate a person but only if you ARE ABLE to do so if wanted. It's even worst given Breyer CJEU case, because this possibility must even be study from an UNLAWFUL point of view, or for example because legal seizure by authorities. And the reidentification can even be performed by a third party entity.

    42 Furthermore, recital 26 of Directive 95/46 states that, to determine whether a person is identifiable, account should be taken of all the means likely reasonably to be used either by the controller or by any other person to identify the said person
    43 In so far as that recital refers to the means likely reasonably to be used by both the controller and by ‘any other person’, its wording suggests that, for information to be treated as ‘personal data’ within the meaning of Article 2(a) of that directive, it is not required that all the information enabling the identification of the data subject must be in the hands of one person.

    You definitively have no idea about what is the real PII definition or what is really the GDPR

    @titusfortner
    Copy link
    Member Author

    I've continued engaging with this conversation to demonstrate to anyone who wants to view it that I understand your concerns and I'm not ignoring them. We each believe we understand the law correctly, and neither of us seem to have the ability to persuade the other, so there's no point in continuing.

    I'm still open to feedback from anyone with actionable steps we can take to improve our product on behalf of our users and the community.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    We each believe we understand the law correctly, and neither of us seem to have the ability to persuade the other, so there's no point in continuing.

    I hate authority argument, but…

    I'm one of the most expert people about GDPR, with currently more than 250 cases opened on DPA and a 100% win rate on more of 150 cases currently decided at the end. I predict 6 month in advance future EDPB guidelines and most of the time word for word. I'm currently one of the only 20 experts in the world with the technical and legal skills of the Special Pool of Expert of EDPB. I work with people who litterally write and negociate the GDPR with UE institutions.
    I'm the plaintif of a 2.5 millions € fine for one of the biggest french company, which was also "pretty sure we are right, and our lawyers agree". And then one other 270k€ fine for another company, which also "have many lawyers confirming our position". They all lost at the end.

    Usually, when I say something about the GDPR, I'm not wrong… Really.

    @diemol
    Copy link
    Member

    diemol commented Feb 21, 2025

    @aeris, assuming you are coming in good faith and with a collaborative spirit, how would you help a non-profit open-source project like Selenium become aware of its usage across the community in a GDPR-compliant way?

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    @diemol > exactly how I say on the first issue : telemetry MUST be opt-in and not opt-out. This is just pure GDPR and ePrivacy application. And in non profit open-source project, we are not supposed to have to fight for such basic privacy feature.

    @diemol
    Copy link
    Member

    diemol commented Feb 21, 2025

    @aeris how would you do it opt-in in a simple way? Have you used Selenium? What would be the best way?

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    And in general, and worse since Trump election, you CAN’T rely on US providers because US have non compatible constitution with GDPR (see Schrems I & II CJUE case, FISA 702, Cloud Act, and more recently the PCLOB dismiss by Trump, with a formal letter from LIBE to ComUE about DPF invalidation)

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    @diemol > the way this PR add a warning at first use seems good, but must be opt-in and not opt-out.

    @diemol
    Copy link
    Member

    diemol commented Feb 21, 2025

    @aeris why do you mention US providers? Plausible has guaranteed us that they host everything in the EU.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    why do you mention US providers? Plausible has guaranteed us that they host everything in the EU.

    Classic providers position, but totally wrong. Data location are NOT relevant from FISA 702 point of view. If a US agency can enforce a gag order on Plausible to exfiltrate data from a EU point, it's enough to not being able to use this provider.

    @diemol
    Copy link
    Member

    diemol commented Feb 21, 2025

    @diemol > the way this PR add a warning at first use seems good, but must be opt-in and not opt-out.

    Yeah, but how do you recommend doing it in a simple way for the user? We would like to know how much the tool is used. This data is relevant to show how current Selenium is compared against other for-profit tools.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    For example, because of those US law, Microsoft is not able to ensure data localization
    https://www.computerweekly.com/news/366589152/Microsoft-admits-no-guarantee-of-sovereignty-for-UK-policing-data
    In case of gag order, even on data located on EU, they will be forced to send the data to US
    If Plausible guaranteed you such thing, it's just lie. The US constitution just forbid then to give such insurance at the time they use a US entity datacenter for example.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    Yeah, but how do you recommend doing it in a simple way for the user? We would like to know how much the tool is used. This data is relevant to show how current Selenium is compared against other for-profit tools.

    I take the trouble the other way: why a opensource non-profit project would ever need such audience stat? Are we not supposed to be better than for-profit tool and don't want to track user just for metrics?
    Is there any really useful information extracted from such metrics?

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    If Plausible guaranteed you such thing, it's just lie. The US constitution just forbid then to give such insurance at the time they use a US entity datacenter for example.

    After checking Plausible privacy policy, they say they use only EU provider. Would have to check why I notice Bandcamp on the first issue 🤔

    But they also mention hCaptcha, already striked for GDPR violation (one of my case with french DPA, but not public at this time), and Mailchimp (https://gdprhub.eu/index.php?title=BayLfD_(Bavaria)_-_LDA-1085.1-12159/20-IDV)

    @GuillaumeRossolini
    Copy link

    Yeah, but how do you recommend doing it in a simple way for the user? We would like to know how much the tool is used. This data is relevant to show how current Selenium is compared against other for-profit tools.

    If I may interject here, this is the core issue at hand. The project doesn't need most of your user base reporting anything, you just need a bunch of people who know and like your product, who trust you and who willingly share their anonymized usage data with you.

    Sure you'll see a dramatic drop in entries, but they'll also increase in quality. And you'll be compliant.

    @titusfortner
    Copy link
    Member Author

    @GuillaumeRossolini I put our reasons for needing opt-in here:
    SeleniumHQ/seleniumhq.github.io#2187

    There is no way to approximate a representative sample population with the way users would have for opting in. The very nature of the opting-in mechanism varying significantly by implementation prevents being able to compare information about those implementations.

    There is legitimate interest in knowing whether anyone is still testing on Internet Explorer so we know if we should sunset that driver, or if it is worth dropping JavaScript or Ruby bindings rather than continuing to maintain it with the dwindling user-base. And importantly for an open source project, we need to be able to demonstrate that we're still growing as a project even if other tools are gaining market share.

    @titusfortner
    Copy link
    Member Author

    My frustration here is that if your broad interpretation of the statute were accurate, then there would be a huge number of much more privileged institutions and organizations in much more egregious violation. So throwing your weight around in github issues on open source projects feels like you're mostly interested in trolling and bullying volunteers who are legitimately trying to make things better for their users.

    If things are as clear cut as you believe, then go work with Plausible so that everyone using their tool can better protect their users. Reach out to the larger organizations who are doing what we are doing and have the time to engage you the way you want to be engaged so there is more visibility on the boundaries and clear precedence for behavior.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    If things are as clear cut as you believe, then go work with Plausible so that everyone using their tool can better protect their users.

    Or perhaps… Plausible by itself can't be compliant and have no way to be legally usable? 🤷

    @GuillaumeRossolini
    Copy link

    Look I'm make it easy: your views on growth at all costs, on not respecting your users' privacy, on harvesting metrics (including IP addresses) on a system you don't control, and generally on laws will drive users away.
    I'm not interested in a debate any more than you are.

    @titusfortner
    Copy link
    Member Author

    Or perhaps… Plausible by itself can't be compliant and have no way to be legally usable?

    Right, but if you prove that, then everyone who thinks they are covered by plausible's terms will know that isn't the case. Ideally you can help them find a way to be better so that everyone wins.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    Or perhaps… Plausible by itself can't be compliant and have no way to be legally usable? 🤷

    To avoid any misunderstanding: it's not Plausible per se which is unlawful, but just the fact there is no lawful way to use it.
    Having a "compliant" tool is just one of the many steps needed to achieve compliance, here only the article 28 compliance (using only compliant subcontractor, tools or providers).

    You also still need TOO:

    • article 5:
      • specified, explicit and legitimate purpose
      • adequate, relevant and limited to necessary data
    • article 6: lawful legal basis, here only consent would be possible, legitimate interest quite hard in practice (mostly revoked by DPA)
    • article 25: privacy by design
    • article 44: international export
    • article 12-22: right to access, oppose, rectify, delete, etc

    All of those conditions are CUMULATIVES, having a single one missing leads to unlawful processing

    Plausible barely achieve article 28, all others are very very hard to justify and worse for a non-profit project

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    Ideally you can help them find a way to be better so that everyone wins.

    The way is very simple: do you REALLY need such metrics? If not, just don't process data.
    In practice, in all cases I have to act, it's pretty quickly obvious there is no real need about such telemetry, but just "everybody do that, so are we".

    @titusfortner
    Copy link
    Member Author

    @GuillaumeRossolini your response is why this feels like trolling. You are exaggerating what we are actually doing to justify your position. If you really think the legislation's scope is as broad as you claim, why do you need to characterize what we're doing as negatively as you do, and ascribe motivations to us that we don't have?

    @aeris the standard isn't "legitimate need" but "legitimate interest" and the fact that you want to apply the former standard makes the rest of our conversation feel disingenuous.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    @titusfortner I bet you never read a single guideline about legitimate interest or a single DPA decision about legitimate interest revocation.

    "Legitimate interest" lawful legal basis is NOT just having a legitimate interest. This is just the first step of the triple test. You ALSO need real need and proportionality. "Legitimate interest" is one of the most dangerous and complex legal basis of the GDPR and most of the "legitimate interest" claim in front of a DPA has been revoked and placed under consent instead. Usually with a fine to have infringe the GDPR.

    @GuillaumeRossolini
    Copy link

    I'm not ascribing motivations to you, because I don't know you. Nor do I need to.

    If your project is gathering user data without their consent (this is an established fact regardless of your intent with said data), 1- it's against the law and 2- I'll stop using it

    @diemol
    Copy link
    Member

    diemol commented Feb 21, 2025

    With that information we are able to see different things:

    • Which programming languages are more used in order to focus on feature parity across all of them
    • How quickly people upgrade from older to newer versions which helps us to deprecate and remove code when needed
    • What are the most used browsers, which helps to decide if we add a feature for a specific browser or not
    • What is the usage across operating systems, which forces us to test Selenium properly in a given OS distribution or not.
    • Show that Selenium has wide adoption when compared with other tools like Playwright or Cypress
    • Use that information to convince different companies who depend on the project (Sauce Labs, BrowserStack, LambdaTest, etc) to invest more in it by employing people who can work on it and maintain it for the community.

    These are just some of the reasons why we want to do this. But there are more.

    @GuillaumeRossolini
    Copy link

    But I can give you one trolling comment: does this data tell you how many users were driven out by this practice?

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    https://www.edpb.europa.eu/system/files/2024-10/edpb_guidelines_202401_legitimateinterest_en.pdf
    Here are guidelines about "legitimate interest" from EDPB.

    As stated by EDPB, a processing CAN'T be based on IL if there is a less intrusive way to achieve the same result.
    image

    Can you achieve the same result with regular user studies, for example twice a year? Yes? So Plausible CAN'T be legitimate.

    @GuillaumeRossolini
    Copy link

    @diemol all of this would be just as useful with consent, and more meaningful

    @diemol
    Copy link
    Member

    diemol commented Feb 21, 2025

    We have tried by counting downloads and doing surveys but we have not been able to achieve that.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    @diemol > For which reasons? Because people don't want to reply? And so you just want to force them to feed data?

    @diemol
    Copy link
    Member

    diemol commented Feb 21, 2025

    Because each package manager tracks information differently and not using the same time frames. Also because downloading a tool does not mean it is being used.

    I wouldn't say we are forcing them because we have been open about this in different releases, documentation, and posts, showing how to avoid sharing the information.

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    showing how to avoid sharing the information

    Avoid sharing the information is not the only trouble.

    You also have:

    ePrivacy 5(3):
    24. Terminal equipment of users of electronic communications networks and any information stored on
    such equipment are part of the private sphere of the users requiring protection under the European
    Convention for the Protection of Human Rights and Fundamental Freedoms’. Consequently, it is also
    protected by Article 7 of the EU Charter of Fundamental Rights

    GDPR article 12 + ePrivacy 5(3) + GDPR article 21(5):
    5. In the context of the use of information society services, and notwithstanding Directive 2002/58/EC, the data subject may exercise his or her right to object by automated means using technical specifications.

    You have to inform at the first time about the telemetry, with full description of the processing on a clear and comprehensive manner. But ALSO provide a way at this first time to refuse the processing

    GDPR article 15 to 22: right to access, oppose, rectify, suppress
    Even supposing your purpose really lawful, you MUST provide a way to delete already sent data, a way to send back on request to the user the sent data, to freeze on request the already sent data…

    Once again, having to fight for GDPR compliance is something I expect to have to do against a GAFAM/for-profit organization, with lawyers nitpicking about any word, with years if not decades of legal action. Definitively not with a non-profit org supposed to have nothing in common but just currently arguing against article 7 of Fundamental Rights…

    Each time it very incredible to have non-profit "privacy friendly" project not even able to have a single clue on one of the most important law of the century about privacy…

    @Br31zh
    Copy link

    Br31zh commented Feb 21, 2025

    There is legitimate interest in knowing whether anyone is still testing on Internet Explorer so we know if we should sunset that driver, or if it is worth dropping JavaScript or Ruby bindings rather than continuing to maintain it with the dwindling user-base.

    If no-one voluntarily maintains it (e.g. because they need it), call on contributors to take care of it. Then put a warning that it could be deprecated for lack of maintainers, then disable it by default with the possibility of reactivating it explicitly (with the deprecation warning when it’s enabled), and finally deletion if nobody reacts.

    It's fairly unlikely that the proportion of users who absolutely need it and the proportion of users who are willing to maintain it (or pay someone to do so) won't overlap.

    And importantly for an open source project, we need to be able to demonstrate that we're still growing as a project even if other tools are gaining market share.

    I disagree. For me, the "look, lots of people are using our tool" argument seems less relevant than having these "lots of people" actually recommending you by themselves. Especially as there's nothing to prevent you from cheating about it, and even if you’re not, there's no guarantee that it's reliable either.


    I’ll add a reason why you might want to concentrate on a modest open-source project rather than a giant, without being trolling: you might want to use your tool rather than the giant’s one.

    For example, if we're an organisation that's also going to process other people's data, we have to be compliant ourself. If neither you nor the commercial tool is compliant, we have no solution. Then we ask to the one we’d prefer to use to be compliant, so we can use it.

    Otherwise we'll complain to the giant, and if it becomes compliant before you do, we'll use it instead... Today, the vast majority of projects, commercial or no, are illegal under the GPDR. Admittedly, some have greater breaches than others, but the question is not who is breaching the law the most, but who is respecting it. Being the only one compliant can be a very good selling point…

    @aeris
    Copy link

    aeris commented Feb 21, 2025

    And you can find this kind of comment about selenium
    https://www.reddit.com/r/Python/comments/1dcuv0y/til_that_selenium_has_opt_out_telemetry_what/

    I didn't expect to see this kind of dark patterns telemetry in python packages - so yeah. Has anyone else seen this? Is this some sort of recent trend?

    It is a huge red flag. Projects should not do this.

    God damn, reading that is a super red flag. They really don't care, just decided they wanted it and said "screw you".

    Thank you for bringing this to my notice. We usually take infrastructure level code for granted and never bother looking much into its behavior, especially so if it's a popular package like selenium. But this incident shows how crucial software auditing is, even auditing of open source software.

    Just nothing distinguish your project from a commercial one…

    @diemol
    Copy link
    Member

    diemol commented Feb 22, 2025

    I am ready to give up, not because of the reasoning, I believe at some point it is possible to collaborate and get to an agreement. But rather the tone used against us, every single message feels like a threat to us and I just don't want to have that in my inbox every day.

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    6 participants