2015-11-11 89 views
0

我正在與Selenium合作對我們公司網站的一些測試進行自動化,但遇到問題。硒事件和等待

TestItemFromSearch: (driver, part, qty) => { 
    Search.SearchItem(driver, part); 
    driver.findElement(By.id('enterQty')).findElement(By.tagName('input')).sendKeys(qty); 
    driver.findElement(By.linkText('Personalize')).click(); 
    //This directs to a new page. 
    driver.wait(() => { 
    }, 1000).then(() => { 
     }, //TODO: This sucks. Fix it. 
     Login.Login(driver, Logins.username, Logins.password)); 
    driver.findElement(By.className('selectDesignButton')).click(); 
} 

有時候,當Selenium被引導到一個新頁面時,我會使用wait。無論我輸入什麼條件,它都沒有真正找到這種條件 - 它失敗了。我必須劫持拒絕方法才能進行所需的操作(如Login.Login)。

我可能不得不在相同的測試中再次這樣做,因爲它要穿過多個頁面......這會導致醜陋,醜陋,不可讀的代碼。

我該如何讓Selenium正常等待?如果我做到以下幾點:

driver.wait(()=>{},1000) 

它只是坐在永遠。如果我提交回復聲明,它立即失敗,甚至不等第二個。

回答

0

在與頁面上的元素進行交互之前,您應該使用硒驅動程序的WaitForElementPresentWaitForElementVisible功能。 selenium驅動程序將觀察DOM並分別驗證每個元素的存在或呈現。在首先通過這些檢查之後,與頁面進行交互以進行進一步測試應該是安全的。

+0

這些都是Java元素,而不是節點/ JS元素。 –

0

您需要使用顯式(而不是隱式)等待。有多種方法可以做到這一點:

WebDriverWait wait = new WebDriverWait(driver, timeOut); 
wait.until(ExpectedConditions.elementToBeClickable(locator)); 

或者你也可以使用不同的形式明確的等待,這是一個fluentWait:

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因爲你可以請指定:

  1. FluentWait必須檢查定義的條件的頻率。
  2. 忽略在頁面上搜索元素時忽略特定類型的異常等待,例如 NoSuchElementExceptions。
  3. 最長時間等待條件

試試這個:

driver.wait(function() { 
    return driver.findElement(locator).isDisplayed(); 
}, timeout); 
+0

是Java還是JavaScript?我不認爲Node.JS Selenium具有這些功能? –

+0

我剛剛發佈了一個明確的等待,應該與節點JS一起工作 – marchocolate

+0

這不正是我在我自己的代碼中使用的? –