Protractor 量角器和定位元件

Protractor 量角器和定位元件,protractor,Protractor,我需要使用量角器定位elemet“用户名”。 我用过 browser.waitForAngularEnabled(false); 由于登录页面不是有角度的 我的脚本很简单,如下所示: describe('slowchat', function() { it('start test', function() { browser.waitForAngularEnabled(false); browser.get('https://www.test.no/eai/bankid2

我需要使用量角器定位elemet“用户名”。 我用过

browser.waitForAngularEnabled(false);
由于登录页面不是有角度的

我的脚本很简单,如下所示:

describe('slowchat', function() {
it('start test', function() {

     browser.waitForAngularEnabled(false);
     browser.get('https://www.test.no/eai/bankid20');

     element(by.css('[value="Logg inn"]')).click();

     browser.waitForAngularEnabled(true);




});
});
但是我得到了一个错误:

  Failed: No element found using locator: By(css selector, [value="Logg inn"])
我想找的地方请看附件


你知道为什么不能找到按钮吗?

现在我看到在圆圈中输入的是
用户名
,但你要求按钮提交表单,顺便说一句,你可以关闭angular by标志

   //entering non-angular site
browser.ignoreSynchronization=true;
   //Some code
   element(by.css('button[onclick="mySubmit()"])).click();
   //when you go back to angular site
browser.ignoreSynchronization=false;

因此,当您禁用等待角度同步或忽略同步时,这意味着您需要自己滚动,等待某种稳定性。有两种方法可以做到这一点:1。关闭控制流并使用异步等待。2.在采取下一步行动之前,先解决您的承诺

解决承诺 我认为由于异步调用,您需要在这里使用
done()
方法调用。我对解决承诺的总体看法是。。。更喜欢使用async/await并删除控制流

describe('slowchat', () => {
  it('start test', (done) => {

   browser.waitForAngularEnabled(false);
   browser.get('https://www.test.no/eai/bankid20').then(() => {
     return element(by.css('[value="Logg inn"]')).click().then() => {
       browser.waitForAngularEnabled(true);
       done();
     });
   });
  });
});
使用async/await并删除控制流 控制流已被弃用,因此这将使您走在前面。我建议这样做。这将使您的测试更容易调试

describe('slowchat', () => {
  it('start test', async() => {
   await browser.waitForAngularEnabled(false);
   await browser.get('https://www.test.no/eai/bankid20');
   await element(by.css('[value="Logg inn"]')).click();
   await browser.waitForAngularEnabled(true);
  });
});

启动此功能时,需要设置标志以关闭控制流。在您的配置中,您需要添加以下内容:
SELENIUM\u PROMISE\u MANAGER:false

您尝试过用sleep消除它的bug吗?也许这只是一个问题,那个元素还不可见。我如何在我附加的脚本中指定它?没有帮助。sleep(35000)尝试
元素(by.css('form#loginform input#submit'))。单击()也参考其他答案
ignoreSynchronization
waitForAngularEnabled
做同样的事情。答案还提到它“更容易调试”。我们将在下周的ng-conf上对此进行深入讨论。如果你在那里,请打声招呼。如果没有,请查看实时流/录制的视频。唯一需要注意的是,ignoreSynchronization正在被弃用,最终将不再可用。他们正在切换到waitForAngularEnabled作为主属性。是的,它在不久前被弃用,但我们现在正在删除ignoreSynchronization。