2013-05-28 8 views
0

У меня есть сценарий проверки Selenium, написанный на C#, который вводит значение поиска, а затем просматривает определенный результат из возвращаемых результатов поиска. Моя проблема заключается в том, что я получаю «нулевое ссылочное исключение» в строке результата. Сбивает с толку, если я вывожу строку в консоль (простой оператор Console.WriteLn), она отлично печатает строку. Это только когда я пытаюсь сделать что-то со строкой, которая генерирует исключение. Любые идеи, почему это может произойти?Исключение нулевой ссылки в строке, которая корректно выводится на консоль

соответствующий код ниже:

IWebElement listElement2 = driver.FindElement(By.ClassName("FixedTables")); 
itemsList = new List<IWebElement>(listElement2.FindElements(By.TagName("a"))); 
foreach (IWebElement item in itemsList) 
{ 
    string comparator = item.GetAttribute("onclick"); 
    Console.WriteLine(comparator);//this works to print the string.... 
    //if (comparator.Contains(somestring))//this fails and throws the exception 
    //{ 
    // item.Click(); 
    // break; 
    //} 
} 

Edit: Я изменил вверх код, чтобы выглядеть следующим образом:

string comparator = item.GetAttribute("onclick"); 
    Console.WriteLine(comparator); 
    if (comparator == null) Console.WriteLine("Is Null"); 
    if (somestring == null) Console.WriteLine("Somestring is Null"); 

Это мой выход из консоли:

get_emp_risk_details ('560 ',' ');

Is Null

get_emp_risk_details ('490', '');

Is Null

+0

Глупый вопрос: что такое 'somestring', установленный в вашем примере кода? Это нулевое значение? Если я попробую 'MyString.Contains (MyNullStringVar)' я получаю 'ArgumentNullException' –

+0

Некоторая строка - это переменная, которая имеет значение - я также пробовал варианты кода со строковым литералом (« что-то ») и все еще получаю исключение , Кроме того, я тестировал, просто ссылаясь на символ из массива строк (т. Е. Console.WriteLn (компаратор [1])), и это также вызвало исключение. Это очень странно .... – kdavej

+0

Что выводится при записи компаратора на консоль? WriteLine не будет генерировать исключение, если вы передадите ему нулевую переменную. – hatchet

ответ

0

Если somestring имеет нулевое значение, Contains выбросит нулевое ссылочное исключение. Это будет соответствовать вашим симптомам (у компаратора есть значение, но вы по-прежнему получаете исключение с использованием нулевой ссылки).

String.Contains

Примечание в разделе Исключения, что ArgumentNullException отбрасывается, если значение равно нулю, для Contains(value).

Более безопасный способ кодирования, который для .Net 4.0 и позже будет

if (comparator == null) { 
    Console.WriteLine("comparator="+comparator); 
} else { 
    if ((!String.IsNullOrWhiteSpace(somestring)) && comparator.Contains(somestring)) } 
    item.Click(); 
    break; 
} 

или

if ((somestring != null) && (somestring.Length > 0) 
    && comparator.Contains(somestring)) 
{ 
    item.Click(); 
    break; 
} 

для более ранних версий .Net.

+0

см. Мой комментарий выше - somestring не является нулевым, и я попытался использовать литерал в его месте. Также любая операция на компараторе выдает исключение, например, comparator.length или компаратор + «sometext». – kdavej

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