Skip to content

[grid] Improve SlotMatcher for Node relay to Appium server with hybrid browser and native app #15537

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

Open
wants to merge 9 commits into
base: trunk
Choose a base branch
from

Conversation

VietND96
Copy link
Member

@VietND96 VietND96 commented Mar 31, 2025

User description

Thanks for contributing to Selenium!
A PR well described will help maintainers to quickly review and merge it

Before submitting your PR, please check our contributing guidelines.
Avoid large PRs, help reviewers by making them as simple and short as possible.

Motivation and Context

The fix in PR #14247 looks like not work.
In this fix, try to make logic in DefaultSlotMatcher and RelaySessionFactory to be same. Since before coming to RelaySessionFactory.test(), a basic match of W3C caps has already been done (in DefaultSlotMatcher).

Besides unit tests, here is the end2end tests

Relay Node config

[node]
session-timeout = 300
override-max-sessions = true
detect-drivers = false
drain-after-session-count = 0

[relay]
url = "http://localhost:4723"
status-endpoint = "/status"
protocol-version = "HTTP/1.1"
configs = [
    '1', '{"platformName":"Android", "appium:platformVersion":"14", "appium:automationName": "uiautomator2", "myApp:version":"beta", "myApp:publish":"public"}',
    '1', '{"browserName":"chrome", "platformName":"Android", "appium:platformVersion":"15", "appium:automationName": "uiautomator2", "myApp:version":"beta", "myApp:publish":"public"}'
]
  • 1 slot capabilities can take request for native app only (appium:platformVersion 14)
  • 1 slot capabilities can take both request for hybrid browser and native app (appium:platformVersion 15)

This code for native app can be reached 2 slots

options = ChromeOptions()
options.set_capability("platformName", "Android")
platform_version = random.choice(["14", "15"])
options.set_capability("appium:platformVersion", platform_version)
options.set_capability("appium:automationName", "uiautomator2")
options.set_capability("appium:app", "https://github.com/saucelabs/my-demo-app-android/releases/download/2.2.0/mda-2.2.0-25.apk")
options.set_capability("appium:appPackage", "com.saucelabs.mydemoapp.android")
options.set_capability("appium:appWaitActivity", "*")
driver = webdriver.Remote(
        command_executor='http://localhost:4444',
        options=options
    )

And this code for hybrid browser session, which can be reached 1st slot (platformVersion 14), where browserName is set in Node stereotype.

options = ChromeOptions()
options.set_capability("platformName", "Android")
options.set_capability("appium:platformVersion", "15")
options.set_capability("appium:automationName", "uiautomator2")
driver = webdriver.Remote(
        command_executor='http://localhost:4444',
        options=options
    )
driver.get('http://google.com')
print(driver.title)

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist

  • I have read the contributing document.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

PR Type

Bug fix, Tests


Description

  • Enhanced DefaultSlotMatcher to handle hybrid browser and native app sessions.

  • Added logic to filter conflicting capabilities in RelaySessionFactory.

  • Introduced new test cases for relay node matching and capability filtering.

  • Updated Bazel build configuration to include Mockito dependency.


Changes walkthrough 📝

Relevant files
Enhancement
DefaultSlotMatcher.java
Enhanced SlotMatcher for Appium and hybrid session handling

