Selenide proxy не поднимается в selenoid

Проблема:
Пытаюсь запустить Selenide Proxy в селеноиде, адрес и порт хоста указываю через Configuration.proxyHost(адрес машины, где бегают тесты) & Configuration.proxyPort, затем передаю в WebDriverRunner.setWebdriver(driver, proxy)
однако прокси запускается на адрес 0.0.0.0:4444, о чем и говорят логи. Соответственно har файл пустой.
Вижу в методе SelenideProxyServer.start используется метод start(port) без указания хоста, не совсем понимаю, как в таком случае передается хост.

Код

Configuration.proxyEnabled = true;
        Configuration.proxyHost = Property.SELENIUM_HOST_PROPERTY;
        SelenideConfig config = new SelenideConfig();
        config.proxyHost(Configuration.proxyHost);
        config.proxyEnabled(true);
        config.proxyPort(4444);
        Proxy proxy = new Proxy();
        proxy.setProxyType(ProxyType.MANUAL);
        proxy.setHttpProxy(Property.SELENIUM_HOST_PROPERTY + ":4444");
        proxy.setSslProxy(Property.SELENIUM_HOST_PROPERTY + ":4444");
        proxy.setAutodetect(false);
        SelenideProxyServer proxyServer = new SelenideProxyServer(config, proxy);
        proxyServer.start();

Версии ОС и софта следующие:
implementation ‘com.codeborne:selenide:6.11.0’
implementation ‘com.codeborne:selenide-proxy:6.11.0’

Что-то вы слишком всё усложнили. Обычно не нужно мешать в кучу и Configuration, и SelenideConfig. И зачем вам понадобилось отдельно запускать SelenideProxyServer?

Обычно всё это не нужно, и сетап намного проще:

Configuration.proxyEnabled = true;
Configuration.remote = "http://url-of-selenoid/wd/hub";
open("https://google.com");

Есть же рабочие примеры на гитхабе: selenoid-sample/src/test/java/org/selenide/examples/selenoid at main · selenide-examples/selenoid-sample · GitHub

SelenideProxyServer запускал по примеру тут , т.к. использую setWebDriver(), иначе ругается, что параметр Configguration.proxy = true, а прокси не передается в setWebdriver()
Эксперемента ради убрал setWebDriver и попробовал сделать как в примере:
Все равно прокси запускается не на нужном адресе


А заканчивается все такой ошибкой
org.openqa.selenium.WebDriverException: unknown error: net::ERR_PROXY_CONNECTION_FAILED

  1. В вашем изначальном примере вы удивляетесь, что проксит запускается на порту 4444 - но вы именно такой порт и задаёте: config.proxyPort(4444);

  2. Во втором примере - не видя вашего кода, невозможно что-то сказать.

