Headless Chrome + Java + Selenide + MVN = despair

Добрый день!

Специалисты по Selenide, используете ли вы в своих проектах возможность нативного headless тестирования в Chrome? Я столкнулся с проблемой, что не могу заставить maven запустить тесты в headless режиме. Пытался так:

mvn test -Dchromeoptions.args="--headless --disble-gpu"

И так:

mvn test -Dchromeoptions.args=headless

И даже вот так:

mvn test -Dselenide.headless=true

Каждый из вариантов все равно запускает браузер. Инстансы определяются вот этим классом:

Summary

https://github.com/sant0ku/selenide-helpers/blob/master/WindowManager.java

Подскажите, что я делаю не так. Гугл спрашивал, но я так понимаю, еще мало кто юзает эту фичу на данный момент.

Попробуйте такой вариант (без options, всё проще):

Configuration.headless = true;

1 лайк

К сожалению, не сработало. Правильно ли я понимаю, что эта опция доступна только начиная с Selenide 4.8? Я использую версию 4.5. Но вероятно я не правильно понял, куда нужно вставить этот код:

Configuration.headless = true;

Когда я делаю import com.codeborne.selenide.Configuration; headless мне не доступен.

При запуске maven с таким флагом - вываливается ошибка. Я полагаю, что через maven правильный запуск был бы:

-Dselenide.headless=true

Однако, это тоже не работает.

Да, эта фича появилась только в последних версиях Selenide. И селениума. Так что да, в версии 4.5 это и не должно работать.

1 лайк

Увы, не получилось. Обновил Selenide до версии 4.8

> <dependency>
>   <groupId>com.codeborne</groupId>
>   <artifactId>selenide</artifactId>
>   <version>4.8</version>
>   <scope>test</scope>
> </dependency>

Вставил перед началом теста:

Configuration.headless = true;

И при запуске теста (не важно, через maven или напрямую через IDE) - все равно стартует браузер. Ошибок не выдает, не подскажите, в какую еще сторону можно копнуть?

В сторону версии драйвера, а лучше скинуть участок кода куда вставили headless = true

Класс из моего проекта где я использую хэдлесс хром, может вам подаст идею. Правда тут используется Selenide, но он под капотом все равно Selenium использует.

import com.codeborne.selenide.WebDriverProvider
import io.github.bonigarcia.wdm.ChromeDriverManager
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.remote.DesiredCapabilities

class HeadlessChromeWebDriverProvider implements WebDriverProvider {

@Override
WebDriver createDriver(DesiredCapabilities desiredCapabilities) {

    ChromeOptions chromeOptions = new ChromeOptions()
    chromeOptions.addArguments('--headless')
    chromeOptions.addArguments('--window-size=1920,1080')

    ChromeDriverManager.getInstance().version("2.32").setup()
    WebDriver driver = new ChromeDriver(chromeOptions)

    driver
}

}

Проверьте еще версии браузера, хедлесс режим работает в хроме версии 59+ и фф 56+

ChromeDriver 2.34.522932 (4140ab217e1ca1bec0c4b4d1b148f3361eb3a03e)

Что касается теста:

@Test
public void testMethodName() {
    Configuration.headless = true;
    ...
    }

Импорт также сделан:

import com.codeborne.selenide.Configuration;

Спасибо! Подумаю, как можно это применить у себя. У вас в таком виде все запускается корректно, верно?

Версия хрома:

Version 63.0.3239.84 (Official Build) (64-bit)

ФФ не использую.

Вот тоже рабочий пример на селениде

@BeforeClass
    public void setUp() {
    System.setProperty("webdriver.gecko.driver", "src\\main\\resources\\geckodriver.exe");
    System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\chromedriver.exe");
    System.setProperty("webdriver.ie.driver", "src\\main\\resources\\IEDriverServer.exe");
    Configuration.browser = "chrome";
    Configuration.headless = mode;
    Configuration.timeout = "4000";
    Configuration.baseUrl = "http://localhost:8080";
    Configuration.startMaximized = true;
    }

Спасибо! Полагаю, что проблема в том, что я не задаю в явном виде нигде никаких properties/options для хрома. Либо весь фокус вот в этой строчке:

Configuration.startMaximized = true;

Буду думать дальше :slight_smile:

Ну конкретно в этом случае это просто имплементация моего кастомного вебдрайвера, можете попробовать создать такой-же класс только подправив под джаву и запустить вместе с "-Dselenide.browser=(путь к классу).HeadlessChromeWebDriverProvider.
И кстати я тоже корячился сначала запустить хэдлесс хром через Selenide configuration и у меня ничего толкового не вышло, в итоге я решил таки сделать кастомный вебдрайвер и все работает.

1 лайк