我維護一個使用量角器(2.5.x)進行E2E測試的複雜Angular(1.5.x)應用程序。這種方法遇到了一個問題,主要表現在測試看上去很脆弱。在一個拉取請求中完美運行的測試在另一個拉取請求中失敗。這涉及簡單的定位器,例如by.linkTest(...)。我調試了失敗的測試,並且該應用程序位於正確的頁面上,鏈接存在且可訪問。量角器片狀
是否有其他人遇到這些一致性問題?知道原因或解決方法?
我維護一個使用量角器(2.5.x)進行E2E測試的複雜Angular(1.5.x)應用程序。這種方法遇到了一個問題,主要表現在測試看上去很脆弱。在一個拉取請求中完美運行的測試在另一個拉取請求中失敗。這涉及簡單的定位器,例如by.linkTest(...)。我調試了失敗的測試,並且該應用程序位於正確的頁面上,鏈接存在且可訪問。量角器片狀
是否有其他人遇到這些一致性問題?知道原因或解決方法?
是的,我認爲我們所有人都經歷過這樣的片狀問題。
實際上,片狀是任何瀏覽器自動化工具的常見問題。然而,在量角器的情況下,這應該是較少的,因爲量角器具有內置等待考慮因素,只有在正確加載dom後才執行動作。但是,在少數情況下,如果您發現間歇性故障,您可能必須使用一些明確的等待。
我更喜歡使用一些智能等待的方法,如:
function waitForElementToClickable(locator) {
var domElement = element(by.css(locator)),
isClickable = protractor.ExpectedConditions.elementToBeClickable(domElement);
return browser.wait(isClickable, 2000)
.then(function() {
return domElement;
});
}
凡2000毫秒作爲超時,你可以把它配置使用variable.Sometimes我也一起去browser.sleep()
當沒有我聰明的等待作品。
Just Say No to More End-to-End Tests!
這就是說,這裏是你可以做,以解決我們共同的無情的「片狀」敵人幾件事情:
selenium
和chromedriver
它使用
龍
browser.wait()
與一套built-in or custom Expected Conditions。這可能是解決問題最可靠的方法。不幸的是,這是用例和問題特定的,你需要在有問題的地方修改你的實際測試。例如,如果你需要點擊一個元素,等待它可以點擊:
var EC = protractor.ExpectedConditions;
var elm = $("#myid");
browser.wait(EC.elementToBeClickable(elm), 5000);
elm.click();
瀏覽器窗口最大化(避免隨機元素不可見或不可點擊錯誤)。把這個onPrepare()
:通過調整Control Flow
browser.driver.manage().window().maximize();
browser.waitForAngular();
有問題的地方。我不知道爲什麼這會有所幫助,但我已經看到了報告,它肯定有助於解決片狀測試問題。done()
callback。這可能有助於,例如,不啓動it()
區塊,直到調用done
爲止beforeEach()
onPrepare()
function。這通常有助於確保事情爲測試運行做好準備protractor-flake
package即將自動重新運行失敗的測試。更像是一個快速的解決辦法的問題還有其他特定問題的「招數」像slow typing into the text box,點擊via JavaScript等
這是我的經驗是一些方法(如sendKeys()
)做在controlFlow()
隊列中並不總是在預期的時間點火,並且會導致測試失敗。我通過專門將它們添加到controlFlow()
來解決此問題。例如:
this.enterText = function(input, text) {
return browser.controlFlow().execute(function() {
input.sendKeys(text);
});
};
,我的團隊一直使用一種解決方法是重新運行使用插件protractor-errors唯一失敗的測試。使用這個工具,我們可以在2-3次運行中發現真正的失敗與Flakey測試。要添加插件,只需添加一個需要聲明量角器配置的onPrepare功能的底部:
exports.config = {
...
onPrepare: function() {
require('protractor-errors');
}
}
您將需要通過這些額外的參數時,用插件運行測試:
protractor config.js --params.errorsPath 'jasmineReports' --params.currentTime (timestamp) --params.errorRun (true or false)
如果你沒有簡單的方法傳入時間戳,還有一個cli工具可以處理生成currentTime。
謝謝。很高興知道我並不孤單。同時也非常感謝這些方便的提示! –
如果你從未做過Flakey測試,那麼你就只有一人了......我們都想知道你是怎麼做到的:)非常好的總結@alecxe! – Brine
當測試失敗時,這只是令人討厭的,大約有十分之一左右。你重新開始測試,它會起作用。這不是我所說的決定論。 –