2011-11-28 55 views
0

我一直在測試一個涉及多個Ajax調用的應用程序,所以我需要等待條件,以便在發出ajax調用時存在/可見元素。我用這兩種方法implicitwaitexplicitwait但沒有人似乎是爲我工作的一個或其他異常產生如下:implicitwait和explicitwait沒有解決與Java的Selenium Webdriver中的問題

1.Unable定位元素

2.Element被禁用,所以可能不能用於使用的操作

隱等待如下:

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
WebElement we = driver.findElement(By.name("q")); 

問題: 當我測試此代碼,瀏覽器打開後,它會拋出異常在2秒。

結果:異常產生

顯等待

WebDriverWait wait = new WebDriverWait(driver, /*seconds=*/3); 
WebElement element = wait.until(presenceOfElementLocated(By.name("q")); 

問題:

當我測試此代碼,瀏覽器打開後,它會引發在2秒內的異常

結果:產生異常。

也使用visibilityOfElementLocated,但它不適用於我。


有沒有人遇到過這個問題,或者有人有這方面的解決方案?

+0

請問您可以在ExplicitWait中增加時間值嗎? –

回答

0

我不能說我以前遇到過這個問題,但我也寫了我自己的自定義DOM輪詢類。這就是我所做的。

private int Timer = 180; 

private bool CheckForElement(WebDriver driver,string byType,string selector) 
{ 
    bool elementFound = false; 

    for (int i = Timer - 1; i > 0; i--) 
    { 
     if (!itemFound) 
     { 
      Thread.Sleep(1000); //sets the loop to check every second this can be done at a much faster or slower rate depending on your preferences 
      if (byType.ToLower() == "id") 
      { 
      try{ 
       WebDriver element = driver.FindElement(By.Id(selector); 
       if(element.Displayed) 
       { 
        elementFound = true; 
       } 
      } 
      catch { 
       //Do Nothing Here as we don't need to handle the exception 
      } 
      } 
      else if (byType.ToLower() == "tagname") 
      { 
      try{ 
       WebDriver element = driver.FindElement(By.TagName(selector); 
       if(element.Displayed) 
       { 
        elementFound = true; 
       } 
      } 
      catch { 
       //Do Nothing Here as we don't need to handle the exception 
      } 
      } 
      else if (byType.ToLower() == "cssselector") 
      { 
      try{ 
       WebDriver element = driver.FindElement(By.cssSelector(selector); 
       if(element.Displayed) 
       { 
        elementFound = true; 
       } 
      } 
      catch { 
       //Do Nothing Here as we don't need to handle the exception 
      } 
      } 
      else if (byType.ToLower() == "classname") 
      { 
      try{ 
       WebDriver element = driver.FindElement(By.ClassName(selector); 
       if(element.Displayed) 
       { 
        elementFound = true; 
       } 
      } 
      catch { 
       //Do Nothing Here as we don't need to handle the exception 
      } 
      } 
     } 
     else 
     { 
      i = 0; //stops the loop when the element is found 
     } 
    } 

    return elementFound ; 
}