2012-10-16 55 views
0

運行Selenium Webdriver測試時,我真的很奇怪。測試偶爾會造成錯誤

我的代碼確實存在

driver.findElement(By.id("id")).click(); 
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS); 
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click(); 
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS); 
driver.findElement(By.className("green_true")).click(); 

元素。我甚至可以看到有問題的網址被網絡驅動程序點擊,但沒有任何反應。瀏覽器不會進入頁面,並且不會找到green_true元素。導致錯誤。但只是偶爾。有時測試運行,因爲它應該。

誰能告訴這是怎麼回事?

我無法使用確切的網址,因爲它們根據所選語言而有所不同。

回答

0

好。建議以下列方式修改:的 代替

driver.findElement(By.id("id")).click(); 
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS); 
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click(); 
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS); 
driver.findElement(By.className("green_true")).click(); 

嘗試使用以下:

public WebElement fluentWait(final By locator){ 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(30, TimeUnit.SECONDS) 
       .pollingEvery(5, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class); 

     WebElement foo = wait.until(
new Function<WebDriver, WebElement>() { 
      public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
       } 
       } 
); 
          return foo;    }  ; 

fluentWait(By.id("id")).click(); 
fluentWait(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click(); 
fluentWait(By.className("green_true")).click(); 

的問題可以是你prolly得到一些AJAX頁面上的元素進行交互後(點擊,等等)。恕我直言,我們需要使用更強大的等待機制。

一條建議:當你得到webelement或css選擇器的xpath時,不要忘記在fireBug,ffox擴展中驗證找到的定位器。 locators verify 此致。

+0

仍然發生同樣的問題。由於測試通常在第一次運行時傳遞,它可能與驅動程序初始化有關嗎? – mjgirl

+0

你能否提供異常來源? –

+0

我得到的錯誤是無法找到的元素:{「方法」:「類名」,「選擇」:「green_true」} – mjgirl

0

嘗試在點擊動態元素時使用顯式等待。等到元素出現在Web瀏覽器上或對其應用操作。您可以使用此模式:

final FluentWait<WebDriver> wait = 
      new FluentWait<WebDriver>(getDriver()) 
        .withTimeout(MASK_PRESENCE_TIMEOUT, TimeUnit.SECONDS) 
        .pollingEvery(100, TimeUnit.MILLISECONDS) 
        .ignoring(NoSuchElementException.class) 
        .ignoring(StaleElementReferenceException.class) 
        .withMessage("Time out while waiting the element is loaded"); 

    wait.until(new Predicate<WebDriver>() { 

     @Override 
     public boolean apply(final WebDriver driver) { 
      return ! driver.findElements(By.id("id")).isEmpty(); 
     } 

    });