java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java

  • Added specific relay capabilities for Appium server.
  • Refactored matching logic for browser, platform, and version.
  • Introduced specificRelayCapabilitiesAppMatch for Appium-related
    capabilities.
  • Improved method naming and modularized matching logic.
  • +57/-24 
    RelaySessionFactory.java
    Added capability filtering in RelaySessionFactory               

    java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java

  • Added filterRelayCapabilities to handle conflicting capabilities.
  • Integrated capability filtering into session creation logic.
  • Removed redundant capability filtering logic.
  • +16/-10 
    Tests
    DefaultSlotMatcherTest.java
    Added tests for DefaultSlotMatcher enhancements                   

    java/test/org/openqa/selenium/grid/data/DefaultSlotMatcherTest.java

  • Added tests for Appium-specific relay capabilities matching.
  • Tested relay node matching with and without browserName.
  • Validated non-W3C compliant platform version handling.
  • +123/-0 
    RelaySessionFactoryTest.java
    Added tests for RelaySessionFactory capability filtering 

    java/test/org/openqa/selenium/grid/node/relay/RelaySessionFactoryTest.java

  • Added unit tests for filterRelayCapabilities method.
  • Validated browserName removal for Appium-related capabilities.
  • +72/-0   
    Configuration changes
    BUILD.bazel
    Updated Bazel build for Mockito dependency                             

    java/test/org/openqa/selenium/grid/node/relay/BUILD.bazel

    • Added Mockito dependency for RelaySessionFactory tests.
    +1/-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.
  • …d browser and native app
    
    Signed-off-by: Viet Nguyen Duc <[email protected]>
    Copy link
    Contributor

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

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

    Logic Consistency

    The browserNameMatch and browserVersionMatch methods both call specificRelayCapabilitiesAppMatch, but they handle the result differently. This could lead to inconsistent matching behavior between browser name and version.

    private boolean browserNameMatch(Capabilities stereotype, Capabilities capabilities) {
      return (capabilities.getBrowserName() == null || capabilities.getBrowserName().isEmpty())
          || Objects.equals(stereotype.getBrowserName(), capabilities.getBrowserName())
          || specificRelayCapabilitiesAppMatch(capabilities);
    }
    
    private boolean browserVersionMatch(String stereotype, String capabilities) {
      return new SemanticVersionComparator().compare(stereotype, capabilities) == 0;
    }
    
    private boolean browserVersionMatch(Capabilities stereotype, Capabilities capabilities) {
      return (capabilities.getBrowserVersion() == null
              || capabilities.getBrowserVersion().isEmpty()
              || Objects.equals(capabilities.getBrowserVersion(), "stable"))
          || browserVersionMatch(stereotype.getBrowserVersion(), capabilities.getBrowserVersion())
          || specificRelayCapabilitiesAppMatch(capabilities);
    }
    Capability Merging

    The old code merged capabilities with filtered stereotype, but the new code only filters capabilities without merging. This might cause different behavior if the stereotype had additional capabilities that should be included.

    public Capabilities filterRelayCapabilities(Capabilities capabilities) {
      /*
      Remove browserName capability if 'appium:app' (or similar based on driver) is present as it breaks appium tests when app is provided
      they are mutually exclusive
      */
      if (specificRelayCapabilitiesAppMatch(capabilities)) {
        MutableCapabilities filteredStereotype = new MutableCapabilities(capabilities);
        filteredStereotype.setCapability(CapabilityType.BROWSER_NAME, (String) null);
        return filteredStereotype;
      }
      return capabilities;
    }
    
    @Override
    public Either<WebDriverException, ActiveSession> apply(CreateSessionRequest sessionRequest) {
      Capabilities capabilities = sessionRequest.getDesiredCapabilities();
      capabilities = filterRelayCapabilities(capabilities);

    Copy link

    @Copilot Copilot AI left a comment

    Choose a reason for hiding this comment

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

    Pull Request Overview

    This PR improves the handling of relay sessions for Appium by refining capability matching and filtering logic in both DefaultSlotMatcher and RelaySessionFactory. Key changes include:

    • Enhancements to DefaultSlotMatcher to incorporate Appium-specific capabilities.
    • Integration of capability filtering in RelaySessionFactory to remove conflicting browserName settings.
    • Addition of comprehensive test cases to validate both new matching and filtering behavior, along with an update to the Bazel build configuration for Mockito.

    Reviewed Changes

    Copilot reviewed 4 out of 5 changed files in this pull request and generated no comments.

    Show a summary per file
    File Description
    java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java Enhanced matching logic for Appium-specific relay capabilities
    java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java Added filtering logic to remove conflicting browserName settings
    java/test/org/openqa/selenium/grid/node/relay/RelaySessionFactoryTest.java Added unit tests for capability filtering behavior
    java/test/org/openqa/selenium/grid/data/DefaultSlotMatcherTest.java Added unit tests for new slot matching scenarios
    java/test/org/openqa/selenium/grid/node/relay/BUILD.bazel Updated build configuration to include the Mockito dependency
    Files not reviewed (1)
    • java/test/org/openqa/selenium/grid/node/relay/BUILD.bazel: Language not supported
    Comments suppressed due to low confidence (1)

    java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java:178

    • [nitpick] There are two overloaded methods named 'browserVersionMatch' (one accepting strings and one accepting Capabilities). Consider renaming one of them for better clarity of intent.
    private boolean browserVersionMatch(String stereotype, String capabilities) {
    

    Copy link
    Contributor

    qodo-merge-pro bot commented Mar 31, 2025

    PR Code Suggestions ✨

    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Impact
    Possible issue
    Fix incorrect browserName matching
    Suggestion Impact:The commit completely restructured the matching logic, including the browserNameMatch function. The browserNameMatch function was inlined directly into the match method (lines 18-21), and while the implementation doesn't exactly match the suggestion, it addresses the same issue by restructuring how browser name matching works.

    code diff:

    +    boolean browserNameMatch =
    +        (capabilities.getBrowserName() == null || capabilities.getBrowserName().isEmpty())
    +            || Objects.equals(stereotype.getBrowserName(), capabilities.getBrowserName())
    +            || specificRelayCapabilitiesAppMatch(capabilities);

    The current implementation of browserNameMatch has a logical issue. When
    specificRelayCapabilitiesAppMatch returns true, it will always match regardless
    of the stereotype's browserName, which could lead to incorrect matching. The
    method should consider the stereotype's browserName value when making this
    decision.

    java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java [172-176]

     private boolean browserNameMatch(Capabilities stereotype, Capabilities capabilities) {
       return (capabilities.getBrowserName() == null || capabilities.getBrowserName().isEmpty())
           || Objects.equals(stereotype.getBrowserName(), capabilities.getBrowserName())
    -      || specificRelayCapabilitiesAppMatch(capabilities);
    +      || (specificRelayCapabilitiesAppMatch(capabilities) && 
    +          (stereotype.getBrowserName() == null || stereotype.getBrowserName().isEmpty()));
     }

    [Suggestion has been applied]

    Suggestion importance[1-10]: 9

    __

    Why: The current implementation has a critical logical flaw that could lead to incorrect matching. It unconditionally returns true when specificRelayCapabilitiesAppMatch is true, regardless of stereotype's browserName. The fix ensures proper matching by considering the stereotype's browserName value, preventing potential mismatches in Appium sessions.

    High
    Fix incorrect browserVersion matching
    Suggestion Impact:The commit completely refactored the matching logic, including the browserVersionMatch method. The browserVersionMatch method was inlined directly into the matches method (lines 22-27), and it still includes the specificRelayCapabilitiesAppMatch condition without the suggested check for stereotype.getBrowserVersion(). However, the overall refactoring addresses the matching logic differently.

    code diff:

    +    boolean browserVersionMatch =
    +        (capabilities.getBrowserVersion() == null
    +                || capabilities.getBrowserVersion().isEmpty()
    +                || Objects.equals(capabilities.getBrowserVersion(), "stable"))
    +            || browserVersionMatch(stereotype.getBrowserVersion(), capabilities.getBrowserVersion())
    +            || specificRelayCapabilitiesAppMatch(capabilities);

    Similar to the browserNameMatch issue, the browserVersionMatch method
    unconditionally returns true when specificRelayCapabilitiesAppMatch is true,
    regardless of the stereotype's browserVersion. This could lead to incorrect
    matching when the stereotype has a specific browserVersion requirement.

    java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java [182-188]

     private boolean browserVersionMatch(Capabilities stereotype, Capabilities capabilities) {
       return (capabilities.getBrowserVersion() == null
               || capabilities.getBrowserVersion().isEmpty()
               || Objects.equals(capabilities.getBrowserVersion(), "stable"))
           || browserVersionMatch(stereotype.getBrowserVersion(), capabilities.getBrowserVersion())
    -      || specificRelayCapabilitiesAppMatch(capabilities);
    +      || (specificRelayCapabilitiesAppMatch(capabilities) && 
    +          (stereotype.getBrowserVersion() == null || stereotype.getBrowserVersion().isEmpty()));
     }

    [Suggestion has been applied]

    Suggestion importance[1-10]: 9

    __

    Why: Similar to the first issue, this method has a critical logical flaw that could lead to incorrect matching. It unconditionally returns true when specificRelayCapabilitiesAppMatch is true, regardless of stereotype's browserVersion. The fix ensures proper matching by considering the stereotype's browserVersion value.

    High
    Learned
    best practice
    Add null check for stereotype browser name before comparison to prevent potential null reference issues

    The browserNameMatch method doesn't properly handle the case where
    stereotype.getBrowserName() might be null. If stereotype.getBrowserName() is
    null but capabilities.getBrowserName() is not null or empty, the
    Objects.equals() comparison could lead to unexpected behavior. Use a more
    defensive approach by checking if the stereotype's browser name is null before
    comparing.

    java/src/org/openqa/selenium/grid/data/DefaultSlotMatcher.java [172-176]

     private boolean browserNameMatch(Capabilities stereotype, Capabilities capabilities) {
       return (capabilities.getBrowserName() == null || capabilities.getBrowserName().isEmpty())
    -      || Objects.equals(stereotype.getBrowserName(), capabilities.getBrowserName())
    +      || (stereotype.getBrowserName() != null && Objects.equals(stereotype.getBrowserName(), capabilities.getBrowserName()))
           || specificRelayCapabilitiesAppMatch(capabilities);
     }
    • Apply this suggestion
    Suggestion importance[1-10]: 6
    Low
    General
    Improve variable naming clarity

    The method creates a new MutableCapabilities object named filteredStereotype
    which is confusing since it's not actually related to a stereotype but rather a
    filtered version of the input capabilities. This naming could lead to confusion
    and maintenance issues.

    java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java [143-154]

     public Capabilities filterRelayCapabilities(Capabilities capabilities) {
       /*
       Remove browserName capability if 'appium:app' (or similar based on driver) is present as it breaks appium tests when app is provided
       they are mutually exclusive
       */
       if (specificRelayCapabilitiesAppMatch(capabilities)) {
    -    MutableCapabilities filteredStereotype = new MutableCapabilities(capabilities);
    -    filteredStereotype.setCapability(CapabilityType.BROWSER_NAME, (String) null);
    -    return filteredStereotype;
    +    MutableCapabilities filteredCapabilities = new MutableCapabilities(capabilities);
    +    filteredCapabilities.setCapability(CapabilityType.BROWSER_NAME, (String) null);
    +    return filteredCapabilities;
       }
       return capabilities;
     }
    • Apply this suggestion
    Suggestion importance[1-10]: 4

    __

    Why: The variable name 'filteredStereotype' is misleading as it's actually a filtered version of the input capabilities, not a stereotype. Renaming to 'filteredCapabilities' improves code clarity and maintainability, though this is a relatively minor improvement.

    Low
    • Update

    Copy link
    Contributor

    qodo-merge-pro bot commented Mar 31, 2025

    CI Feedback 🧐

    (Feedback updated until commit 22b15db)

    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: shouldScrollFromViewportByGivenAmount

    Failure summary:

    The action failed because two tests failed:

    1. shouldScrollFromViewportByGivenAmount() in org.openqa.selenium.bidi.input.DefaultWheelTest - This
    test failed with an assertion error where it expected true but got false (line 2692).

    2. scrolls by given amount in Selenium::WebDriver::ActionBuilder#scroll_by - This test failed
    because the footer element was not in the viewport as expected. The test expected
    in_viewport?(footer) to be true but it was false (lines 2902-2906).

    Both failures appear to be related to scrolling functionality in the WebDriver implementation,
    specifically with the wheel/scrolling actions not working as expected.

    Relevant error logs:
    1:  ##[group]Operating System
    2:  Ubuntu
    ...
    
    945:  Package 'php-sql-formatter' is not installed, so not removed
    946:  Package 'php8.3-ssh2' is not installed, so not removed
    947:  Package 'php-ssh2-all-dev' is not installed, so not removed
    948:  Package 'php8.3-stomp' is not installed, so not removed
    949:  Package 'php-stomp-all-dev' is not installed, so not removed
    950:  Package 'php-swiftmailer' is not installed, so not removed
    951:  Package 'php-symfony' is not installed, so not removed
    952:  Package 'php-symfony-asset' is not installed, so not removed
    953:  Package 'php-symfony-asset-mapper' is not installed, so not removed
    954:  Package 'php-symfony-browser-kit' is not installed, so not removed
    955:  Package 'php-symfony-clock' is not installed, so not removed
    956:  Package 'php-symfony-debug-bundle' is not installed, so not removed
    957:  Package 'php-symfony-doctrine-bridge' is not installed, so not removed
    958:  Package 'php-symfony-dom-crawler' is not installed, so not removed
    959:  Package 'php-symfony-dotenv' is not installed, so not removed
    960:  Package 'php-symfony-error-handler' is not installed, so not removed
    961:  Package 'php-symfony-event-dispatcher' is not installed, so not removed
    ...
    
    1139:  Package 'php-twig-html-extra' is not installed, so not removed
    1140:  Package 'php-twig-i18n-extension' is not installed, so not removed
    1141:  Package 'php-twig-inky-extra' is not installed, so not removed
    1142:  Package 'php-twig-intl-extra' is not installed, so not removed
    1143:  Package 'php-twig-markdown-extra' is not installed, so not removed
    1144:  Package 'php-twig-string-extra' is not installed, so not removed
    1145:  Package 'php8.3-uopz' is not installed, so not removed
    1146:  Package 'php-uopz-all-dev' is not installed, so not removed
    1147:  Package 'php8.3-uploadprogress' is not installed, so not removed
    1148:  Package 'php-uploadprogress-all-dev' is not installed, so not removed
    1149:  Package 'php8.3-uuid' is not installed, so not removed
    1150:  Package 'php-uuid-all-dev' is not installed, so not removed
    1151:  Package 'php-validate' is not installed, so not removed
    1152:  Package 'php-vlucas-phpdotenv' is not installed, so not removed
    1153:  Package 'php-voku-portable-ascii' is not installed, so not removed
    1154:  Package 'php-wmerrors' is not installed, so not removed
    1155:  Package 'php-xdebug-all-dev' is not installed, so not removed
    ...
    
    1775:  (17:52:05) �[32mAnalyzing:�[0m 2272 targets (1138 packages loaded, 23333 targets configured)
    1776:  (17:52:10) �[32mAnalyzing:�[0m 2272 targets (1235 packages loaded, 24216 targets configured)
    1777:  (17:52:15) �[32mAnalyzing:�[0m 2272 targets (1378 packages loaded, 32110 targets configured)
    1778:  �[32m[606 / 996]�[0m checking cached actions
    1779:  (17:52:20) �[32mAnalyzing:�[0m 2272 targets (1423 packages loaded, 34119 targets configured)
    1780:  �[32m[613 / 996]�[0m checking cached actions
    1781:  (17:52:26) �[32mAnalyzing:�[0m 2272 targets (1431 packages loaded, 34562 targets configured)
    1782:  �[32m[613 / 996]�[0m checking cached actions
    1783:  (17:52:31) �[32mAnalyzing:�[0m 2272 targets (1439 packages loaded, 34794 targets configured)
    1784:  �[32m[613 / 996]�[0m checking cached actions
    1785:  (17:52:36) �[32mAnalyzing:�[0m 2272 targets (1508 packages loaded, 39698 targets configured)
    1786:  �[32m[993 / 996]�[0m checking cached actions
    1787:  (17:52:42) �[32mAnalyzing:�[0m 2272 targets (1572 packages loaded, 50783 targets configured)
    1788:  �[32m[995 / 997]�[0m 1 / 3 tests;�[0m checking cached actions
    1789:  (17:52:47) �[32mAnalyzing:�[0m 2272 targets (1638 packages loaded, 60147 targets configured)
    1790:  �[32m[1,324 / 1,557]�[0m 3 / 19 tests;�[0m [Prepa] Running Cargo build script thiserror ... (48 actions, 0 running)
    1791:  (17:52:48) �[32mINFO: �[0mFrom Running Cargo build script bzip2-sys:
    ...
    
    2106:  from bazel-out/k8-opt-exec-ST-a934f86a68ba/bin/external/protobuf+/src/google/protobuf/compiler/kotlin/_virtual_includes/kotlin_internal/google/protobuf/compiler/kotlin/message.h:12,
    2107:  from bazel-out/k8-opt-exec-ST-a934f86a68ba/bin/external/protobuf+/src/google/protobuf/compiler/kotlin/_virtual_includes/kotlin_internal/google/protobuf/compiler/kotlin/file.h:18,
    2108:  from external/protobuf+/src/google/protobuf/compiler/kotlin/file.cc:8:
    2109:  bazel-out/k8-opt-exec-ST-a934f86a68ba/bin/external/protobuf+/src/google/protobuf/io/_virtual_includes/printer/google/protobuf/io/printer.h: In instantiation of ‘void google::protobuf::io::AnnotationProtoCollector<AnnotationProto>::AddAnnotation(size_t, size_t, const string&, const std::vector<int>&, absl::lts_20240116::optional<google::protobuf::io::AnnotationCollector::Semantic>) [with AnnotationProto = google::protobuf::GeneratedCodeInfo; size_t = long unsigned int; std::string = std::__cxx11::basic_string<char>]’:
    2110:  bazel-out/k8-opt-exec-ST-a934f86a68ba/bin/external/protobuf+/src/google/protobuf/io/_virtual_includes/printer/google/protobuf/io/printer.h:123:8:   required from here
    2111:  bazel-out/k8-opt-exec-ST-a934f86a68ba/bin/external/protobuf+/src/google/protobuf/io/_virtual_includes/printer/google/protobuf/io/printer.h:127:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
    2112:  127 |     for (int i = 0; i < path.size(); ++i) {
    2113:  |                     ~~^~~~~~~~~~~~~
    2114:  (17:52:57) �[32mAnalyzing:�[0m 2272 targets (1652 packages loaded, 61676 targets configured)
    2115:  �[32m[3,756 / 4,102]�[0m 27 / 442 tests;�[0m Generating v135 DevTools Protocol bindings for .NET; 0s remote, remote-cache ... (41 actions, 21 running)
    2116:  (17:52:59) �[32mINFO: �[0mFrom Building external/protobuf+/java/core/libcore.jar (43 source files, 1 source jar) [for tool]:
    2117:  external/protobuf+/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java:28: warning: [dep-ann] deprecated item is not annotated with @Deprecated
    2118:  public class RepeatedFieldBuilderV3<
    2119:  ^
    2120:  (17:53:01) �[32mINFO: �[0mFrom Building java/src/org/openqa/selenium/remote/libapi-class.jar (70 source files):
    2121:  java/src/org/openqa/selenium/remote/ErrorHandler.java:46: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2122:  private final ErrorCodes errorCodes;
    2123:  ^
    2124:  java/src/org/openqa/selenium/remote/ErrorHandler.java:60: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2125:  this.errorCodes = new ErrorCodes();
    2126:  ^
    2127:  java/src/org/openqa/selenium/remote/ErrorHandler.java:68: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2128:  public ErrorHandler(ErrorCodes codes, boolean includeServerErrors) {
    2129:  ^
    2130:  java/src/org/openqa/selenium/remote/Response.java:97: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2131:  ErrorCodes errorCodes = new ErrorCodes();
    2132:  ^
    2133:  java/src/org/openqa/selenium/remote/Response.java:97: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2134:  ErrorCodes errorCodes = new ErrorCodes();
    2135:  ^
    2136:  java/src/org/openqa/selenium/remote/ProtocolHandshake.java:181: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2137:  response.setStatus(ErrorCodes.SUCCESS);
    2138:  ^
    2139:  java/src/org/openqa/selenium/remote/ProtocolHandshake.java:182: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2140:  response.setState(ErrorCodes.SUCCESS_STRING);
    2141:  ^
    2142:  java/src/org/openqa/selenium/remote/W3CHandshakeResponse.java:53: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2143:  new ErrorCodes().toStatus((String) rawError, Optional.of(tuple.getStatusCode())));
    2144:  ^
    2145:  java/src/org/openqa/selenium/remote/W3CHandshakeResponse.java:56: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2146:  new ErrorCodes().getExceptionType((String) rawError);
    2147:  ^
    2148:  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
    2149:  private final ErrorCodes errorCodes = new ErrorCodes();
    2150:  ^
    2151:  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
    2152:  private final ErrorCodes errorCodes = new ErrorCodes();
    2153:  ^
    2154:  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
    2155:  int status = response.getStatus() == ErrorCodes.SUCCESS ? HTTP_OK : HTTP_INTERNAL_ERROR;
    2156:  ^
    2157:  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
    2158:  response.setStatus(ErrorCodes.UNKNOWN_COMMAND);
    2159:  ^
    2160:  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
    2161:  response.setStatus(ErrorCodes.UNHANDLED_ERROR);
    2162:  ^
    2163:  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
    2164:  response.setStatus(ErrorCodes.SUCCESS);
    2165:  ^
    2166:  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
    2167:  response.setState(errorCodes.toState(ErrorCodes.SUCCESS));
    2168:  ^
    2169:  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
    2170:  response.setState(errorCodes.toState(ErrorCodes.SUCCESS));
    2171:  ^
    2172:  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
    2173:  private final ErrorCodes errorCodes = new ErrorCodes();
    2174:  ^
    2175:  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
    2176:  private final ErrorCodes errorCodes = new ErrorCodes();
    2177:  ^
    2178:  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
    2179:  response.setStatus(ErrorCodes.UNKNOWN_COMMAND);
    2180:  ^
    2181:  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
    2182:  response.setStatus(ErrorCodes.UNHANDLED_ERROR);
    2183:  ^
    2184:  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
    2185:  response.setStatus(ErrorCodes.SUCCESS);
    2186:  ^
    ...
    
    2251:  (17:53:42) �[32mAnalyzing:�[0m 2272 targets (1653 packages loaded, 63635 targets configured)
    2252:  �[32m[8,003 / 10,142]�[0m 235 / 2032 tests;�[0m Testing //dotnet/test/support/UI:SlowLoadableComponentTest; 1s remote, remote-cache ... (50 actions, 0 running)
    2253:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397:19: runfiles symlink javascript/atoms/test/action_test.html -> javascript/atoms/test/action_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    2254:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397:19: runfiles symlink javascript/atoms/test/attribute_test.html -> javascript/atoms/test/attribute_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    2255:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397:19: runfiles symlink javascript/atoms/test/child_locator_test.html -> javascript/atoms/test/child_locator_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    2256:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397:19: runfiles symlink javascript/atoms/test/click_link_test.html -> javascript/atoms/test/click_link_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    2257:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397:19: runfiles symlink javascript/atoms/test/click_submit_test.html -> javascript/atoms/test/click_submit_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    2258:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2259:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2260:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2261:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2262:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2263:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2264:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2265:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2266:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397: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
    2267:  (17:53:44) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/atoms/BUILD.bazel:397:19: runfiles symlink javascript/atoms/test/events_test.html -> javascript/atoms/test/events_test.html obscured by javascript/atoms/test -> bazel-out/k8-fastbuild/bin/javascript/atoms/test
    ...
    
    2360:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/atoms/inject/sql_database_test.html -> javascript/webdriver/test/atoms/inject/sql_database_test.html obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2361:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/atoms/kitten.jpg -> javascript/webdriver/test/atoms/kitten.jpg obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2362:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/atoms/storage/local_storage_test.html -> javascript/webdriver/test/atoms/storage/local_storage_test.html obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2363:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/atoms/storage/session_storage_test.html -> javascript/webdriver/test/atoms/storage/session_storage_test.html obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2364:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/http/corsclient_test.js -> javascript/webdriver/test/http/corsclient_test.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2365:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/http/http_test.js -> javascript/webdriver/test/http/http_test.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2366:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/http/xhrclient_test.js -> javascript/webdriver/test/http/xhrclient_test.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2367:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/logging_test.js -> javascript/webdriver/test/logging_test.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2368:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/stacktrace_test.js -> javascript/webdriver/test/stacktrace_test.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2369:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/test_bootstrap.js -> javascript/webdriver/test/test_bootstrap.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2370:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/testutil.js -> javascript/webdriver/test/testutil.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2371:  (17:53:46) �[35mWARNING: �[0m/home/runner/work/selenium/selenium/javascript/webdriver/BUILD.bazel:66:19: runfiles symlink javascript/webdriver/test/testutil_test.js -> javascript/webdriver/test/testutil_test.js obscured by javascript/webdriver/test -> bazel-out/k8-fastbuild/bin/javascript/webdriver/test
    2372:  (17:53:47) �[32mAnalyzing:�[0m 2272 targets (1653 packages loaded, 63771 targets configured)
    2373:  �[32m[8,332 / 10,569]�[0m 342 / 2160 tests;�[0m Testing //rb/spec/integration/selenium/webdriver:driver-firefox-beta-bidi; 0s remote, remote-cache ... (50 actions, 1 running)
    2374:  (17:53:49) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/libsmall-tests-test-lib.jar (5 source files) and running annotation processors (AutoServiceProcessor):
    2375:  java/test/org/openqa/selenium/remote/WebDriverFixture.java:170: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2376:  response.setStatus(new ErrorCodes().toStatus(state, Optional.of(400)));
    2377:  ^
    2378:  (17:53:53) �[32mAnalyzing:�[0m 2272 targets (1653 packages loaded, 63812 targets configured)
    2379:  �[32m[8,582 / 10,756]�[0m 427 / 2202 tests;�[0m Testing //rb/spec/integration/selenium/webdriver:zipper-firefox-bidi; 2s remote, remote-cache ... (50 actions, 1 running)
    2380:  (17:53:58) �[32mAnalyzing:�[0m 2272 targets (1653 packages loaded, 63854 targets configured)
    2381:  �[32m[8,922 / 11,657]�[0m 506 / 2244 tests;�[0m Testing //javascript/selenium-webdriver:test-execute-script-test.js-firefox; 1s remote, remote-cache ... (47 actions, 3 running)
    2382:  (17:54:00) �[32mINFO: �[0mAnalyzed 2272 targets (1653 packages loaded, 63927 targets configured).
    2383:  (17:54:03) �[32m[10,166 / 12,360]�[0m 602 / 2272 tests;�[0m Testing //py:common-edge-bidi-test/selenium/webdriver/common/api_example_tests.py; 0s remote, remote-cache ... (48 actions, 3 running)
    2384:  (17:54:08) �[32m[10,842 / 12,781]�[0m 662 / 2272 tests;�[0m Testing //rb/spec/unit/selenium/webdriver/common/interactions:wheel_actions; 2s remote, remote-cache ... (48 actions, 4 running)
    2385:  (17:54:13) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/RemotableByTest.jar (1 source file) and running annotation processors (AutoServiceProcessor):
    2386:  java/test/org/openqa/selenium/remote/RemotableByTest.java:23: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2387:  import static org.openqa.selenium.remote.ErrorCodes.SUCCESS_STRING;
    2388:  ^
    2389:  java/test/org/openqa/selenium/remote/RemotableByTest.java:23: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2390:  import static org.openqa.selenium.remote.ErrorCodes.SUCCESS_STRING;
    2391:  ^
    2392:  java/test/org/openqa/selenium/remote/RemotableByTest.java:23: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2393:  import static org.openqa.selenium.remote.ErrorCodes.SUCCESS_STRING;
    2394:  ^
    2395:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2396:  private final ErrorCodes errorCodes = new ErrorCodes();
    2397:  ^
    2398:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2399:  private final ErrorCodes errorCodes = new ErrorCodes();
    2400:  ^
    2401:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2402:  private final ErrorCodes errorCodes = new ErrorCodes();
    2403:  ^
    2404:  java/test/org/openqa/selenium/remote/RemotableByTest.java:45: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2405:  private final ErrorCodes errorCodes = new ErrorCodes();
    2406:  ^
    2407:  (17:54:13) �[32m[11,819 / 13,426]�[0m 771 / 2272 tests;�[0m [Prepa] Testing //rb/spec/integration/selenium/webdriver/edge:profile-edge-bidi ... (49 actions, 9 running)
    2408:  (17:54:15) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/codec/w3c/W3CHttpResponseCodecTest.jar (1 source file):
    2409:  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
    2410:  import static org.openqa.selenium.remote.ErrorCodes.METHOD_NOT_ALLOWED;
    2411:  ^
    2412:  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
    2413:  assertThat(decoded.getStatus()).isEqualTo(ErrorCodes.SUCCESS);
    2414:  ^
    2415:  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
    2416:  assertThat(decoded.getStatus()).isEqualTo(ErrorCodes.UNHANDLED_ERROR);
    2417:  ^
    2418:  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
    2419:  assertThat(decoded.getStatus()).isEqualTo(ErrorCodes.UNHANDLED_ERROR);
    2420:  ^
    2421:  (17:54:18) �[32m[12,675 / 14,071]�[0m 847 / 2272 tests;�[0m Building java/src/org/openqa/selenium/grid/data/libdata.jar (29 source files); 1s remote, remote-cache ... (47 actions, 6 running)
    2422:  (17:54:23) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/json/JsonTest.jar (1 source file):
    2423:  java/test/org/openqa/selenium/json/JsonTest.java:430: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2424:  assertThat(response.getState()).isEqualTo(new ErrorCodes().toState(0));
    2425:  ^
    2426:  java/test/org/openqa/selenium/json/JsonTest.java:441: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2427:  assertThat(response.getState()).isEqualTo(new ErrorCodes().toState(0));
    2428:  ^
    2429:  java/test/org/openqa/selenium/json/JsonTest.java:454: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2430:  assertThat(response.getState()).isEqualTo(new ErrorCodes().toState(32));
    2431:  ^
    2432:  (17:54:23) �[32m[13,146 / 14,393]�[0m 909 / 2272 tests;�[0m Building java/src/org/openqa/selenium/grid/data/libdata.jar (29 source files); 4s remote, remote-cache ... (47 actions, 5 running)
    2433:  (17:54:26) �[32mINFO: �[0mFrom Building java/test/org/openqa/selenium/remote/ErrorHandlerTest.jar (1 source file) and running annotation processors (AutoServiceProcessor):
    2434:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:79: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2435:  handler.throwIfResponseFailed(createResponse(ErrorCodes.SUCCESS), 100);
    2436:  ^
    2437:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:85: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2438:  assertThrowsCorrectExceptionType(ErrorCodes.NO_SUCH_WINDOW, NoSuchWindowException.class);
    2439:  ^
    2440:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:86: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2441:  assertThrowsCorrectExceptionType(ErrorCodes.NO_SUCH_FRAME, NoSuchFrameException.class);
    2442:  ^
    2443:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:87: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2444:  assertThrowsCorrectExceptionType(ErrorCodes.NO_SUCH_ELEMENT, NoSuchElementException.class);
    2445:  ^
    2446:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:88: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2447:  assertThrowsCorrectExceptionType(ErrorCodes.UNKNOWN_COMMAND, UnsupportedCommandException.class);
    2448:  ^
    2449:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:90: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2450:  ErrorCodes.METHOD_NOT_ALLOWED, UnsupportedCommandException.class);
    2451:  ^
    2452:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:92: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2453:  ErrorCodes.STALE_ELEMENT_REFERENCE, StaleElementReferenceException.class);
    2454:  ^
    2455:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:94: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2456:  ErrorCodes.INVALID_ELEMENT_STATE, InvalidElementStateException.class);
    2457:  ^
    2458:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:95: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2459:  assertThrowsCorrectExceptionType(ErrorCodes.XPATH_LOOKUP_ERROR, InvalidSelectorException.class);
    2460:  ^
    2461:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:107: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2462:  Response response = createResponse(ErrorCodes.UNHANDLED_ERROR);
    2463:  ^
    2464:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:120: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2465:  createResponse(ErrorCodes.UNHANDLED_ERROR, "boom"), 123))
    2466:  ^
    2467:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:133: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2468:  createResponse(ErrorCodes.UNHANDLED_ERROR, ImmutableMap.of("message", "boom")),
    2469:  ^
    2470:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:147: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2471:  ErrorCodes.UNHANDLED_ERROR,
    2472:  ^
    2473:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:167: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2474:  ErrorCodes.UNHANDLED_ERROR,
    2475:  ^
    2476:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:193: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2477:  createResponse(ErrorCodes.UNHANDLED_ERROR, toMap(serverError)), 123))
    2478:  ^
    2479:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:214: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2480:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2481:  ^
    2482:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:248: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2483:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2484:  ^
    2485:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:280: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2486:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2487:  ^
    2488:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:308: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2489:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2490:  ^
    2491:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:327: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2492:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2493:  ^
    2494:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:355: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2495:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2496:  ^
    2497:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:394: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2498:  createResponse(ErrorCodes.UNHANDLED_ERROR, data), 123))
    2499:  ^
    2500:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:426: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2501:  createResponse(ErrorCodes.UNHANDLED_ERROR, toMap(serverError)), 123))
    2502:  ^
    2503:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:435: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2504:  exceptions.put(ErrorCodes.NO_SUCH_SESSION, NoSuchSessionException.class);
    2505:  ^
    2506:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:436: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2507:  exceptions.put(ErrorCodes.NO_SUCH_ELEMENT, NoSuchElementException.class);
    2508:  ^
    2509:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:437: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2510:  exceptions.put(ErrorCodes.NO_SUCH_FRAME, NoSuchFrameException.class);
    2511:  ^
    2512:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:438: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2513:  exceptions.put(ErrorCodes.UNKNOWN_COMMAND, UnsupportedCommandException.class);
    2514:  ^
    2515:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:439: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2516:  exceptions.put(ErrorCodes.STALE_ELEMENT_REFERENCE, StaleElementReferenceException.class);
    2517:  ^
    2518:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:440: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2519:  exceptions.put(ErrorCodes.INVALID_ELEMENT_STATE, InvalidElementStateException.class);
    2520:  ^
    2521:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:441: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2522:  exceptions.put(ErrorCodes.UNHANDLED_ERROR, WebDriverException.class);
    2523:  ^
    2524:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:442: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2525:  exceptions.put(ErrorCodes.JAVASCRIPT_ERROR, JavascriptException.class);
    2526:  ^
    2527:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:443: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2528:  exceptions.put(ErrorCodes.XPATH_LOOKUP_ERROR, InvalidSelectorException.class);
    2529:  ^
    2530:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:444: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2531:  exceptions.put(ErrorCodes.TIMEOUT, TimeoutException.class);
    2532:  ^
    2533:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:445: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2534:  exceptions.put(ErrorCodes.NO_SUCH_WINDOW, NoSuchWindowException.class);
    2535:  ^
    2536:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:446: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2537:  exceptions.put(ErrorCodes.INVALID_COOKIE_DOMAIN, InvalidCookieDomainException.class);
    2538:  ^
    2539:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:447: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2540:  exceptions.put(ErrorCodes.UNABLE_TO_SET_COOKIE, UnableToSetCookieException.class);
    2541:  ^
    2542:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:448: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2543:  exceptions.put(ErrorCodes.UNEXPECTED_ALERT_PRESENT, UnhandledAlertException.class);
    2544:  ^
    2545:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:449: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2546:  exceptions.put(ErrorCodes.NO_ALERT_PRESENT, NoAlertPresentException.class);
    2547:  ^
    2548:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:450: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2549:  exceptions.put(ErrorCodes.ASYNC_SCRIPT_TIMEOUT, ScriptTimeoutException.class);
    2550:  ^
    2551:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:451: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2552:  exceptions.put(ErrorCodes.INVALID_SELECTOR_ERROR, InvalidSelectorException.class);
    2553:  ^
    2554:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:452: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2555:  exceptions.put(ErrorCodes.SESSION_NOT_CREATED, SessionNotCreatedException.class);
    2556:  ^
    2557:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:453: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2558:  exceptions.put(ErrorCodes.MOVE_TARGET_OUT_OF_BOUNDS, MoveTargetOutOfBoundsException.class);
    2559:  ^
    2560:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:454: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2561:  exceptions.put(ErrorCodes.INVALID_XPATH_SELECTOR, InvalidSelectorException.class);
    2562:  ^
    2563:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:455: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2564:  exceptions.put(ErrorCodes.INVALID_XPATH_SELECTOR_RETURN_TYPER, InvalidSelectorException.class);
    2565:  ^
    2566:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:469: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2567:  ? ErrorCodes.INVALID_SELECTOR_ERROR
    2568:  ^
    2569:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:471: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2570:  assertThat(new ErrorCodes().toStatusCode(e)).isEqualTo(expected);
    2571:  ^
    2572:  java/test/org/openqa/selenium/remote/ErrorHandlerTest.java:483: warning: [removal] ErrorCodes in org.openqa.selenium.remote has been deprecated and marked for removal
    2573:  response.setState(new ErrorCodes().toState(status));
    2574:  ^
    ...
    
    2677:  18:00:21.444 INFO [LocalDistributor.newSession] - Session created by the Distributor. Id: 903f78c2-64fe-42f4-8e55-28d010345968 
    2678:  Caps: Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 137.0, moz:accessibilityChecks: false, moz:buildID: 20250327043313, moz:debuggerAddress: 127.0.0.1:30108, moz:firefoxOptions: {binary: external/+pin_browsers_exte..., prefs: {remote.active-protocols: 3}}, moz:geckodriverVersion: 0.36.0, moz:headless: false, moz:platformVersion: 6.1.0-33-cloud-amd64, moz:processID: 1073, moz:profile: /tmp/rust_mozprofileyZZ3lj, moz:shutdownTimeout: 60000, moz:webdriverClick: true, moz:windowless: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:cdpEnabled: false, se:gridWebSocketUrl: ws://127.0.0.1:30108/sessio..., setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, userAgent: Mozilla/5.0 (X11; Linux x86..., webSocketUrl: ws://127.0.0.1:7539/session...}
    2679:  18:00:21.522 INFO [ProxyNodeWebsockets.createWsEndPoint] - Establishing connection to ws://127.0.0.1:30108/session/903f78c2-64fe-42f4-8e55-28d010345968
    2680:  18:00:27.523 INFO [LocalNode.stopTimedOutSession] - Session id 903f78c2-64fe-42f4-8e55-28d010345968 is stopping on demand...
    2681:  18:00:27.526 INFO [LocalSessionMap.remove] - Deleted session from local Session Map, Id: 903f78c2-64fe-42f4-8e55-28d010345968
    2682:  18:00:27.527 INFO [GridModel.release] - Releasing slot for session id 903f78c2-64fe-42f4-8e55-28d010345968
    2683:  18:00:27.531 INFO [SessionSlot.stop] - Stopping session 903f78c2-64fe-42f4-8e55-28d010345968
    2684:  18:00:27.590 INFO [LocalDistributor.newSession] - Session request received by the Distributor: 
    2685:  [Capabilities {acceptInsecureCerts: true, browserName: firefox, moz:firefoxOptions: {binary: external/+pin_browsers_exte..., prefs: {remote.active-protocols: 3}}, webSocketUrl: true}]
    2686:  18:00:33.607 INFO [LocalNode.newSession] - Session created by the Node. Id: e9fc58fa-cff5-428e-8eee-e1232250d138, Caps: Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 137.0, moz:accessibilityChecks: false, moz:buildID: 20250327043313, moz:debuggerAddress: 127.0.0.1:26715, moz:firefoxOptions: {binary: external/+pin_browsers_exte..., prefs: {remote.active-protocols: 3}}, moz:geckodriverVersion: 0.36.0, moz:headless: false, moz:platformVersion: 6.1.0-33-cloud-amd64, moz:processID: 1331, moz:profile: /tmp/rust_mozprofilezE30o5, moz:shutdownTimeout: 60000, moz:webdriverClick: true, moz:windowless: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:cdpEnabled: false, se:gridWebSocketUrl: ws://127.0.0.1:26715/sessio..., setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, userAgent: Mozilla/5.0 (X11; Linux x86..., webSocketUrl: ws://127.0.0.1:7539/session...}
    2687:  18:00:33.620 INFO [LocalDistributor.newSession] - Session created by the Distributor. Id: e9fc58fa-cff5-428e-8eee-e1232250d138 
    2688:  Caps: Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 137.0, moz:accessibilityChecks: false, moz:buildID: 20250327043313, moz:debuggerAddress: 127.0.0.1:26715, moz:firefoxOptions: {binary: external/+pin_browsers_exte..., prefs: {remote.active-protocols: 3}}, moz:geckodriverVersion: 0.36.0, moz:headless: false, moz:platformVersion: 6.1.0-33-cloud-amd64, moz:processID: 1331, moz:profile: /tmp/rust_mozprofilezE30o5, moz:shutdownTimeout: 60000, moz:webdriverClick: true, moz:windowless: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:cdpEnabled: false, se:gridWebSocketUrl: ws://127.0.0.1:26715/sessio..., setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, userAgent: Mozilla/5.0 (X11; Linux x86..., webSocketUrl: ws://127.0.0.1:7539/session...}
    2689:  18:00:33.665 INFO [ProxyNodeWebsockets.createWsEndPoint] - Establishing connection to ws://127.0.0.1:26715/session/e9fc58fa-cff5-428e-8eee-e1232250d138
    2690:  Failures: 1
    2691:  1) shouldScrollFromViewportByGivenAmount() (org.openqa.selenium.bidi.input.DefaultWheelTest)
    2692:  org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
    2693:  at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
    ...
    
    2731:  (18:02:42) �[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)
    2732:  (18:02:46) �[32m[15,919 / 15,959]�[0m 2160 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 157s remote, remote-cache ... (40 actions, 34 running)
    2733:  (18:02:52) �[32m[15,923 / 15,960]�[0m 2163 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 163s remote, remote-cache ... (37 actions, 35 running)
    2734:  (18:02:57) �[32m[15,926 / 15,960]�[0m 2166 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 169s remote, remote-cache ... (34 actions, 33 running)
    2735:  (18:03:03) �[32m[15,928 / 15,960]�[0m 2169 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 174s remote, remote-cache ... (32 actions, 31 running)
    2736:  (18:03:10) �[32m[15,933 / 15,960]�[0m 2173 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 182s remote, remote-cache ... (27 actions, 26 running)
    2737:  (18:03:16) �[32m[15,938 / 15,960]�[0m 2178 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 187s remote, remote-cache ... (22 actions running)
    2738:  (18:03:21) �[32m[15,942 / 15,960]�[0m 2182 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 192s remote, remote-cache ... (18 actions running)
    2739:  (18:03:26) �[32m[15,944 / 15,960]�[0m 2185 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 198s remote, remote-cache ... (16 actions running)
    2740:  (18:03:33) �[32m[15,946 / 15,960]�[0m 2186 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 205s remote, remote-cache ... (14 actions running)
    2741:  (18:03:41) �[32m[15,946 / 15,960]�[0m 2186 / 2272 tests;�[0m Testing //java/test/org/openqa/selenium/bidi/script:ScriptCommandsTest-remote; 212s remote, remote-cache ... (14 actions running)
    2742:  (18:03:51) �[32m[15,949 / 15,960]�[0m 2189 / 2272 tests;�[0m Testing //rb/spec/integration/selenium/webdriver:action_builder-firefox-remote; 151s remote, remote-cache ... (11 actions running)
    2743:  (18:03:56) �[32m[15,949 / 15,960]�[0m 2189 / 2272 tests;�[0m Testing //rb/spec/integration/selenium/webdriver:action_builder-firefox-remote; 156s remote, remote-cache ... (11 actions running)
    2744:  (18:04:11) �[32m[15,949 / 15,960]�[0m 2190 / 2272 tests;�[0m Testing //rb/spec/integration/selenium/webdriver:action_builder-firefox-remote; 171s remote, remote-cache ... (11 actions running)
    2745:  (18:04:13) �[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)
    2746:  �[31m�[1mFAILED: �[0m//rb/spec/integration/selenium/webdriver:action_builder-firefox-remote (Summary)
    2747:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/integration/selenium/webdriver/action_builder-firefox-remote/test.log
    ...
    
    2778:  #context_click
    2779:  right clicks an element
    2780:  executes with equivalent pointer methods
    2781:  #move_to
    2782:  moves to element
    2783:  moves to element with offset
    2784:  #drag_and_drop
    2785:  moves one element to another
    2786:  #drag_and_drop_by
    2787:  moves one element a provided distance
    2788:  #move_to_location
    2789:  moves pointer to specified coordinates
    2790:  pen stylus
    2791:  sets pointer event properties (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};)
    2792:  #scroll_to
    2793:  scrolls to element (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2794:  #scroll_by
    2795:  scrolls by given amount (FAILED - 1)
    2796:  #scroll_from
    2797:  scrolls from element by given amount (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2798:  scrolls from element by given amount with offset (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2799:  raises MoveTargetOutOfBoundsError when origin offset from element is out of viewport
    2800:  scrolls by given amount with offset
    2801:  raises MoveTargetOutOfBoundsError when origin offset is out of viewport
    2802:  Pending: (Failures listed here are expected and do not affect your suite's status)
    2803:  1) Selenium::WebDriver::ActionBuilder pen stylus sets pointer event properties
    2804:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};
    2805:  Failure/Error: actions.perform
    2806:  Selenium::WebDriver::Error::UnknownError:
    2807:  Error: Unimplemented pointerMove for pointerType pen
    2808:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2809:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    2810:  # ./rb/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    2811:  # ./rb/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
    2812:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:103:in `create_response'
    2813:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2814:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2815:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:625:in `execute'
    2816:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:353:in `send_actions'
    2817:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2818:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:283:in `block in WebDriver'
    2819:  # ------------------
    2820:  # --- Caused by: ---
    2821:  # Selenium::WebDriver::Error::WebDriverError:
    2822:  #   pointerMove@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2396:11
    2823:  performPointerMoveStep@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1631:31
    2824:  dispatch/<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1598:20
    2825:  moveOverTime/transitions<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2323:9
    2826:  2) Selenium::WebDriver::ActionBuilder#scroll_to scrolls to element
    2827:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2828:  Failure/Error: driver.action.scroll_to(iframe).perform
    2829:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2830:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    2831:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2832:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    2833:  # ./rb/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    2834:  # ./rb/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
    2835:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:103:in `create_response'
    2836:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2837:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2838:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:625:in `execute'
    2839:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:353:in `send_actions'
    2840:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2841:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:316:in `block in WebDriver'
    2842:  # ------------------
    2843:  # --- Caused by: ---
    2844:  # Selenium::WebDriver::Error::WebDriverError:
    2845:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2846:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:199:5
    2847:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:518:5
    2848:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3103:11
    2849:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2850:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:210:42
    2851:  3) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount
    2852:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2853:  Failure/Error: driver.action.scroll_from(scroll_origin, 0, 200).perform
    2854:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2855:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    2856:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2857:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    2858:  # ./rb/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    2859:  # ./rb/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
    2860:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:103:in `create_response'
    2861:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2862:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2863:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:625:in `execute'
    2864:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:353:in `send_actions'
    2865:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2866:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:343:in `block in WebDriver'
    2867:  # ------------------
    2868:  # --- Caused by: ---
    2869:  # Selenium::WebDriver::Error::WebDriverError:
    2870:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2871:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:199:5
    2872:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:518:5
    2873:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3103:11
    2874:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2875:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:210:42
    2876:  4) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount with offset
    2877:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2878:  Failure/Error: driver.action.scroll_from(scroll_origin, 0, 200).perform
    2879:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2880:  Move target (640, 2967) is out of bounds of viewport dimensions (1280, 819)
    2881:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2882:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    2883:  # ./rb/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    2884:  # ./rb/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
    2885:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:103:in `create_response'
    2886:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2887:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2888:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:625:in `execute'
    2889:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:353:in `send_actions'
    2890:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2891:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:357:in `block in WebDriver'
    2892:  # ------------------
    2893:  # --- Caused by: ---
    2894:  # Selenium::WebDriver::Error::WebDriverError:
    2895:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    2896:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:199:5
    2897:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:518:5
    2898:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3103:11
    2899:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    2900:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:210:42
    2901:  Failures:
    2902:  1) Selenium::WebDriver::ActionBuilder#scroll_by scrolls by given amount
    2903:  Failure/Error: expect(in_viewport?(footer)).to be true
    2904:  expected true
    2905:  got false
    2906:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:332:in `block in WebDriver'
    2907:  Finished in 52.96 seconds (files took 2.35 seconds to load)
    2908:  27 examples, 1 failure, 4 pending
    2909:  Failed examples:
    2910:  rspec ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:323 # Selenium::WebDriver::ActionBuilder#scroll_by scrolls by given amount
    ...
    
    2941:  #context_click
    2942:  right clicks an element
    2943:  executes with equivalent pointer methods
    2944:  #move_to
    2945:  moves to element
    2946:  moves to element with offset
    2947:  #drag_and_drop
    2948:  moves one element to another
    2949:  #drag_and_drop_by
    2950:  moves one element a provided distance
    2951:  #move_to_location
    2952:  moves pointer to specified coordinates
    2953:  pen stylus
    2954:  sets pointer event properties (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};)
    2955:  #scroll_to
    2956:  scrolls to element (PENDING: Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2957:  #scroll_by
    2958:  scrolls by given amount (FAILED - 1)
    2959:  #scroll_from
    2960:  scrolls from element by given amount (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2961:  scrolls from element by given amount with offset (PENDING: Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};)
    2962:  raises MoveTargetOutOfBoundsError when origin offset from element is out of viewport
    2963:  scrolls by given amount with offset
    2964:  raises MoveTargetOutOfBoundsError when origin offset is out of viewport
    2965:  Pending: (Failures listed here are expected and do not affect your suite's status)
    2966:  1) Selenium::WebDriver::ActionBuilder pen stylus sets pointer event properties
    2967:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"Unknown pointerType"};
    2968:  Failure/Error: actions.perform
    2969:  Selenium::WebDriver::Error::UnknownError:
    2970:  Error: Unimplemented pointerMove for pointerType pen
    2971:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2972:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    2973:  # ./rb/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    2974:  # ./rb/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
    2975:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:103:in `create_response'
    2976:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    2977:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    2978:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:625:in `execute'
    2979:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:353:in `send_actions'
    2980:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    2981:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:283:in `block in WebDriver'
    2982:  # ------------------
    2983:  # --- Caused by: ---
    2984:  # Selenium::WebDriver::Error::WebDriverError:
    2985:  #   pointerMove@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2396:11
    2986:  performPointerMoveStep@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1631:31
    2987:  dispatch/<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:1598:20
    2988:  moveOverTime/transitions<@chrome://remote/content/shared/webdriver/Actions.sys.mjs:2323:9
    2989:  2) Selenium::WebDriver::ActionBuilder#scroll_to scrolls to element
    2990:  # Test guarded; Guarded by {:browser=>:firefox, :reason=>"incorrect MoveTargetOutOfBoundsError"};
    2991:  Failure/Error: driver.action.scroll_to(iframe).perform
    2992:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    2993:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    2994:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    2995:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    2996:  # ./rb/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    2997:  # ./rb/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
    2998:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:103:in `create_response'
    2999:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    3000:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    3001:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:625:in `execute'
    3002:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:353:in `send_actions'
    3003:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    3004:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:316:in `block in WebDriver'
    3005:  # ------------------
    3006:  # --- Caused by: ---
    3007:  # Selenium::WebDriver::Error::WebDriverError:
    3008:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    3009:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:199:5
    3010:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:518:5
    3011:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3103:11
    3012:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    3013:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:210:42
    3014:  3) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount
    3015:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    3016:  Failure/Error: driver.action.scroll_from(scroll_origin, 0, 200).perform
    3017:  Selenium::WebDriver::Error::MoveTargetOutOfBoundsError:
    3018:  Move target (410, 2913) is out of bounds of viewport dimensions (1280, 819)
    3019:  # ./rb/lib/selenium/webdriver/remote/response.rb:63:in `add_cause'
    3020:  # ./rb/lib/selenium/webdriver/remote/response.rb:41:in `error'
    3021:  # ./rb/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    3022:  # ./rb/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
    3023:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:103:in `create_response'
    3024:  # ./rb/lib/selenium/webdriver/remote/http/default.rb:103:in `request'
    3025:  # ./rb/lib/selenium/webdriver/remote/http/common.rb:68:in `call'
    3026:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:625:in `execute'
    3027:  # ./rb/lib/selenium/webdriver/remote/bridge.rb:353:in `send_actions'
    3028:  # ./rb/lib/selenium/webdriver/common/action_builder.rb:198:in `perform'
    3029:  # ./rb/spec/integration/selenium/webdriver/action_builder_spec.rb:343:in `block in WebDriver'
    3030:  # ------------------
    3031:  # --- Caused by: ---
    3032:  # Selenium::WebDriver::Error::WebDriverError:
    3033:  #   RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
    3034:  WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:199:5
    3035:  MoveTargetOutOfBoundsError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:518:5
    3036:  assertTargetInViewPort@chrome://remote/content/shared/webdriver/Actions.sys.mjs:3103:11
    3037:  #assertInViewPort@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:115:17
    3038:  receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:210:42
    3039:  4) Selenium::WebDriver::ActionBuilder#scroll_from scrolls from element by given amount with offset
    3040:  # Test guarded; Guarded by {:browser=>[:firefox, :safari], :reason=>"incorrect MoveTargetOutOfBoundsError"};
    3041:...

    @VietND96 VietND96 added the B-grid Everything grid and server related label Mar 31, 2025
    Comment on lines 197 to 210
    public static boolean specificRelayCapabilitiesAppMatch(Capabilities capabilities) {
    /*
    This match is specific for the Relay capabilities that are related to the Appium server for native application.
    - If browserName is defined then we always assume it’s a hybrid browser session, so no app-related caps should be provided
    - If app is provided then the assumption is that app should be fetched from somewhere first and then installed on the destination device
    - If only appPackage is provided for uiautomator2 driver or bundleId for xcuitest then the assumption is we want to automate an app that is already installed on the device under test
    - If both (app and appPackage) or (app and bundleId). This will then save some small-time for the driver as by default it tries to autodetect these values anyway by analyzing the fetched package’s manifest
    */
    return SPECIFIC_RELAY_CAPABILITIES_APP.stream()
    .anyMatch(
    name ->
    capabilities.getCapability(name) != null
    && !capabilities.getCapability(name).toString().isEmpty());
    }
    Copy link
    Member

    Choose a reason for hiding this comment

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

    I don't understand how this fixes #14247. Moreover, I don't understand why #14247 is not working.

    Maybe #14247 should have not been merged, the user had to configure the stereotypes correctly, and either only send browserName or appium:app in the session capabilities.

    I like the refactoring but I don't see how specificRelayCapabilitiesAppMatch helps or improves the situation.

    Copy link
    Member Author

    Choose a reason for hiding this comment

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

    @diemol, I think it not really fix, also there is no unit test to see the capabilities outcomes looks like.
    I spent some time to setup end2end for 3 different scenarios, same as the ticket issue description and their PR describe, none of those work correctly to launch the native app in emulator - https://github.com/NDViet/test-grid-relay-appium/blob/main/reproduce/test_native_app.py
    Note that, this browserName cap set in Node stereotype, which means they expect that Node can take both hybrid browser session and native app.
    For example in a scenario, where request capabilities try to unset browserName, immediately, DefaultSlotMatcher could not match, since browserNameMatch guard the condition as mandatory there.

    @VietND96 VietND96 requested a review from diemol April 6, 2025 20:08
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    B-grid Everything grid and server related Review effort 3/5
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    2 participants