2015-03-31 4 views
0

Я сделал автоматизированный тест с селеном C# и получил пробку. Мой тест записывает некоторую информацию в форму и затем отправляет, если после отправки div, содержащего некоторую информацию, есть информация «Formoje yra klaidu», она должна писать в файл электронной почты из формы, но проблема в том, что этот div не отображается, когда электронная почта isn ' t неправильно, и мой тест просто останавливается на месте, где Iwebelement находит элемент по xpath, потому что элемент не отображается. Вот некоторые из кодаSelenium C# automatic test

for (int i = 0; i < array.Length; i++) 
     { 

     IWebElement PasirinktiParkinga = driver.FindElement(By.CssSelector("#zone_16 > td:nth-child(5) > a:nth-child(1)")); 
     PasirinktiParkinga.Click(); 

     IWebElement Vardas = driver.FindElement(By.Id("firstname1")); 
     Vardas.Clear(); 
     Vardas.SendKeys("Vardas"); 

     IWebElement Pavarde = driver.FindElement(By.Id("lastname1")); 
     Pavarde.Clear(); 
     Pavarde.SendKeys("Pavarde"); 

     IWebElement AutoNumeris = driver.FindElement(By.Id("vehicle_number1")); 
     AutoNumeris.Clear(); 
     AutoNumeris.SendKeys("ASD123"); 

     IWebElement Pastas = driver.FindElement(By.Id("email1")); 
     Pastas.Clear(); 
     Pastas.SendKeys(array[i]); 

     IWebElement Taisykles = driver.FindElement(By.CssSelector("div.checks:nth-child(5) > div:nth-child(1) > label:nth-child(2)")); 
     Taisykles.Click(); 

     IWebElement uzsakyti = driver.FindElement(By.CssSelector(".submit-zone > input:nth-child(1)")); 
     uzsakyti.Click(); 

     System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5)); 


      IWebElement MessageRed = driver.FindElement(By.XPath("//*[@id='step_2']/div[3]")); //This line is were i wan't to find this div but i must write it so that if there isn't there - just do the for cicle 
      if (MessageRed.Text.Contains("Formoje yra klaidų.")) 
      { 
       failure += array[i] + "\n"; 

       System.IO.File.WriteAllText(@"C:\Users\jarek\Desktop\Failureemail\failure.txt", failure); 
      } 




     IWebElement unipark = driver.FindElement(By.CssSelector(".logo > a:nth-child(1)")); 
     unipark.Click(); 

     i++; 
     } 

Как это сделать, если этого элемента нет, код не останавливается. Может ли кто-нибудь помочь мне?

ответ

0

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

if (driver.FindElement(By.XPath("//*[@id='step_2']/div[3]")).size() > 0) 
{ 
    //perform your action now 
} 

else 
{ 
    //perform action if the element is not present 
} 
+0

Я не знаю, почему, но это не работает для меня –

2

Ну, в первую очередь не используйте Thread.Sleeps вообще. Вместо этого используется неявное и явное. Во-вторых, попробуйте не использовать xpath (очень сложно поддерживать, понимать его). И если вам нужно проверить существование элементов, вы можете сделать это следующим образом, например.

var elements = driver.FindElements(By.XPath("//*[@id='step_2']/div[3]")); 
    if(elements.Count() > 0) 
     // do everything you want 
    else 
     //continue doing smth 

или вы можете попробовать catch ElementNotFound exception ... все зависит.

0

Я сделал это так, и она работала

if (driver.FindElements(By.XPath("//*[@id='step_2']/div[3]")).Count != 0) 
0

Будьте осторожны с FindElements, тест может быть очень много времени, чтобы выполнить, если у вас есть огромные страницы. Когда я должен использовать FindElements для поиска элемента, я использую FindElement, который может помочь мне в области, где я должен найти исследуемый элемент с помощью FindElements. В моем случае мое время выполнения сокращается на 2 секунды каждый раз, когда я использую непосредственно FindElements

0

Использовать неявное ожидание. Это позволяет вводить значение в секундах, которое веб-сервер будет ожидать для элемента, если он не найден изначально. Этот пример установлен на 2 секунды.

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(2) 

Вы также можете использовать try {} catch {}.

Также, если вы хотите очистить свой код, вы можете написать функции для поиска элементов, а затем просто передать это имя в функцию. Это упростит и упростит чтение.

Вот мой метод для нахождения элемента по ID

static void ClickElement_ByID(string elementName) 
    { 
     try 
     { 
      IWebElement test = driver.FindElement(By.Id(""+elementName+"")); 
      Console.WriteLine("Found: "+elementName); 
      test.Click(); 
     } 
     catch (Exception e) 

     { 
      Console.WriteLine(e); 
     }