2017-02-19 6 views
0

Я просмотрел сайт, но не нашел ответ, который я ищу.Как передать экземпляр webelriver selenium другому классу

У меня есть

  1. сверхоснование class- здесь я просто создать объект с WebDriver
  2. Baseclass- В этом классе я расширяю класс сверхоснование, вызовите драйвер и откройте URL.
  3. Clicklink class - В этом классе я снова расширяю класс Superbase, но только для того, чтобы найти исключение нулевого указателя. Я думаю, что получаю исключение, поскольку объект драйвера не инициализируется.

Я просто новичок и не пробовал браузер и другие варианты, так как хочу начать с простого потока.

Superclass

Public class Superclass 
    { 
public webdriver Driver; 
} 

BaseClass

public class Baseclass extends Superclass 
{ 
setting capabilities and launching the browser 
} 

ClickLink

public class Clicklink extends Superclass 
{ 
here I want to click on a link 
driver.findelement(by.xpath("xpath").click()); 
// after this statement I get a null pointer exception 
} 

Можете ли вы направить меня здесь? как я могу добиться того же.

Спасибо большое!

+1

Показывайте методы пожалуйста. –

+1

Является ли «настройка возможностей и запуск браузера» в методе '@ Before *' или в конструкторе? –

+0

Возможно, сделав объект суперкласса в дочернем элементе, а затем вызывая его через него. Суперкласс sl = новый суперкласс(); sl.driver.findelement (by.xpath ("xpath").нажмите()); – kushal

ответ

0

Это много догадок, сделанных с моей стороны, но, пожалуйста, убедитесь, что ваш Суперкласс фактически устанавливает драйвер и возвращает его. Вы действительно можете сделать это в обоих методах:

public class Superclass 
{ 
    public WebDriver driver; 
    public Superclass(){ 
    driver = new FirefoxDriver(); 
    } 
    public WebDriver getdriver(){ 
    if (driver == null){ 
     driver = new FirefoxDriver(); 
     return driver; 
    }else{ 
     return driver; 
    } 
    } 
} 

И позже в методах вы называете его:

public class Clicklink extends Superclass 
{ 

getdriver().findelement(by.xpath("xpath").click()); 

} 
+0

Спасибо @Pavel, это помогает – Ashwin

0

Не используйте язык кодирования для обозначения своих классов; SuperClass и BaseClass - очень бедные имена. Вместо этого назовите вещи, используя язык проблемы. В этом случае тестирование веб-сайта, даже лучше LoginPage, CartPage, ProfilePage и т. Д. Используйте Page Object Pattern. Используйте BrowserFactory обеспечить экземпляры WebDriver

public abstract class PageObject { 
    public WebDriver driver; 
    PageObject() { 
     // Page can initialise its self 
     this.driver = BrowserFactory.webDriver(); 
    } 
    PageObject(final WebDriver webDriver) { 
     this.driver = webDriver; 
     } 
    } 
0

Если вы не хотите экземпляра драйвера перейти на страницу объектов конструктора можно создать какой-то контейнер класса для водителя и поставить его перед испытанием и удалить его после запуска. Например:

class Driver { 
    public static ThreadLocal<IWebDriver> driverInstance = new ThreadLocal<IWebDriver>(); 

    public static IWebDriver GetDriver() { 
     return driverInstance.Value; 
    } 

    public static void SetDriver(IWebDriver driver) { 
     driverInstance.Value = driver; 
    } 
} 

и сделать это поле контейнера ThreadLocal, чтобы избежать проблем с параллельной перспективой.

0
I did use below code in utility class like below 
    public static WebDriver setup(WebDriver driver) 
    { 
     if(driver == null) { 
      driver = new FirefoxDriver(); 
      driver.manage().window().maximize(); 
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
      return driver; 
     }else 
      return driver; 

     //System.out.println("in method "+ driver.getTitle()); 

    } 
+0

публичный класс Ebay { WebDriver driver = null; @Test public void testlogic() { driver = Container.setup (driver); driver.get ("https://www.ebay.co.uk"); } – dev

+1

Вам действительно нужно отредактировать это. – klutt