2013-04-18 12 views
14

benim web sayfasında eleman kontrol etmek kodunun altına kullanıyorumisElementPresent çok yavaştır.

private boolean isElementPresent(By by) { 
try {  
     driver.findElement(by); 
     return true; 
    } catch (NoSuchElementException e) { 
     return false; 
    } 
    catch (Exception e) 
    {  
     return false; 
    } 

    } 
Belirli bir bölge

isElementPresent(By.xpath(".//*[@id='header']"))); 

aşağıda sonucu görünüp görünmediğini, bu varsa benim programda kontrol etmeniz gerekir

işlev hızlı bir şekilde tamamlanır, ancak yukarıda bulunmuyorsa çok uzun süre çalışır.

Bazı biri bu onay hızla yapılabilir, böylece bu sorunu çözme bana yardım eder misiniz?

+0

css locator yerine xpath kullanarak deneyin? – Hemanth

+1

Herhangi bir zımni bekleme kullanıyor musunuz? –

cevap

27

Burada bazı şeyleri kaçırıyorsunuz, bu yüzden beklemiyor. Eğer öğe yoksa. findElement, örtülü olarak belirtilen bir öğeyi bekler. Bu nedenle bu süreyi bu yönteme sıfır olarak ayarlamanız gerekir.

isElementPresent(WebDriver driver, By by) { 
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); 
    try { 
     driver.findElement(by); 
     return true; 
    } catch (NoSuchElementException e) { 
     return false; 
    } finally { 
     driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    } 
} 

Burada 4 önemli şey var. bulunmak için:

  1. böylece WebDriver örtük beklemez 0'a implicity_wait ayarlanıyor.

  2. Dönen öğe bulunduğunda doğrudur.

  3. NoSuchElementException yakalamak ve biz eleman yerine bir istisna ile testini durdurma sunmak olmadığını fark edince Yanlış dönüyor. WebDriver örtülü gelecekte bekleyeceği şekilde

  4. eylem sonrasında 30 geri implicitly_wait Ayar tamamlandı.

+0

Yukarıdaki kod ile çalıştı. Benim durumumda tarayıcı başlatıldığında. Url, gönderilmekte olan bir biçime sahiptir ve sonucun sunucudan geri alınması biraz zaman alır, bu nedenle zaman aşımı değerini sıfır olarak ayarlamak, öğe bulunamadığından hatayı alır. – user419534

+0

İpucu için teşekkürler! "O zaman bu yöntemi sıfıra ayarlamanız gerekir." - yakalanan hatalar; 2 saniye için setUp ve benim için bir çekicilik gibi çalışmaya başladı! –

+0

En son API güncellendi. Driver.Manage(). Timeouts(). ImplicitlyWait (yeni TimeSpan (0)); –

0

Görünüşe göre, DOM büyük ve xpath bir öğe almak için en hızlı yol değildir, çünkü istisna göndermek uzun. Ancak, xpath'i kullanmak istiyorsanız, en iyi yolu koymaya çalışın ve bu tür bir işlevden kaçınarak alt dizinin kontrol edilmesinden kaçının.

Gerçek xpath: Eğer DOM tüm etiketleri kontrol çünkü .//*[@id='header'] kadar uzun sürer. Yani etiketi, aradığınız şeyi koyduysanız, örneğin: bir giriş yakalamak istersiniz. xpath'iniz //input[@id='1234'] gibi başlamalıdır ve tüm etiketlere bakmaktan daha kısa olacaktır.

İlgili konular