2017-11-17 138 views
0

我目前有一個使用WebdriverIO的測試腳本,點擊一個按鈕並等待彈出窗口顯示。測試的目的是確保元素在點擊後顯示,但由於它是異步的,我必須等到它顯示出來。如何在等待元素可見性時避免重複呼叫

但是,如果我等到元素顯示,我的斷言將總是通過,如果waitForVisible成功。如果它不成功,它總是會在waitForVisible命令上拋出一個異常,並且斷言永遠不會執行。

下面是代碼示例:

browser.click(btnElement) 
browser.waitForVisible(popupElement) 
expect(browser.isVisible(popupElement)).to.be.true 

是否有不同的方法來告訴指望聲明重試/等到元素可見這樣的說法是不是沒用?

+0

只是刪除斷言...正如你所說,這是多餘的。 – JeffC

+0

但是沒有斷言的測試有什麼好處? –

回答

3

您似乎混淆了assertions的目的,或者濫用了它們,特別是在您的示例中。您應該只使用斷言,當你有確定性要驗證事情WebElementtextattribute元素等)包含了預期類型的值(您返回到您的assert,或expect聲明爲最終驗證=>輸出是所需的一個)。

斷言驗證靜態值,它們不輪詢DOM。這就是爲什麼你有像.waitForVisible(),waitForText(),或更重要的是.waitUntil()(它提供了更多的靈活性)的工具。

誠然,通過ChaiJS提供可能有一個令人困惑的詞彙的expect斷言式(expect可能被斷章取義的:它期待的WebElement的是可見的)。只需使用它們來驗證不同命令的輸出,而不是使用WebElements或其他動態/更改元素的狀態。


話雖這麼說,作爲一個最佳實踐,你應該始終包裹您的命令(例如:.click())爲.waitUntil()塊和保證WebElement爲你準備好即將在行動執行:

  • 是否呈現在DOM中由前端邏輯? (使用.isExisting()
  • 是不是可見在DOM中? (你*不能點擊在viewport中不可見的元素)
  • 是不是可點擊? (或者您想對其執行的其他操作...)

最後,一個習慣動作(在我們的例子.click())應該是這樣的:

browser.waitUntil(() => { 
    browser.isExisting(locator); 
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') does not exist"); 
browser.waitUntil(() => { 
    browser.isVisible(locator); 
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') is not visible"); 
browser.waitUntil(() => { 
    browser.click(locator); 
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') could not be clicked"); 

你可以用整個事情變成custom-command並使用它瓦特/ E您想。告別片狀測試! :)

*硒是一種以用戶爲中心網絡的自動化工具,從而爲如果用戶將(用戶不能在元素不可見,用戶單擊所有操作都進行不能同時點擊多個元素,或通過輸入整個單詞或整個段落等來填寫input字段)

+0

如果我正確理解你,你說你應該只使用斷言/期望來驗證值?但我看到很多人使用斷言來檢查元素是否可見/可點擊。如果點擊此按鈕創建一個內容未知的彈出框(通過CMS?),那麼我無法知道該值,但我仍然可以驗證它是否顯示。是的,即使它是空的,它也會通過,但沒有其他辦法可以讓我知道彈出窗口中將提供哪些內容。如果我只能斷言已知的值,我該如何爲此寫一個測試? –

+0

你的回答沒有多大意義。你爲什麼需要斷言你肯定會通過的東西?這是斷言的重點,以確保它在沒有通過或錯誤時通過。我不知道* static * value是什麼意思......如果這個值永遠不會改變,那麼斷言它是沒有意義的。這就像有一個斷言,「pi」仍然等於「3.14.」......你永遠不會那樣做。總是將命令封裝在等待中並不是一個最佳實踐。請發佈說明這樣的鏈接。 – JeffC

+0

那倒票@JeffC **:)**這是一個d!$%移動的男人!態度非常非常令人失望。 – iamdanchiv

0

我不知道WebdriverIO,但我會認爲它有類似的東西到try-catch。把你的等待包裹在try-catch。如果成功,則爲Assert.pass()或等效。如果超時,將拋出異常,因此在您的catch中超時放置Assert.fail()或等效。


我從來沒有用過ChaiJS但我確實看看the documentation,發現一對夫婦的事情,你應該能夠使用。

assert.isOk(false, 'this will fail'); 

這是從文檔,應該是相當於什麼我熟悉,Assert.Fail()。人們會認爲,一個輕微的調整。下面將相當於Assert.Pass()

assert.isOk(true, 'this will pass?'); 

如果不出於某種原因,你可以使用下面的文檔。

assert.isNotOk(false, 'this will pass'); 
+0

這幾乎總結了我對你的答案的看法:** [這裏](https://imgur.com/a/Sc5wn)**。作爲一個專業技巧,先進的技巧,當你*出售一個想法,解決方案,概念*或*辯論某人*時,**從來沒有**開始說你對你將要制定的目標一無所知關於的聲明。看到這裏的悖論傑夫? – iamdanchiv

+0

@iamdanchiv我使用C#和Java Selenium。 WebdriverIO是Selenium的語言綁定,我不編程。這個概念仍然適用,不是嗎?這是一種擴展到其他語言的編程概念。 – JeffC

+0

@JeffC我們已經實現了try-catch,但不幸的是我們沒有看到ChaiJS使用通過/失敗函數。也許我在文檔中錯過了它。 –