MachinePublishers / jBrowserDriver

A programmable, embeddable web browser driver compatible with the Selenium WebDriver spec -- headless, WebKit-based, pure Java
Other
809 stars 143 forks source link

Support Java 9 now that it's officially pre-GA #285

Open Gintasz opened 6 years ago

Gintasz commented 6 years ago

Hey, I'm trying to use JBrowserDriver with selenium. Chrome driver worked well, but I want JBrowserDriver. Here is my sample code:

        RemoteWebDriver driver = null;
            driver = new JBrowserDriver(Settings.builder().javaExportModules(true).build());

        driver.get("http://example.com");

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

        driver.quit();

At first I had crashes due to no class found of some CookieManager, so I added that option to settings. Now I get this:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. [2017-07-07T21:36:02.694] Unrecognized option: -XaddExports:javafx.web/com.sun.webkit.network=ALL-UNNAMED [2017-07-07T21:36:02.696] Error: Could not create the Java Virtual Machine. [2017-07-07T21:36:02.696] Error: A fatal exception has occurred. Program will exit. [2017-07-07T21:36:02.714] Unrecognized option: -XaddExports:javafx.web/com.sun.webkit.network=ALL-UNNAMED [2017-07-07T21:36:02.714] Error: Could not create the Java Virtual Machine. [2017-07-07T21:36:02.714] Error: A fatal exception has occurred. Program will exit. Exception in thread "Thread-1" org.openqa.selenium.WebDriverException: Could not launch browser. Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46' System info: host: 'Mac-MacBook-Pro.local', ip: '172.20.10.2', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.5', java.version: '1.8.0_112-release' Driver info: driver.version: JBrowserDriver at com.machinepublishers.jbrowserdriver.Util.handleException(Util.java:139) at com.machinepublishers.jbrowserdriver.JBrowserDriver.(JBrowserDriver.java:339) at com.socialser.networks.TwitterController.(TwitterController.java:18) at com.socialser.SocialSER$2$1.run(SocialSER.java:149) Caused by: java.lang.IllegalStateException: Could not launch browser. ... 3 more

I'm using simple android studio setup (but not building for android, just a simple java library for desktop). Gradle file:

buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://repository-achartengine.forge.cloudbees.com/snapshot/"
        }
    }
    dependencies {
//        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

apply plugin: 'java'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'org.eclipse:swt:3.3.0-v3346'
    compile 'org.eclipse.swt:org.eclipse.swt.cocoa.macosx.x86_64:4.3'
    compile 'mysql:mysql-connector-java:5.1.6'
    compile 'com.machinepublishers:jbrowserdriver:0.17.8'
    compile 'org.seleniumhq.selenium:selenium-java:2.41.0'
    compile 'org.seleniumhq.selenium:selenium-server:3.0.0-beta3'
//    compile 'com.sun.webkit:1.3.2'

}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"
hollingsworthd commented 6 years ago

javaExportModules was added to support Java 9 while Java 9 was in beta. They've since re-worked some things that have broken this project for Java 9. If you're using Java 8 you can remove javaExportModules entirely. Or as workaround for 9 don't use javaExportModules but instead look up what the kill switch is for Java 9 modules (Project Jigsaw) and pass that in Settings.builder().javaOptions(..)

Gintasz commented 6 years ago

@hollingsworthd If I remove it, then there are these errors:

[2017-07-07T21:48:44.533] java.lang.NoClassDefFoundError: com/sun/webkit/network/CookieManager
[2017-07-07T21:48:44.534]   at com.machinepublishers.jbrowserdriver.JBrowserDriverServer.main(JBrowserDriverServer.java:81)
[2017-07-07T21:48:44.534] Caused by: java.lang.ClassNotFoundException: com.sun.webkit.network.CookieManager
[2017-07-07T21:48:44.534]   at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[2017-07-07T21:48:44.534]   at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[2017-07-07T21:48:44.534]   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
[2017-07-07T21:48:44.534]   at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[2017-07-07T21:48:44.534]   ... 1 more
[2017-07-07T21:48:44.792] java.lang.NoClassDefFoundError: com/sun/webkit/network/CookieManager
[2017-07-07T21:48:44.792]   at com.machinepublishers.jbrowserdriver.JBrowserDriverServer.main(JBrowserDriverServer.java:81)
[2017-07-07T21:48:44.792] Caused by: java.lang.ClassNotFoundException: com.sun.webkit.network.CookieManager
[2017-07-07T21:48:44.792]   at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[2017-07-07T21:48:44.792]   at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[2017-07-07T21:48:44.792]   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
[2017-07-07T21:48:44.792]   at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[2017-07-07T21:48:44.793]   ... 1 more
hollingsworthd commented 6 years ago

Make sure Java FX is installed on the system. It comes with many of the JREs but not all. On Linux it's packaged separately.

Gintasz commented 6 years ago

How do I install that Java FX thing? I'm using whatever comes with Android Studio. I see JRE is 1.8, so I guess it's Java 8

hollingsworthd commented 6 years ago

Not sure. Usually it's hard to not have Java FX except on linux where it's an extra step to install it. I would guess Android Studio does not include it by default. Would imagine you can install your own JRE and point it to that.

Gintasz commented 6 years ago

Is this a library, JDK alternative, JRE alternative or what? Never heard of it honestly.

hollingsworthd commented 6 years ago

It's included in most JREs. Some people distributing JREs strip it out though and so does Oracle's "server JRE".

hollingsworthd commented 6 years ago

Java FX is the successor to Java Swing essentially.

Gintasz commented 6 years ago

Thanks bro, turns out default Android Studio JRE didn't have javafx, I set JRE as /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java, works. I also had to remove 'Settings.builder().javaExportModules(true).build()' to solve some random crash

first impression: god damn this is way faster than chrome engine!