2013-05-31 16 views
3

Когда я запускаю эту программу в NUnit я получаю ошибкуСсылка на объект не указывает на экземпляр объекта

Ссылка на объект не указывает на экземпляр объекта.

Хотя это не оригинальная программа, я также получаю подобную ошибку. Любая помощь оценивается. Исключение происходит в

driver.Navigate().GoToUrl("http://www.yahoo.com/"); 

Программа:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using NUnit.Framework; 
using OpenQA.Selenium.Firefox; 
using OpenQA.Selenium; 

namespace Class_and_object 
{ 
    [TestFixture] 
    public class Class1 
    { 
    IWebDriver driver = null; 
    [Test] 
    public void test1() 
    { 
     class2 obj = new class2(); 
     driver = new FirefoxDriver(); 
     driver.Navigate().GoToUrl("http://www.google.com/"); 
     obj.method(); 
    } 
    } 
    public class class2 
    { 
    IWebDriver driver = null; 
    public void method() 
    { 
     driver.Navigate().GoToUrl("http://www.yahoo.com/"); 
    } 
    } 
} 
+1

Забыл 'driver = new FirefoxDriver();' в методе class2()? – rene

+4

В будущем, когда вы пишете вопрос, связанный с исключением, пожалуйста, покажите нам * где * возникло исключение. –

ответ

2

Если у вас есть объект в классе Он должен быть экземпляр перед вами может использовать его. Вероятно, одно из лучших мест для этого - это конструктор.

так:

public class class2 
{ 
    IWebDriver driver = null; 


    public class2(IWebDriver driver) 
    { 
     this.driver = driver; 
    } 
    public void method() 
    { 
    driver.Navigate().GoToUrl("http://www.yahoo.com/"); 
    } 
} 

, а затем ваш другой класс будет выглядеть следующим образом

public void test1() 
{ 
    driver = new FirefoxDriver(); 
    class2 obj = new class2(driver); 

    driver.Navigate().GoToUrl("http://www.google.com/"); 
    obj.method(); 
} 
+0

Вы не можете создать новый экземпляр интерфейса ... вам нужно создать экземпляр класса, реализующего интерфейс. –

+0

@newStackExchangeInstance Я не думаю, что ответчик предоставлял фактический код, но направлял OP, что делать. Никто не знает, что такое конкретный тип. – nawfal

+0

Вы правы, я понял, что IWebDriver - это интерфейс. Исправлено: –

5

Посмотрите на свой код:

public class class2 
{ 
    IWebDriver driver = null; 
    public void method() 
    { 
     driver.Navigate().GoToUrl("http://www.yahoo.com/"); 
    } 
} 

Конечно, вы получаете NullReferenceExceptiondriver - всегда null.

Непонятно, что вы ожидали отсюда здесь - но, возможно, вы хотели передать FirefoxDriver, который вы создаете в test1 в method через параметр?

+0

Спасибо за предложение. Да, я получаю исключение NullReferenceException. Итак, что должно быть написано вместо драйвера Iwebdriver = null; – jessica

+0

@jessica: Ну, мы не знаем, на какой объект вы хотите вызвать метод. Тот, который вы создали в 'test1', или другой? Если вы довольно новичок в C# (похоже, это так, если вы были удивлены тем, что получили здесь исключение), я бы настоятельно сказал, что автоматизация веб-тестов не является отличной отправной точкой - я предлагаю изучить ядро ​​языка более первым. –

+0

Вы должны создать экземпляр объекта драйвера перед вызовом его метода навигации. –

2

Вы назначая driver в вашем Class1, поэтому, когда он пытается перейти на class2 «s method это не удается, поскольку class2» s driver является null. Перед вызовом каких-либо методов вам необходимо присвоить ему значение.

Я не знаю, почему вы не хотели бы ожидать его с ошибкой NullReferenceException.

То, что вы, вероятно, имел в виду, чтобы написать было:

public class class2 
    { 
    public void method(IWebDriver driver) 
    { 
     driver.Navigate().GoToUrl("http://www.yahoo.com/"); 
    } 
    } 

и где вы вызываете метод в Class1:

obj.method(driver); 
+0

Да, я получаю исключение NullReferenceException. Итак, что должно быть написано вместо драйвера Iwebdriver = null; – jessica

+0

Добавлена ​​@jessica. –

+0

Спасибо. Я ценю вашу помощь. – jessica

2

Вам необходимо передать ссылку на driver в Class1 для Class2 и назначить его на driver там , Когда вы проходите по ссылке, вы передаете адрес памяти, так что driver в Class2 становится таким же driver в Class1, потому что они оба указывают на тот же адрес в памяти компьютера.

Для передачи драйвера по каталогу Class1 вам нужно ниже;

obj.method(driver); 

Вам нужно изменить Class2, чтобы он мог получить IWebDriver в method().

+0

Спасибо. Он работает сейчас. – jessica

Смежные вопросы