Падают тесты когда запускаю их в chrome headless mode

Проблема заключается в том что не работают тесты, когда хочу запустить их в headless chrome режиме выдает java.lang.NullPointerException

Когда запускаю тесты не в headless, то все работает замечательно

Вот мой BaseTest class:

public abstract class BaseTest {

public WebDriver driver;

protected abstract String getUrl();

@Before
public void setUp() {
Log.startLog(“Test is Starting…”);
System.setProperty(“webdriver.chrome.driver”, “src//test//resources//chromedriver”);
ChromeOptions options = new ChromeOptions();
options.setHeadless(true);

WebDriver driver = new ChromeDriver(options);

driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get(getUrl());
}

@After
public void tearDown() {
Log.endLog(“Test is Ending…”);
driver.manage().deleteAllCookies();
driver.close();
}
}


Далее попытался проверить и создал новый проект и все отработало отлично с таким кодом:

public class test {

public static void main(String[] args) {

System.setProperty(“webdriver.chrome.driver”, “/Users/alexsomov/Desktop/chromedriver2”);

ChromeOptions options = new ChromeOptions();
options.setHeadless(true);

WebDriver driver = new ChromeDriver(options);
driver.get(“https://www.google.com/”);
System.out.println("Page title is - " + driver.getTitle());

driver.close();
}

Далее прогнал дебаггером один из тестов и увидел что возможно проблема все таки в BaseTest классе и что то с драйвером делаю не то

Chrome version: Version 72.0.3626.121 (Official Build) (64-bit)
Selenium version: 3.8.1
Chromedriver version: 2.45.615355

Возможно кто то сможет обьяснить как BaseTest класс подправить? Спасибо


А кто-то вообще запускает тесты в headless mode ?

  • да, только так и запускаю
  • да, регулярно
  • да, иногда
  • нет, не пробовал
  • нет, не знаю что это такое
  • другое, отвечу в комментариях

0 участников

1 лайк

Воозможно, надо обновить хромдрайвер:

Ещё раз проверьте соответствие версии браузера и драйвера.

Обновил до ChromeDriver 2.46.628411 и проверил совместимость версий, но все равно не работает.

Если поможет то вот полный exception:

java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy8.click(Unknown Source)
at com.core.pages.LandingPage.clickPrivayPolicy(LandingPage.java:109)
at com.bo.Landing.privacyPolicyOpened(Landing.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

была такая проблема - посмотрите на совместимость локального хрома и хромдрайвера

Обновил до 2.46.628411 гугл говорит что должны быть совместимы, но все равно та же ошибка. Поидее если бы у меня были не совместимы версии, то у меня бы и не в headless mode тесты падали, но они проходят нормально :frowning:

Ещё сам Селениум старый, надо свежий.

Обновил все теперь так:
Chrome version: Version 72.0.3626.121 (Official Build) (64-bit)
Selenium version: 3.141.59
Chromedriver version: 2.46.628411
Перебилдил проект, все равно проблема не решилась :frowning:

Стектрейс не изменился? Вообще-то похоже что элемент не находится.

Нет, все тоже самое выдает, вот сделал простой тест что бы проверить например title у страницы:
Example url: https://www.wikipedia.org/

@Test
public void test() {
System.out.println(driver.getTitle());
}

вот его ошбка:
java.lang.NullPointerException
at com.bo.Landing.test(Landing.java:107)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

что у вас тут на 107 строке?

что у вас тут на 107 строке?

System.out.println(driver.getTitle());

Вы не передали драйвер в класс с тестом, если у вас драйвер создавался в другом классе.

Хмм, у меня просто все тесты от BaseTest наследуются, хорошо вот допустим обычный тест:
@Test
public void privacyPolicyOpened() throws InterruptedException {
LandingPage landingPage = new LandingPage(driver);
landingPage.clickPrivayPolicy();
Thread.sleep(1000);
Assert.assertEquals(true, landingPage.privacyPolicyTitle.isDisplayed());
}

вот ошибка:
java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy8.click(Unknown Source)
at com.core.pages.LandingPage.clickPrivayPolicy(LandingPage.java:109)
at com.bo.Landing.privacyPolicyOpened(Landing.java:65)

65 строка это landingPage.clickPrivayPolicy();
109 строка это метод в пейджобжекте
public LandingPage clickPrivayPolicy() {
privacyPolicyBtn.click();
return this;
}

Еще одна ошибка всегда есть тут
java.lang.NullPointerException
at com.bo.BaseTest.tearDown(BaseTest.java:36)

36 строка в BaseTest это после теста
driver.manage().deleteAllCookies();

:frowning:

Вопрос решен, все решилось очень просто:

В классе BaseTest, в методе setUp() который прогоняется перед тестом нужно было вместо

WebDriver driver = new ChromeDriver(options);

нужно было поменять на

driver = new ChromeDriver(options);

и все заработало.
Всем спасибо

1 лайк

Зарегистрировалась только чтобы сказать спасибо, что зашли и дописали найденное решение!
У меня никак не хотели работать классы @Before и @After и проблема решилась точно так же! Ура!!

1 лайк

Если у вас работают тесты в headless - замечательно. Но лучше и правильнее использовать xvfb
Пока hedless-режим ещё не готов к использованию в тестах.