Как передать экземпляр веб-драйвера методу другого класса - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь передать экземпляр веб-драйвера Selenium из Master. java в Child. java, но я получаю исключение нулевого указателя в строке 9 в Child. java. Добавление расширений к классу должно позволить мне получить доступ к переменным в Master, но это не так.

Exception in thread "main" java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at org.openqa.selenium.support.ui.FluentWait.<init>(FluentWait.java:106)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:85)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:45)
    at Child.someMethod(Child.java:9)
    at Master.main(Master.java:28)

Master. java

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Master {

  public WebDriver driver; 

  public void launchBrowser() {
    System.setProperty("webdriver.chrome.driver", "/chromedriver");
    driver = new ChromeDriver();
  }

    public void gotoPage() {
        driver.get("https://www.google.com");
    }

    public void closeBrowser() {
        driver.quit();
    }


    public static void main(String[] args) throws InterruptedException  {
        Master m = new Master();
        Child c = new Child();

        m.launchBrowser();
        m.gotoPage();
        c.someMethod();
        m.closeBrowser();
    }

}

Child. java

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Child extends Master {

    public void someMethod() throws InterruptedException {
        WebDriverWait wait = new WebDriverWait(driver,30);
  }
}

Ответы [ 3 ]

0 голосов
/ 08 мая 2020

Вы можете определить someMethod() с параметром Driver driver и передать драйвер в мастере в вызове метода.

Child. java

  public void someMethod(WebDriver driver) throws InterruptedException {
        WebDriverWait wait = new WebDriverWait(driver,30);
    }

Master. java

  Master m = new Master();
        Child c = new Child();

        m.launchBrowser();
        m.gotoPage();
        c.someMethod(driver);
        m.closeBrowser();

Хотя это противоречит цели использования наследования.

0 голосов
/ 08 мая 2020
I guess you might have solution already but this is what I am adding here for you. 
You can always invoke constructor on the child object to pass your driver from Master to Child. 



  public class Master {
          public WebDriver driver; 

          public void launchBrowser() {
              System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
                driver = new ChromeDriver();
          }

            public void gotoPage() {
                driver.get("https://www.google.com");
            }

            public void closeBrowser() {
                driver.quit();
            }


            public static void main(String[] args) throws InterruptedException  {
                Master m = new Master();
                Child c = new Child(m.driver); // THIS IS you passing driver of master 

                m.launchBrowser();
                m.gotoPage();
                c.someMethod();
                m.closeBrowser();        
            }
    }


    public class Child extends Master{
        public WebDriver driver; 
// below is your constructor  - setting Master driver here 
        public Child(WebDriver driver) {
            this.driver=driver ;
        }
        public void someMethod() throws InterruptedException {
            // your code goes here
         // below driver will set up automatically for your method
       WebDriverWait wait = new WebDriverWait(driver,30);
    }
0 голосов
/ 08 мая 2020

попробуйте инициализировать дочерний объект, вы вызвали launchBrowser () в main, который инициализирует драйвер, вызовите launchBrowser () также для дочернего объекта

...