В первом примере порт как раз таки нужный, а вот хост почему-то не подтягивается

 Configuration.screenshots = false;
        Configuration.savePageSource = false;
        Configuration.timeout = DEFAULT_SELENIDE_TIMEOUT;
        Configuration.reportsFolder = "build/selenide/reports";
        Configuration.proxyEnabled = true;
        Configuration.proxyHost = SELENIUM_HOST_PROPERTY;
        Configuration.proxyPort = Integer.parseInt(SELENIUM_PORT_PROPERTY);
        SelenideProxyServer proxyServer = new SelenideProxyServer(new SelenideConfig(), null);
        proxyServer.start();

        DesiredCapabilities capabilities = getDriverCapabilities(config);

        RemoteWebDriver remoteWebDriver;
        try {
            remoteWebDriver = new RemoteWebDriver(URI.create(url).toURL(), capabilities);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
        remoteWebDriver.setFileDetector(new LocalFileDetector());

        WebDriverRunner.setWebDriver(remoteWebDriver, proxyServer);
        return WebDriverRunner.getWebDriver(); - конфиг



 options.setProxy(proxy.getSeleniumProxy());
 options.addArguments("--proxy-bypass-list=<-loopback>");

options

  1. А, понял. Тогда с хостом у вас нет проблемы. Селенид запускает прокси по адресу 0.0.0.0:4444, а это значит, что прокси будет слушать любые запросы на любые хосты, которые до него долетят. Настройка proxyHost нужна для того, чтобы сказать браузеру, к какому хосту обращаться. Но в вашем примере вы не запускаете браузер, поэтому настройка proxyHost фактически не используется.

А проблема у вас по-прежнему в том, что наворочен ненужный код. Скорее всего вам не нужно ни создавать инстанс SelenideProxyServer, ни запускать у него вручную метод start. И уж что точно не нужно делать, так это создавать вручную new Proxy(). Этот параметр задания для внешнего прокси, который где-то снаружи запущен уже до селенида. Ну, какой-нибудь там корпоративный.

  1. Во втором варианте вы создаёте экземпляр new SelenideConfig(), а это новый объект настроек, он полностью игнорирует всё, что вы до этого засунули в Configuration.

Ещё раз: не создавайте ничего руками. Только напихайте значений в Configuration и дёргайте open(url).

Теперь понял, спасибо за пояснение.
Свел весь конфиг до

 Configuration.screenshots = false;
            Configuration.savePageSource = false;
            Configuration.timeout = DEFAULT_SELENIDE_TIMEOUT;
            Configuration.reportsFolder = "target/surefire-reports";
            Configuration.downloadsFolder = "target/downloads";
            Configuration.proxyEnabled = true;
            Configuration.proxyHost = SELENIUM_HOST_PROPERTY;
            Configuration.proxyPort = 4444;
            Configuration.baseUrl = "my_url";
            Configuration.remote = "http://${remote_ip}:4444/wd/hub";

Прокси запускается успешно,
Но теперь при вызове метода open(url)
Появляется следующая ошибка:

org.openqa.selenium.WebDriverException: unknown error: net::ERR_TUNNEL_CONNECTION_FAILED

Driver info: org.openqa.selenium.remote.RemoteWebDriver
Command: [1a2e748ca0d568aa8735d984cedc4df6, get {url=my_url}]
selenide.url: my_url
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:200)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:133)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:53)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:184)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:541)
	at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:310)
	at org.openqa.selenium.remote.RemoteWebDriver$RemoteNavigation.to(RemoteWebDriver.java:981)
	at com.codeborne.selenide.drivercommands.Navigator.lambda$navigateTo$0(Navigator.java:74)
	at com.codeborne.selenide.logevents.SelenideLogger.run(SelenideLogger.java:105)
	at com.codeborne.selenide.drivercommands.Navigator.navigateTo(Navigator.java:70)
	at com.codeborne.selenide.drivercommands.Navigator.open(Navigator.java:32)
	at com.codeborne.selenide.SelenideDriver.open(SelenideDriver.java:101)
	at com.codeborne.selenide.Selenide.open(Selenide.java:52)
	at MyTest.myTestMethod()

Нашел аналогичную ошибку тут , но с депенденси в порядке, конфликтов нет.

  1. Тут зависит от того, какое значение в SELENIUM_HOST_PROPERTY. Если там какой-то адрес, который физически недоступен из браузера, то и не сможет работать.
  2. Странно, что одинаковый порт 4444 используется и для прокси, и для Selenoid. С портами точно не напутали?
  1. Да, действительно напутал, видимо порт тогда лучше вообще не указывать.
  2. Указываю ip машины, где развернут селеноид, как указано здесь

То бишь если селеноид развернут, скажем, на “http://10.20.30.400:4444/wd/hub”;
то Configuration.proxyHost = "10.20.30.400"

Так ведь указано ровно наоборот!
Есть всего две машины:

  1. “машина с тестами”, и
  2. “машина с селеноидом”

Вы прописываете айпишник (2), а в приведённой цитате сказано (1).
Попробуйте для начала не указывать никакой айпишник - селенид и сам умеет его определять.

Спасибо большое за помощь, так получилось значительно сократить конфигурацию

1 лайк