问题
I am getting NullPointerException everytime I try to run below code at code line element.click()
Note : It passes if I comment the last line of code. Also similar question was asked here but it didn't help.
AndroidDriver driver;
@Test
public void TestAppium() throws Exception{
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "MotoG5s Plus");
capabilities.setCapability("platformVersion", "7.1.1");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("noReset", "true");
File file = new File("D:\\Appium Workspace\\AppiumDemo\\apk\\MakeMyTrip Flights Hotels Cabs IRCTC Rail Bookings_v7.3.2_apkpure.com.apk");
capabilities.setCapability("app", file.getAbsolutePath());
driver = new AndroidDriver(new URL("http://10.80.196.55:4723/wd/hub"), capabilities);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
Thread.sleep(10000);
WebElement element = driver.findElementById("com.makemytrip:id/my_profile_icon");
element.click();
}
Also my driver onject is not null as you can see from below screenshot
Also the element is not null as you can see in screenshot below :-
I have even put the thread.sleep() in case it is because of loading. The ID given in findelementbyid() method is correct. And also it launches the app and then it
It Launches the app and then it throws below error message :-
java.lang.NullPointerException
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:279)
at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:83)
at Appiumcapabilities.TestAppium(Appiumcapabilities.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:580)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:716)
I am using selenium-java-3.9.1 and appium server 1.7.1, testNG Windows 10, appium-java-client version 4.1.0
回答1:
Do not set selenium dependency explicitly as appium-java-client dependency already has it in-built: you are running into library incompatibility issue.
If it is necessary to change the version of Selenium then you can configure pom.xml like following:
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>${version.you.require}</version>
<scope>test</test>
<exclusions>
<exclusion>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium.version.you.require}</version>
</dependency>
Same thing can be done with Gradle:
repositories {
jcenter()
maven {
url "http://repo.maven.apache.org/maven2"
}
}
dependencies {
...
testCompile group: 'io.appium', name: 'java-client', version: requiredVersion {
exclude module: 'selenium-java'
}
testCompile group: 'org.seleniumhq.selenium', name: 'selenium-java',
version: requiredSeleniumVersion
...
}
回答2:
As per your code block it seems you are using Java as the Selenium Language Binding Art. Now, as per the Java Docs the supported methods of a WebElement are:
- findElement(By by)
- findElements(By by)
Where as findElementById()
is associated with the JavaScript Selenium Language Binding Art.
Solution
If you desire to work with the id
attribute of an element, you need to replace the line:
WebElement element = driver.findElementById("com.makemytrip:id/my_profile_icon");
By:
WebElement element = driver.findElement(By.id("com.makemytrip:id/my_profile_icon"));
回答3:
Maybe issue to this problem is that it can't find Your package or activity, try putting these desired capsabilities:
appActivity = Activity name for the Android activity you want to wait for (eg. "MainActivity, .Settings")
appPackag = Java package of the Android app you want to run (eg. "com.example.android.myApp, com.android.settings")
appWaitActivity = Activity name for the Android activity you want to wait for (eg. Splash)
It might be that You did everything OK, but wrong activity is shown.
Good practice is to put appPackage, and appActivity.
Hope this helps,
P.S.: and please also implement solution/answer from @dmle, it also could cause this kind of issues.
来源:https://stackoverflow.com/questions/51379757/webelement-click-giving-java-lang-nullpointerexception-in-appium