Передача Options и Capabilities через Selenide в Selenoid и закрытие драйвера

Всем привет. Нужна помощь с Selenide.
Хочу чтобы в каждом тесте запускался чистый браузер в Selenoid с Options ("–headless" и т.д.) и Capabilities (“enableVNC” = true; и т.д.) из файла настроек.

Я пытался совместить Options и Capabilities в единое целое. Пробовал делать через метод .merge()

package org.driver;

import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.SelenideConfig;
import com.codeborne.selenide.SelenideDriver;
import com.codeborne.selenide.SelenideWait;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.HashMap;
import java.util.Map;

import static setting.Settings.*;

public class Driver {

    public static void main(String[] args) {
        System.out.println("Тест Java");

        DesiredCapabilities capabilities = new DesiredCapabilities();

        ChromeOptions options = new ChromeOptions();
        for (int i = 0; i < OPTIONS.length - 1; i++)
            options.addArguments(OPTIONS[i]);

        options.setExperimentalOption("mobileEmulation", MOBILE_EMULATION);
        options.setExperimentalOption("excludeSwitches", ENABLE_AUTOMATION);
        capabilities.setCapability(ChromeOptions.CAPABILITY, options);

        Map<String, Object> selenoidOptions = new HashMap<>();
        selenoidOptions.put("browserName", "chrome");
        selenoidOptions.put("browserVersion", "100.0");
        selenoidOptions.put("enableVNC", true);
        selenoidOptions.put("enableVideo", false);
        capabilities.setCapability("selenoid:options", selenoidOptions);

        var driver = new SelenideDriver(
                new SelenideConfig()
                        .remote(PORTAINER_COMMAND_EXECUTOR)
                        .browser("chrome")
                        .browserVersion("100.0")
                        .browserCapabilities(capabilities)
        );

        driver.open(URL);
        driver.$x("//span[@class= 'good-day']").click(); 

Благодаря коду выше, в Selenoid запускается браузер с переданными capabilities, но без Options в самом браузере. После завершения скрипта браузер и контейнер автоматически закрывается (что мне и нужно)

Затем я решил делать через WebDriverProvider:

package drivers;

import com.codeborne.selenide.*;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

import javax.annotation.Nonnull;
import java.net.URI;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

import static setting.Settings.*;

public class CustomDriver implements WebDriverProvider {

    @Nonnull
    @Override
    public WebDriver createDriver(@Nonnull Capabilities capabilities) {

        ChromeOptions options = new ChromeOptions();
        for (int i = 0; i < OPTIONS.length - 1; i++) {
            options.addArguments(OPTIONS[i]);
        }
        options.setExperimentalOption("mobileEmulation", MOBILE_EMULATION);
        options.setExperimentalOption("excludeSwitches", ENABLE_AUTOMATION);

        Map<String, Object> selenoidOptions = new HashMap<>();
        selenoidOptions.put("browserName", "chrome");
        selenoidOptions.put("browserVersion", "100.0");
        selenoidOptions.put("enableVNC", true);
        selenoidOptions.put("enableVideo", false);
        options.setCapability("selenoid:options", selenoidOptions);

        try {
            return new RemoteWebDriver(
                    URI.create(PORTAINER_COMMAND_EXECUTOR).toURL(),
                    options
            );
        } catch (MalformedURLException e) {
            System.out.println("ERROR!!!!");
            throw new RuntimeException(e);
        }
    }
}

Точка входа для запуска драйвера и скрипта:

public static void main(String[] args) {
        Configuration.holdBrowserOpen=false;
        Configuration.browser = CustomDriver.class.getName();
        Selenide.open(SSP_URL);
        $(".input-login").click();
}

После этого Capabilities и Options передаются в Selenoid и Chrome, код отрабатывает, но после не закрывает браузер и контейнер.

Специально добавил строчку (Configuration.holdBrowserOpen=false;) - не помогло.
Может можно как-то из RemoteWebDriver сделать SelenideDriver и это поможет?

  1. В первом варианте надо чутка упростить код для подготовки капабилитей. См. https://ru.selenide.org/2021/11/24/selenide-6.1.1/#wrapping-browser-capabilities
  2. Код вроде правильный, селенид должен автоматически закрыть браузер в конце. Надо внимательно почитать логи селенида. Там пишут всё: когда открыли, когда закрыли, все дела.
1 лайк

Решил делать через первый метод.

  1. Проблема с передачей options заключалась, в том что я передавал их циклом:
public static final String[] OPTIONS  = new String[] {
            "disable-in-process-stack-traces",
            "disable-crash-reporter",
            // и т.д.
    };

for (int i = 0; i < OPTIONS.length - 1; i++) {
            options.addArguments(OPTIONS[i]);
        }

Сейчас рабочая версия выглядит так:

public static final String[] OPTIONS  = new String[] {// список options };
options.addArguments(OPTIONS);
  1. Использовал твои рекомендации из документации Вышла Selenide 6.1.1
    Но конечный рабочий код, в консоли пишет WARNING:
ChromeOptions options = new ChromeOptions();
options.addArguments(OPTIONS);
options.setCapability("enableVNC", true);
options.setCapability("enableVideo", false);

var driver = new SelenideDriver(
                new SelenideConfig()
                        .remote(PORTAINER_COMMAND_EXECUTOR)
                        .browser("chrome")
                        .browserVersion("100.0")
                        .browserCapabilities(options)
        );

WARNING: Support for Legacy Capabilities is deprecated; You are sending the following invalid capabilities: [enableVNC, enableVideo]; Please update to W3C Syntax: Removing Legacy Protocol Support | Selenium

Чтобы не было WARNING в консоли приходится использовать DesiredCapabilities как в первоначальном моём коде:

DesiredCapabilities capabilities = new DesiredCapabilities();
ChromeOptions options = new ChromeOptions();
options.addArguments(OPTIONS);
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
Map<String, Object> selenoidOptions = new HashMap<>();
selenoidOptions.put("enableVNC", true);
selenoidOptions.put("enableVideo", false);
capabilities.setCapability("selenoid:options", selenoidOptions);

За пример взял код из: ChomeOptions in Selenium 4.3? · Issue #1225 · aerokube/selenoid · GitHub