【问题标题】:Protractor - How to handle site that is heavily animated?量角器 - 如何处理大量动画的网站?
【发布时间】:2015-08-19 14:12:54
【问题描述】:

我必须为一个有大量动画的 Angular 应用程序网站编写测试。几乎所有东西都有一个“迷你”窗口,它从顶部滑入并进入中心,然后其内容从右侧滑入,直到它们进入,依此类推。

这打破了我的测试,很多。量角器看到元素,因为它们被显示,但它不能点击它们,因为它们正在移动,它会抛出一个错误,指出其他元素将接收点击。这种情况经常发生,我不知道如何处理(除了使用 browser.sleep(xxxx))。

除了使用睡眠功能之外,还有其他解决方案吗?如果我真的没有其他选择,我必须在第二行使用它...

**我试过这个browser.manage().timeouts().implicitlyWait(30000);,但没有帮助。

附:我也遇到过 Protractor 尝试在元素可见之前点击它的情况。

如果需要,我可以制作一个短视频来展示动画是什么。

test.describe('Profile tests: ', function(){
this.timeout(0);

test.before(function(){
    browser.get('......');
});

test.it('Change Username', function() {
    var newUsername = 'Sumuser';

    welcome.continueLink.click();  
    bonus.takeBonus.isDisplayed().then(function() {                
        bonus.takeBonus.click();            
    });
    entrance.openEntrance.click();

    browser.sleep(300);
    loginBasic.openNormalLogin.isDisplayed().then(function() {
        loginBasic.openNormalLogin.click();
    });

    browser.sleep(300);
    login.usernameField.isDisplayed().then(function() {
        login.usernameField.sendKeys(username);
    });

    login.passwordField.sendKeys(password);
    login.loginButton.click();
    infoBar.avatar.click();

    browser.sleep(1000);
    myProfile.editProfileButton.click();

    browser.sleep(1000);
    username.field.clear();
    username.field.sendKeys(newUsername);
    editProfileButtons.saveChanges.click();

    browser.sleep(1000);
    myProfile.username.getText().then(function (text){
        expect(text).to.equal(newUsername);
    });
});
});

我还尝试在我的配置文件中添加以下内容以禁用动画:

onPrepare: function() {
    var disableNgAnimate = function() {
        angular.module('disableNgAnimate', []).run(['$animate', function($animate) {
            $animate.enabled(false);
        }]);
    };

    browser.addMockModule('disableNgAnimate', disableNgAnimate);
}

【问题讨论】:

    标签: javascript angularjs protractor mocha.js


    【解决方案1】:

    browser.wait() 的显式等待可能会使测试更加可靠。

    例如,等待元素变为可点击:

    var EC = protractor.ExpectedConditions;
    var elm = element(by.css(".myclass"));
    
    browser.wait(EC.elementToBeClickable(elm), 5000);
    

    您也可以完全关闭角度动画,请参阅:

    【讨论】:

    • 关闭动画是最好的方法。
    • 再补充一点,请确保您也考虑了 css 动画。我不确定是否有办法可靠地关闭它们,但请确保知道它们在哪里并适当地等待它们。
    • 感谢您的回复。不幸的是,我无法使用 ExpectedConditions,因为我正在使用量角器的 TS 定义并且它还不支持它。即使我可以,它也不能解决问题,因为我必须用 browser.wait 替换 browser.sleep 并且实际上什么都不会改变。我已经更新了我的主要帖子,并添加了我的测试。我想摆脱所有这些sleeps。我试图禁用动画,但它不起作用 - 我还在我的主帖子中添加了我在配置文件中使用的代码。请帮忙! :)
    • 正如你所见,使用承诺 isDisplayed 也无济于事,因为我还需要睡觉......
    • @MBielski 我明白你的意思,但我认为这不是正确的方法,因为你正在测试你的产品最终功能。动画是其中的一部分,您应该在用户体验时对其进行测试。
    【解决方案2】:

    我刚刚添加了一个对 How to disable animations in protractor for angular js appliction 的答案,您可能会发现它很有用 - 禁用 css 过渡。

    为方便起见,我将在这里重复重要的代码。我在我的一个样式表中添加了一个类,例如:

    .notransition * {
      -webkit-transition: none !important;
      -moz-transition: none !important;
      -o-transition: none !important;
      -ms-transition: none !important;
      transition: none !important;
    }
    

    ...在量角器中,我有类似的东西:

    _self.disableCssAnimations = function() {
      return browser.executeScript("document.body.className += ' notransition';");
    };
    

    可能有更巧妙的方法来应用这个概念,但上面的方法对我有用。

    【讨论】:

    • 谢谢,但我没有应用程序的源代码,我只是在测试它。
    • 如果您无法将任何 CSS 添加到应用程序的源代码中,我想知道是否可以从量角器中动态添加它;可能在传递给browser.executeScript(...) 调用的函数中执行类似的操作:developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/…
    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多