每次尝试在代码行element.click()下运行以下代码时,我都会得到NullPointerException
注意:如果我注释了最后一行代码,则通过。 还提出了类似的问题here,但没有帮助。
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();
}
我的驱动程序onject也不为空,如下面的屏幕截图所示
该元素也不为null,如下面的屏幕快照所示:-
我什至放了thread.sleep()以防万一是由于加载。 findelementbyid()方法中提供的ID是正确的。并启动应用程序,然后
它启动应用程序,然后引发以下错误消息:-
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)
我正在使用selenium-java-3.9.1和appium服务器1.7.1,testNG Windows 10,appium-java-client版本4.1.0
答案 0 :(得分:1)
请勿显式设置硒依赖项,因为appium-java-client依赖项已内置在其中:您遇到了库不兼容问题。
如果有必要更改Selenium的版本,则可以如下配置pom.xml:
<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>
可以使用 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
...
}
答案 1 :(得分:0)
根据您的代码块,您似乎正在将 Java 用作 Selenium Language Binding Art 。现在,根据Java Docs, WebElement 支持的方法是:
findElementById()
与 JavaScript Selenium Language Binding Art 相关联。
如果您希望使用元素的id
属性,则需要替换以下行:
WebElement element = driver.findElementById("com.makemytrip:id/my_profile_icon");
通过:
WebElement element = driver.findElement(By.id("com.makemytrip:id/my_profile_icon"));
答案 2 :(得分:0)
此问题的可能是它找不到您的包裹或活动,请尝试放置以下所需功能:
appActivity =您要等待的Android活动的活动名称 (例如“ MainActivity,.Settings”)
appPackag =您要运行的Android应用的Java程序包 (例如“ com.example.android.myApp,com.android.settings”)
appWaitActivity =您要等待的Android活动的活动名称 (例如飞溅)
可能您所做的一切都很好,但是显示了错误的活动。
优良作法是放置appPackage和appActivity。
希望这会有所帮助,
P.S .:并且还请实施@dmle的解决方案/答案,这也可能导致此类问题。