有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVAlang.NoClassDefFoundError:org。openqa。硒。安卓使用安卓的WebDriver中出现AndroidWebDriver错误

我正在尝试使用Webdriver在使用eclipse和JUnit的emulator上测试网站。 但我总是得到:

java.lang.NoClassDefFoundError: org.openqa.selenium.安卓.AndroidWebDriver
at my.empty.project.test.SdkDemoTest.setUp(SdkDemoTest.java:22)
at 安卓.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at 安卓.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at 安卓.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545)
at 安卓.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)

在我添加的Java构建路径引用库中:

  • 安卓_webdriver_库。罐子
  • 安卓_webdriver_library-srcs。罐子
  • 番石榴-12.0。罐子
  • selenium-java-2.21.0。罐子
  • selenium-server-2.21.0。罐子
  • selenium-server-standalone-2.0b2。罐子
  • selenium-server-standalone-2.21.0。罐子

代码如下。 是否有人有这样的问题,也许可以帮助解决

提前谢谢

package my.empty.project.test;
import 安卓.test.ActivityInstrumentationTestCase2;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.安卓;
import org.openqa.selenium.安卓.AndroidWebDriver;
import my.empty.project.MyAndroidProjectActivity;
public class SdkDemoTest extends ActivityInstrumentationTestCase2<MyAndroidProjectActivity>{
    private WebDriver driver;
public SdkDemoTest() {
    super("my.empty.project", MyAndroidProjectActivity.class);}
     @Override
          protected void setUp() throws Exception {
 driver = new AndroidWebDriver(getActivity());
        }
@Override
        protected void tearDown() {
           driver.quit();
        }
        public void testSDKdemoprep() {
            driver.get("http://sdkdemoprep.playphone.pluto.vn.ua/");
            WebElement element = driver.findElement(By.xpath("/html/body/img"));
            element.click();
            element = driver.findElement(By.xpath("/html/body/div[3]/div/div[9]/div[7]/div/div[2]/div/div[2]/div/div[2]"));
        }
}

共 (3) 个答案

  1. # 1 楼答案

    我花了一段时间,但我终于明白了

    尽管我的情况和你的有点不同,因为你在做:

    super("my.empty.project", MyAndroidProjectActivity.class);}
    

    当我在做:

    super("simple.app", SimpleAppActivity.class);
    

    这是Web驱动程序安装中提供的默认额外项目之一,它应该仍然适用,因为您需要修改my.empty.project

    我所做的是将Google Web驱动程序中的两个项目额外导入Eclipse,这给我留下了:

    1. SimpleApp
    2. TestAnAnroidWebApp

    第一个工作正常,但第二个工作正常,这就是

    java.lang.NoClassDefFoundError: org.openqa.selenium.android.AndroidWebDriver
    at simple.app.test.SimpleGoogleTest.setUp(SimpleGoogleTest.java:21)
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
    at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)
    

    我发现我必须将TestAndRoidWebApp项目中的库添加到SimpleApp项目中。这两个图书馆条目是:

     1. guava-r09.jar
     2. android_webdriver_library.jar
    

    但是,正如我在Android上发现的,它并不像复制和粘贴那么简单,所以我所做的就是按照下面的Answer already on Stack Overflow介绍如何导入Jar文件并将它们添加到我的库列表中

    这是为了让它们被认为是Dalvik转换并捆绑到我的simple中。应用程序(在您的例子中是my.empty.project),然后将其复制到Android Emulator

    这让我克服了这个例外

    注意:可能不需要捆绑guava-r09.jar,但我在最初尝试时就这么做了,没有它就没有重新测试过

  2. # 2 楼答案

    我经历了这个问题,终于找到了解决办法

    1) Right Click Project > Build Path > Configure Build Path > Order and Export

    2) select & check "android_webdriver_library.jar"

    3) Move the jar file just below "Android 4.X" and above "Android Dependencies" (or) place it somewhere in top order.

    4) Click the button, "select all" and ok.

    转到project>;清洁的现在运行测试

    这仅适用于“java.lang.NoClassDefFoundError:org.openqa.selenium.android.AndroidWebDriver”错误

  3. # 3 楼答案

    假设您正在使用JUnit。试着改变一下测试:

    @Before
    @Override
          protected void setUp() throws Exception {
          driver = new AndroidWebDriver(getActivity());
        }
    
    @Test
    public void testSDKdemoprep() {
            driver.get("http://sdkdemoprep.playphone.pluto.vn.ua/");
            WebElement element = driver.findElement(By.xpath("/html/body/img"));
            element.click();
            element = driver.findElement(By.xpath("/html/body/div[3]/div/div[9]/div[7]/div/div[2]/div/div[2]/div/div[2]"));
        }
    
    @After
    @Override
        protected void tearDown() {
           driver.quit();
        }
    

    换句话说:如果不使用@Before@Test@After注释,则必须以某种方式告诉程序必须以某种方式启动驱动程序。因此,您可以尝试的另一种方法是稍微更新测试方法:

     public void testSDKdemoprep() {
            setUp(); // Here you are telling to start the driver
            driver.get("http://sdkdemoprep.playphone.pluto.vn.ua/");
            WebElement element = driver.findElement(By.xpath("/html/body/img"));
            element.click();
            element = driver.findElement(By.xpath("/html/body/div[3]/div/div[9]/div[7]/div/div[2]/div/div[2]/div/div[2]"));
            tearDown(); // stop the driver
        }