2013-06-06 47 views
3

執行filepicker.io之後,我們的一些Selenium迴歸測試開始失敗。失敗(間歇性的,但在某些情況下更常發生)是在通過XPath查詢找到的WebElements上忽略了點擊。例如如何在加載filepicker.io時使xpath與Selenium一起工作

driver.findElement(By.xpath("//a[text()='Demo data']")).click(); 

在findElement()和click()之間添加Sleep(2000)通常可以解決問題。 (我通常說因爲睡眠(1000)大部分已經足夠,直到它不是,所以我讓它睡覺(2000)...)

檢查element.isDisplayed()沒有幫助。如果我們停止包含filepicker.io JavaScript文件,問題就會消失。

這是與引入IFRAME的filepicker.io有關嗎?我們也注意到JQuery的document.ready()似乎現在被調用了兩次。

+0

當您使用CSS來引用元素時它工作嗎? – Yoshi

+0

CSS似乎可以正常工作。 –

+0

其實我們也在用CSS看到它,它在頁面加載後似乎是筆直的。也許動態插入的iframe是discombobulating的東西。 –

回答

0

像往常一樣,這種問題,你正試圖找到一個頁面中尚未提供的元素,由於AJAX請求仍然下載/處理它。您需要等待元素出現在頁面上。

有三種方法可以做到這一點:

  1. 使用sleep()。這是激動人心的方式。你不應該使用硬編碼睡眠,因爲你要麼等待太久(使測試不必要地慢),要麼太短(測試失敗)。
  2. 使用Implicit wait。如果沒有找到它,它總會等待一個元素。

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
    
  3. 使用explicit wait。這使您能夠明確地等待一個元素(dis)出現/變爲可用/不管。

    WebDriverWait wait = new WebDriverWait(driver, 10); 
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Demo data"))); 
    
+0

我不認爲就是這樣。 findElement()在不拋出異常的情況下返回元素(因此它在DOM中),並且click()不會拋出異常(因此它是可見的)。這不是一個輸入元素,所以我明白啓用是不相關的。 –

+0

@OliverBock哦。我一定誤解了這個問題,我的不好,我很抱歉。 Firefox和iframe一直存在錯誤 - 有時會出現錯誤的座標點擊。嘗試使用其他瀏覽器,嘗試檢測它實際點擊的位置(是否)。嘗試'executeScript(「arguments [0] .click()」,theElementToClick);'作爲解決方法。 –

0

我們現在開口,其包括filepicker.js任何頁面後第一次運行該代碼:

while (FindElementsMaybeNone(By.cssSelector("#filepicker_comm_iframe")).size() == 0) 
    Sleep(50); 
while (driver.switchTo().frame("filepicker_comm_iframe") == null) 
    Sleep(50); 
driver.switchTo().defaultContent(); 

我們猜測filepicker的動態IFRAME插入discombobulating Firefox或硒。我不會把這個標記爲答案,因爲我不知道爲什麼有效。

相關問題