我怎样才能等待一个条件?

我是量angular器新手,我试图实施e2etesting。 我不知道这是否是正确的方式来做到这一点,但是…我想testing的页面不是一个完整的angular度页面,所以…我有一些麻烦。

在我的第一个规范中,我有:

describe('should open contact page', function() { var ptor = protractor.getInstance(); beforeEach(function(){ var Login = require('./util/Login'); new Login(ptor); }); 

我已经创build了这个Login类,但login后我想打开联系页面,但量angular器立即尝试在页面完全加载之前find元素。

我试过使用:

 browser.driver.wait(function() { expect(browser.findElement(by.xpath("//a[@href='#/contacts']")).isDisplayed()); ptor.findElement(by.xpath("//a[@href='#/contacts']")).click(); }); 

但它不工作…它总是试图find页面加载之前的元素。 我也试过这个:

 browser.driver.wait(function() { expect(ptor.isElementPresent(by.xpath("//a[@href='#/contacts']"))); ptor.findElement(by.xpath("//a[@href='#/contacts']")).click(); }); 

我能够做到这一点使用browser.sleep(); 但我不认为这是一个好的select。 任何想法? 在我的login类中,我有:

 ptor.ignoreSynchronization = true; 

在量angular器尝试点击它之前,如何等待这个@ @href='#/contacts

在使用量angular器时,我遇到了同样的问题。 在我的e2etesting中,我从一个非angular度的应用程序开始,然后进入一个angular度的部分,然后返回到一个非angular度的部分。 使事情棘手。 关键是了解承诺,以及如何工作。 下面是一些运行e2etesting中真实世界代码的例子。 希望这给你一个如何构build你的testing的想法。 在这个代码中可能有些不好的做法,请随时改进,但我知道它的工作原理,可能不是最好的方法。

为了达到我使用的angular度

 var ptor; var events = require('events'); var eventEmitter = new events.EventEmitter(); var secondClick = require('./second-click'); beforeEach(function () { browser.driver.get('http://localhost:8080/'); },10000); it("should start the test", function () { describe("starting", function () { it("should find the link and start the test", function(){ var elementToFind = by.linkText('Start'); //what element we are looking for browser.driver.isElementPresent(elementToFind).then(function(isPresent){ expect(isPresent).toBe(true); //the test, kind of redundant but it helps pass or fail browser.driver.findElement(elementToFind).then(function(start){ start.click().then(function(){ //once we've found the element and its on the page click it!! :) ptor = protractor.getInstance(); //pass down protractor and the events to other files so we can emit events secondClick(eventEmitter, ptor); //this is your callback to keep going on to other actions or test in another file }); }); }); }); }); },60000); 

而在angular度这个代码的作品

  describe("type in a message ", function(){ it("should find and type in a random message", function(){ var elementToFind = by.css('form textarea.limited'); browser.driver.isElementPresent(elementToFind).then(function(isPresent){ element(elementToFind).sendKeys(randomSentence).then(function(){ console.log("typed in random message"); continueOn(); }); }); }); },15000); 

退出angular度后

 browser.driver.wait(function(){ console.log("polling for a firstName to appear"); return browser.driver.isElementPresent(by.name('firstName')).then(function(el){ return el === true; }); }). then(function(){ somefunctionToExecute() }); 

希望给一些指导,帮助你!

量angular器1.7.0还引入了一个新function: 预期条件 。

有几个预定义的条件可以明确地等待。 如果你想等待一个元素出现:

 var EC = protractor.ExpectedConditions; var e = element(by.id('xyz')); browser.wait(EC.presenceOf(e), 10000); expect(e.isPresent()).toBeTruthy(); 

也可以看看:

  • 量angular器的预期条件

我终于find…

  var waitLoading = by.css('#loading.loader-state-hidden'); browser.wait(function() { return ptor.isElementPresent(waitLoading); }, 8000); expect(ptor.isElementPresent(waitLoading)).toBeTruthy(); var openContact = by.xpath("//a[@href='#/contacts']"); element(openContact).click(); 

这个量angular器可以等待这个元素,直到它加载页面消失。 感谢那些试图帮助XD的人。

 browser.driver.wait(function() { return browser.driver.isElementPresent(by.xpath("//a[@href='#/contacts']")); }); 

这也适用于我(没有超时参数)。

有关更多信息,请参阅http://angular.github.io/protractor/#/api?view=webdriver.WebDriver.prototype.wait

感谢上面的答案,这是我简化和更新的用法

 function waitFor (selector) { return browser.wait(function () { return browser.isElementPresent(by.css(selector)); }, 50000); } 

你有没有尝试把ng-app放在<html>标记中(假设这部分代码是在你的控制之下的)? 这为我解决了很多初始化时序问题。