Вызов другого метода, когда параллельное тестирование возвращает java.lang.NullPointerException - PullRequest
0 голосов
/ 16 января 2019

У меня возникла проблема при выполнении параллельных тестов с использованием 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 голосов
/ 16 января 2019

Похоже, вы используете метод executeGoogle (), который аннотирован @Test, но это не тест. Удалить аннотацию

Вы пытаетесь создать экземпляр googleTestClass изнутри googleTestClass (который должен иметь заглавную букву G, поэтому GoogleTestClass). Это кажется неправильным

Вам не нужен экземпляр googleTestClass для вызова методов в классе Methods. Вы можете просто позвонить им напрямую, поскольку ваш googleTestClass наследует их

Кроме того, Methods - это довольно общее имя, когда этот класс содержит методы, специфичные для тестирования браузера. Не могли бы вы назвать это BrowserTestBaseFunctions или что-то подобное?

Я бы также предположил, что ваша функция executeGoogle () входит в определенный класс Google, который может наследоваться от класса BrowserTestBaseFunctions ... Это если executeGoogle на самом деле специфичен для Google, в противном случае вы можете вызвать его как loadUrl и поместить в BrowserTestBaseFunctions с помощью параметры, чтобы сделать его более пригодным для повторного использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...