i got java.lang.NoSuchMethodError
after setting up my first appium project
the code is simple, it fails at this line:
driver = new AppiumDriver(new URL("http://x.x.x.x:4723/wd/hub"), capabilities);
The trace is:
java.lang.NoSuchMethodError: com.google.common.base.Joiner$MapJoiner.appendTo(Ljava/lang/StringBuilder;Ljava/lang/Iterable;)Ljava/lang/StringBuilder;
at com.google.common.net.MediaType.toString(MediaType.java:674)
at org.openqa.selenium.remote.http.JsonHttpCommandCodec.encode(JsonHttpCommandCodec.java:197)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:152)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572)
my pom.xml is:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>LATEST</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<scope>test</scope>
</dependency>
<!-- Includes the Sauce JUnit helper libraries
<dependency>
<groupId>com.saucelabs</groupId>
<artifactId>sauce_junit</artifactId>
<version>1.0.18</version>
<scope>test</scope>
</dependency>-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
</dependencies>
i've google it, and some say that i use an older guava.jar, but i decomplie guava-15.0.jar and find the Joiner.appendTo(StringBuilder, Iterable) exist, why it always showing this error?
@Before
public void setUp() throws Exception {
// set up appium
final File classpathRoot = new File(System.getProperty("user.dir"));
final File appDir = new File(classpathRoot, "../../../apps/ContactManager");
final File app = new File(appDir, "ContactManager.apk");
final DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("deviceName", "Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage",
"com.example.android.contactmanager");
capabilities.setCapability("appActivity", ".ContactManager");
driver = new AndroidDriver(new URL("http://x.x.x.x:4723/wd/hub"),
capabilities);
}
also after running command "mvn -U clean test", i can see this error
Tests in error:
addContact(com.saucelabs.appium.AndroidContactsTest):com.google.common.base.Joiner$MapJoiner.appendTo(Ljava/lang/StringBuilder;Ljava/lang/Iterable;)Ljava/lang/StringBuilder;
addContact(com.saucelabs.appium.AndroidContactsTest)
Tests run: 2, Failures: 0, Errors: 2, Skipped: 0
There's only one test case whose name is addContact, why it keep showing Test run: 2? through debugging, i found it happens when running this sentence "driver.quit()", after removeing this method, it shows Test run: 1
The dependency tree is list below, i don't see anything about MapJoiner except guava-17.0, actually i can find MapJoiner.appendTo(Stringbuilder, iterate<>) in this jar file
[INFO] com.lvntest.appium:sauce_appium_junit:jar:0.0.1-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.seleniumhq.selenium:selenium-java:jar:2.43.1:test
[INFO] | +- org.seleniumhq.selenium:selenium-chrome-driver:jar:2.43.1:test
[INFO] | | \- org.seleniumhq.selenium:selenium-remote-driver:jar:2.43.1:test
[INFO] | | +- cglib:cglib-nodep:jar:2.1_3:test
[INFO] | | \- org.seleniumhq.selenium:selenium-api:jar:2.43.1:test
[INFO] | +- org.seleniumhq.selenium:selenium-htmlunit-driver:jar:2.43.1:test
[INFO] | | \- net.sourceforge.htmlunit:htmlunit:jar:2.15:test
[INFO] | | +- xalan:xalan:jar:2.7.1:test
[INFO] | | | \- xalan:serializer:jar:2.7.1:test
[INFO] | | +- commons-collections:commons-collections:jar:3.2.1:test
[INFO] | | +- org.apache.commons:commons-lang3:jar:3.3.2:test
[INFO] | | +- org.apache.httpcomponents:httpmime:jar:4.3.3:test
[INFO] | | +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.15:test
[INFO] | | +- xerces:xercesImpl:jar:2.11.0:test
[INFO] | | | \- xml-apis:xml-apis:jar:1.4.01:test
[INFO] | | +- net.sourceforge.nekohtml:nekohtml:jar:1.9.21:test
[INFO] | | +- net.sourceforge.cssparser:cssparser:jar:0.9.14:test
[INFO] | | | \- org.w3c.css:sac:jar:1.3:test
[INFO] | | \- org.eclipse.jetty:jetty-websocket:jar:8.1.15.v20140411:test
[INFO] | | +- org.eclipse.jetty:jetty-util:jar:8.1.15.v20140411:test
[INFO] | | +- org.eclipse.jetty:jetty-io:jar:8.1.15.v20140411:test
[INFO] | | \- org.eclipse.jetty:jetty-http:jar:8.1.15.v20140411:test
[INFO] | +- org.seleniumhq.selenium:selenium-firefox-driver:jar:2.43.1:test
[INFO] | | +- commons-io:commons-io:jar:2.4:test
[INFO] | | \- org.apache.commons:commons-exec:jar:1.1:test
[INFO] | +- org.seleniumhq.selenium:selenium-ie-driver:jar:2.43.1:test
[INFO] | | +- net.java.dev.jna:jna:jar:3.4.0:test
[INFO] | | \- net.java.dev.jna:platform:jar:3.4.0:test
[INFO] | +- org.seleniumhq.selenium:selenium-safari-driver:jar:2.43.1:test
[INFO] | +- org.seleniumhq.selenium:selenium-support:jar:2.43.1:test
[INFO] | \- org.webbitserver:webbit:jar:0.4.15:test
[INFO] | \- io.netty:netty:jar:3.5.5.Final:test
[INFO] +- io.appium:java-client:jar:2.0.0:compile
[INFO] | +- org.apache.httpcomponents:httpclient:jar:4.3.3:compile
[INFO] | | +- org.apache.httpcomponents:httpcore:jar:4.3.2:compile
[INFO] | | +- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] | | \- commons-codec:commons-codec:jar:1.6:compile
[INFO] | +- com.google.guava:guava:jar:17.0:compile
[INFO] | +- cglib:cglib:jar:3.1:compile
[INFO] | | \- org.ow2.asm:asm:jar:4.2:compile
[INFO] | \- org.reflections:reflections:jar:0.9.8:compile
[INFO] | +- javassist:javassist:jar:3.12.1.GA:compile
[INFO] | \- dom4j:dom4j:jar:1.6.1:compile
[INFO] +- com.googlecode.json-simple:json-simple:jar:1.1.1:test
[INFO] +- commons-lang:commons-lang:jar:2.6:test
[INFO] +- com.saucelabs:sauce_junit:jar:2.1.10:compile
[INFO] | +- com.saucelabs:sauce_java_common:jar:2.1.10:compile
[INFO] | \- com.saucelabs:saucerest:jar:1.0.22:compile
[INFO] | \- org.json:json:jar:20090211:compile
[INFO] \- com.google.code.gson:gson:jar:2.3:compile
Which version of selenium are you using ?
Edit your pom.xml in one of the following ways..
For the above dependency use AndroidDriver() in place of AppiumDriver() or use the following with AppiumDriver()
Cheers
This is selenium and appium versions mismatch. Even latest versions of both can result in such an error. You can find latest matching versions below:
Feel free to edit this answer with newest matching versions.