[RESOLVIDO] org.openqa.selenium.WebDriverException: com.gargoylesoftware.htmlunit.ScriptException: ReferenceError: “Cookies” is not defined

Galera, alguém pode me ajudar?

Estou usando Junit + Selenium para testar um site da empresa que trabalho usando um navegador headless(no caso o HtmlUnitDriver). Este componente faz execuções de teste sem precisar abrir um navegador como Chrome, Firefox …
Até dias atrás eu estava conseguindo utilizar o Selenium para meus test cases do Junit, porém o pessoal do front-end alterou o mesmo e comecei a ter problema com os Jquery da página.

Segue o log do Junit

org.openqa.selenium.WebDriverException: com.gargoylesoftware.htmlunit.ScriptException: ReferenceError: “Cookies” is not defined. (https://d3mayz6ie895p.cloudfront.net/static/compressed/js/d67b1c4276fb.js#9)
Build info: version: ‘2.53.0’, revision: ‘35ae25b1534ae328c771e0856c93e187490ca824’, time: '2016-03-15 10:43:46’
System info: host: ‘localhost.localdomain’, ip: ‘127.0.0.1’, os.name: ‘Linux’, os.arch: ‘amd64’, os.version: ‘4.13.16-200.fc26.x86_64’, java.version: '1.8.0_151’
Driver info: driver.version: HtmlUnitDriver
at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:552)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:526)
at com.citizensrx.memberportal.DrugLookup.drugLookup(DrugLookup.java:32)
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:52)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: com.gargoylesoftware.htmlunit.ScriptException: ReferenceError: “Cookies” is not defined. (https://d3mayz6ie895p.cloudfront.net/static/compressed/js/d67b1c4276fb.js#9)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:921)
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:628)
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:515)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:803)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:779)
at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:975)
at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:352)
at com.gargoylesoftware.htmlunit.html.HtmlScript$2.execute(HtmlScript.java:238)
at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:257)
at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:772)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:729)
at net.sourceforge.htmlunit.cyberneko.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1209)
at net.sourceforge.htmlunit.cyberneko.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1111)
at net.sourceforge.htmlunit.cyberneko.filters.DefaultFilter.endElement(DefaultFilter.java:207)
at net.sourceforge.htmlunit.cyberneko.filters.NamespaceBinder.endElement(NamespaceBinder.java:337)
at net.sourceforge.htmlunit.cyberneko.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3137)
at net.sourceforge.htmlunit.cyberneko.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2100)
at net.sourceforge.htmlunit.cyberneko.HTMLScanner.scanDocument(HTMLScanner.java:927)
at net.sourceforge.htmlunit.cyberneko.HTMLConfiguration.parse(HTMLConfiguration.java:506)
at net.sourceforge.htmlunit.cyberneko.HTMLConfiguration.parse(HTMLConfiguration.java:459)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:979)
at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:241)
at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:187)
at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:269)
at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:157)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:512)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:386)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:304)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:451)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:537)
… 27 more
Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: ReferenceError: “Cookies” is not defined. (https://d3mayz6ie895p.cloudfront.net/static/compressed/js/d67b1c4276fb.js#9)
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3915)
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3899)
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3976)
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.name(ScriptRuntime.java:1821)
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1628)
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:800)
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105)
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:413)
at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:252)
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3264)
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:115)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:794)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:906)
… 58 more

Além do log do Junit, o console me retornar:

dez 04, 2017 11:47:26 AM com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError
GRAVE: runtimeError: message=[An invalid or illegal selector was specified (selector: ‘*,:x’ error: Invalid selector: :x).] sourceName=[https://d3mayz6ie895p.cloudfront.net/static/compressed/js/d67b1c4276fb.js] line=[1] lineSource=[null] lineOffset=[0]

Parece que o HtmlUnitdriver está entrando em conflito com o Jquery e não executando os testes. Fazendo o mesmo processo usando outro driver não headless (Chrome, Firefox), não tenho o mesmo problema.

Meu pom está configurado da seguinte forma.

junit junit 4.11 net.sourceforge.htmlunit htmlunit 2.23 test org.seleniumhq.selenium htmlunit-driver 2.23 org.seleniumhq.selenium selenium-api 2.53.0 org.seleniumhq.selenium selenium-support 2.53.0

Alguma sugestão do que eu possa estar fazendo errado ou ideia de workaround?

Obrigado!

Se não existe comunicação entre vocês pra saber o que foi alterado, então reprograma o teste do zero.

Esses browsers de mentira só dao dor de cabeça e fogem da realidade, teste em browsers de verdade do mesmo jeito que o usuário final utiliza.

A maior necessidade de usar esse tipo de browser é porque deixaremos ele rodando em uma rotina automática. No caso não terá um usuário para startar e acompanhar os testes. Será uma chamada programada após a execução de um deploy. Vou apenas devolver um log para as situações que falharem. Se for usar um destes outros navegadores, precisaria de uma VM pelo meu entendimento, certo? No caso não usaremos como QA, mas sim como um monitor

Mesmo com navegador real também é automático sem precisar de usuário pra startar. Por opcao fica schedulado, ou acionamos no momento que quiser.

Após o deploy achamos tarde para resolver problemas. E a cada checkin seria neurótico e engessado, não temos problemas que justifiquem ser assim. Entao vamos pelo meio termo. Enfim, o momento de execução fica a critério de cada um, mas tudo é possível.

Roda em VM sim, são várias VMs rodando testes em paralelo. Quando tem um problema fica fácil visualizar o que está acontecendo por ser navegador de verdade, e até mesmo debugar no navegador a causa. O que nao acho bom é ficar perdendo tempo com problemas de navegadores que o usuário nao vai usar, e do contrário é perigoso, deixar de pegar problemas no navegador de verdade que nao aconteça nesses headless.

@javaflex obrigado pela ajuda! Estamos tentando evitar de rodar uma VM por conta de ter que criar a mesma.

Encontrei uma solução neste link http://eliasnogueira.com/executando-testes-no-selenium-com-chrome-headless/ onde usa o driver do próprio Chrome como headless e utiliza a engine v8 do Chrome.

Para configurar ficou apenas assim:

@BeforeClass
public static void setUp() {

	
	System.setProperty("webdriver.chrome.driver", "<path_do_chromedriver>");
	ChromeOptions options = new ChromeOptions();
	options.addArguments("headless");
	options.addArguments("window-size=1200x600");

	driver = new ChromeDriver(options);
}

e o pom com o junit

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.11</version>
	</dependency>
	<dependency>
		<groupId>org.seleniumhq.selenium</groupId>
		<artifactId>selenium-java</artifactId>
		<version>3.4.0</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>io.github.bonigarcia</groupId>
		<artifactId>webdrivermanager</artifactId>
		<version>1.7.1</version>
	</dependency>
</dependencies>

achei uma melhor opção por ter um driver de maior confiança e não necessitar da VM.

Muito obrigado, até a próxima!