【问题标题】:Protractor - fields present but not visible - Element is not currently interactable and may not be manipulated量角器 - 存在但不可见的字段 - 元素当前不可交互并且可能无法操作
【发布时间】:2015-10-17 09:16:49
【问题描述】:

我才刚刚开始使用 Protractor。

这是我的问题:

我想登录一个网站。当页面加载时,它会在显示用户名和密码字段以及登录按钮之前显示一个旋转的加载轮。 我的问题是clear()sendKeys() 的任何尝试都失败了,因为这些字段在屏幕上尚不可见,并且量角器正在尝试与它们进行交互。

InvalidElementStateError:无效元素状态:元素不是 当前可交互,可能无法操作。

我注意到在页面源中,最初的纺车有class='ngscope',过了一会儿它变成了class='ng-scope ng-hide'

整件事是这样的:

<div ng-show="Model.Busy" class="ng-scope ng-hide">
    <div ng-class="{'control--inline': small, 'div-centre': !small}" class="div-centre">
    <img ng-src="/assets/img/loading.gif" ng-class="{'very-small-loading': small}" src="/assets/img/loading.gif">
</div>
</div>

我正在使用的代码是:

describe('Testing', function() {
    browser.driver.manage().window().maximize();

  var username = element(by.model('Model.Username'));
  var password = element(by.model('Model.Password'));
  var loginbutton = element(by.css('[ng-click="Model.Logon()"]'));


  beforeEach(function() {
    browser.get('MY WEBSITE');
  });

  it('should log me in', function() {

//  expect($('[ng-show=Model.Busy].ng-hide').isDisplayed()).toBeTruthy();  <-- this fails


    username.clear();
    password.clear()

    username.sendKeys('1');
    password.sendKeys('2');

    loginbutton.click();

  });
});

如何做到这一点?

【问题讨论】:

    标签: javascript angularjs automation jasmine protractor


    【解决方案1】:

    您必须等到加载动画隐藏,然后尝试使用量角器的内置 wait() 函数处理页面上出现的元素。一种方法是使用presenceOf() 功能等到元素出现。方法如下-

    browser.ignoreSynchronization = true; //Its Kendo UI coupled with Angular, so ignore the angular load
    
    //There are 2 login forms with same attributes so using by.model wouldn't work in this case
    var username = $('#MainView .form-input[name="txtUsername"]');
    var password = $('#MainView .form-input[name="txtPassword"]');
    var loginbutton = $('[ng-click="Model.Logon()"]');
    var EC = protractor.ExpectedConditions;
    
    browser.wait(EC.visibilityOf(username), 20000).then(function(){
        username.clear().then(function(){
            username.sendKeys('1');
        });
        password.clear().then(function(){
            password.sendKeys('2');
        });
        loginbutton.click();
    });
    

    希望对你有帮助。

    【讨论】:

    • 你好 Girish。不幸的是,这没有帮助。现在发生的是动画在 browser.wait (10s)中给出的持续时间内“挂起”,然后我得到同样的错误。如果我给你网址会更容易:client.compliancecentre.co.uk 请看一下,看看你是否可以将密钥发送到用户名和密码,然后点击登录按钮...(注意:页面加载速度可能非常快并且纺车只会显示几分之一秒。但它就在那里)
    • @Alichino 如果是这种情况,那么等待用户名或密码字段是有意义的。使用此解决方案更新答案。我根本看不到该字段,也许网页上的自动化被某种 javscript 禁用。你能检查一下吗?
    • @Alichino 我能够重新创建您的问题,并且该网页似乎在客户端使用了 Kendo UI 库。更新了代码以包含有效的代码。如果您还有问题,请告诉我。谢谢
    • 我现在可以登录了,谢谢 Girish。不过有一件事 - 它一直在尖叫 ignoreSynchronization 不是一个函数,所以我把它改成了 " = true " 而不是 (true) 并且它起作用了!
    • 对于任何想知道 ignoreSynchronization = true 已被弃用的人,waitForAngularEnabled=(false) 是现在的替代品
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2023-03-16
    • 2017-05-27
    • 1970-01-01
    • 2018-09-17
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多