2011-06-15 17 views
10

'da bir öğenin mevcut olmadığını nasıl doğrularım? Selenium 2'de Sayfanın, sürücünün yüklediği bir öğenin bulunmadığından emin olmak istiyorum. Buradaki saf uygulamamı dahil ediyorum.Selenium 2

WebElement deleteLink = null; 
    try { 
     deleteLink = driver.findElement(By.className("commentEdit")); 
    } catch (NoSuchElementException e) { 

    } 
    assertTrue(deleteLink != null); 

Temel olarak NoSuchElementException öğesinin atıldığını iddia eden doğrulamanın daha zarif bir yolu var mı?

cevap

26

Eğer JUnit kullanarak test ediyoruz ve bu size deneme

@Test (expected=NoSuchElementException.class) 
public void someTest() { 
    driver.findElement(By.className("commentEdit")); 
} 

kullanarak istisna bekliyoruz yapabilir Yoksa elemanları veya bir bir listesini döndürür findElements yöntemi kullanabilirsiniz test ediyoruz tek şey ise hiçbiri (NoSuchElementException atmaz) bulunursa boş listesi:

... 
List<WebElement> deleteLinks = driver.findElements(By.className("commentEdit")); 
assertTrue(deleteLinks.isEmpty()); 
... 

veya

.... 
assertTrue(driver.findElements(By.className("commentEdit")).isEmpty()); 
.... 
+0

Mükemmel, tam olarak ne arıyordum! Çok teşekkürler! – Han

+0

İyi bir çözüm. Bununla birlikte, UnsElement (ler) in çağrılması, öğenin görünmesi için zımni olarak beklemesi gibi, ImplicitWait ile ilgili sorunları vardır. – tishma

+1

Bekleme süresini 1 saniyeye veya istediğiniz zaman aşımına getirerek bunu yapabilirsiniz. Bunu varsayılan olarak ayarladım, böylece çözümümde .exists() yöntemini eklemek için bir .net uzantı yöntemi oluşturdum. .. Driver.Manage() zaman aşımı() ImplicitlyWait (TimeSpan.FromSeconds (1)); –

2

Sayfa sınıflarını ayırıyorum, böylece öğeleri bir kereden fazla tanımlamam gerekiyor. Benim rahibe ve mbunit test sınıfları bu sayfa sınıflarını çağırır. Bunu henüz denemedim ama bunu yapmayı düşünüyorum, böylece WatiN ile yaptığım gibi.

Uzatma Sınıfı:

public static class ExtensionMethods 
{ 
    public static IWebElement ElementById(this IWebDriver driver, string id) 
    { 
     IWebElement e = null; 
     try 
     { 
     e = driver.FindElement(By.Id(id)); 
     } 
     catch (NoSuchElement){} 
     return e; 
    } 
    public static bool Exists(this IWebElement e) 
    { 
     if (e == null) 
     return false; 
     return true; 
    } 
} 

Sayfa Sınıfı:

public IWebElement SaveButton { get { try { return driver.ElementById("ctl00_m_m_body_body_cp2_btnSave")); } } 

Testi Sınıfı:

MyPageClass myPageClass = new MyPageClass(driver); 
if (myPageClass.SaveButton.Exists()) 
{ 
    Console.WriteLine("element doesn't exist"); 
} 
+0

driver.Manage(). Zaman aşımları() ImplicitlyWait (TimeSpan.FromSeconds (1)); –

-3

Kullanım assertF alse :)

assertFalse(isElementPresent(By.className("commentEdit"))); 
+0

Böyle bir yöntem mevcut değil! – SiKing

4

Bunu kullanabilirsiniz:

Boolean exist = driver.findElements(By.whatever(whatever)).size() == 0; 

doğru dönecektir yoksa.

1

Öğeleri bir listeyi drive.findElements ("Öğeleriniz") kullanarak alabilir ve ardından öğeyi arayabilirsiniz. Eğer liste öğeyi içermiyorsa, istediğiniz davranışa sahip olursunuz :)