并行测试返回java.lang.NullPointerException时调用另一个方法

时间:2019-01-16 17:37:08

标签: java selenium parallel-processing testng

使用Java,Selenium和TestNG执行并行测试时遇到问题。我有2种测试方法,可以在google中搜索两个不同的关键字。我希望这两种测试方法都可以调用第三种方法,以避免重复相似的代码。

public class googleTestClass extends Methods{

@Test
public void executeGoogle() throws InterruptedException {
    googleTestClass object;
    object = new googleTestClass();
    object.goToURL("https://www.google.com");
    object.enterValue("name","q","google test 1");
}

@Test
public void test1() throws InterruptedException {

    googleTestClass object1;
    object1 = new googleTestClass();
    object1.launchBrowser();
    object1.executeGoogle();
}

@Test
public void test2() throws InterruptedException {

    googleTestClass object2;
    object2 = new googleTestClass();
    object2.launchBrowser();
    object2.executeGoogle();
}
}

当我的代码命中object1.executeGoogle();和object2.executeGoogle();命令,则返回java.lang.NullPointerException。我知道该错误与该对象有关,但是我不确定如何继续。

这里是正在使用的其他类。

方法类:

// import statements

public class Methods {

public WebDriver driver;

public void launchBrowser() {

     System.setProperty("webdriver.chrome.driver","C:\\chromedriver_win32\\chromedriver.exe");
    System.setProperty("webdriver.chrome.args", "--disable-logging");
    System.setProperty("webdriver.chrome.silentOutput", "true");
    driver = new ChromeDriver();
}

public void goToURL(String url) {
    driver.get(url);
}

    public void enterValue(String htmltype, String identifier, String value) throws InterruptedException {
    if (htmltype == "id") {
        WebElement element = driver.findElement(By.id(identifier));
        element.clear();
        element.sendKeys(value);
        element.submit();
    }
    if (htmltype =="name") {
        WebElement element = driver.findElement(By.name(identifier));
        element.clear();
        element.sendKeys(value);
        element.submit();
    }

    Thread.sleep(3000);
}

}

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="methods">

  <test thread-count="5" name="Test" parallel="methods">
    <classes>
         <class name="webDrivertests.googleTestClass">
            <methods>
                <include name ="test1"/>
                <include name ="test2"/>
            </methods>
        </class>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

看起来您正在使用executeTest()方法,该方法带有@Test注释,但这不是测试。删除注释

您正在尝试从googleTestClass(应该有大写G,因此是GoogleTestClass)中实例化googleTestClass。这似乎是错误的

您不需要googleTestClass实例即可调用Methods类中的方法。您可以直接调用它们,因为您的googleTestClass继承了它们

当此类包含特定于浏览器测试的方法时,“方法”也是一个通用名称。您可以将其命名为BrowserTestBaseFunctions还是类似的名称?

我还建议您将executeGoogle()函数放入特定于Google的类中,该类可以从BrowserTestBaseFunctions类中继承……这是如果executeGoogle实际上是特定于Google的,否则您可以将其称为loadUrl并放入带有的BrowserTestBaseFunctions中使其更可重用的参数