Javascript 如何访问';直到';物体直接在量角器中?

Javascript 如何访问';直到';物体直接在量角器中?,javascript,angularjs,testing,protractor,pageobjects,Javascript,Angularjs,Testing,Protractor,Pageobjects,我正在编写一个用于测试AngularJS web应用程序的中间件框架,我希望能够等待某些条件得到满足,然后再进行测试中的另一个操作。我对量角器相当陌生,从我在他们的文档和其他论坛中发现的情况来看,有几种不同的方法可以使用browser.driver.wait或使用条件或承诺的类似技术来实现这一点 我特别想要实现的是遵循框架中的页面对象模型设计,允许每个页面提供自己的功能,以确定该页面在浏览器中是否可见。为此,我最终编写了页面对象,如下所示: var pages = { home: {

我正在编写一个用于测试AngularJS web应用程序的中间件框架,我希望能够等待某些条件得到满足,然后再进行测试中的另一个操作。我对量角器相当陌生,从我在他们的文档和其他论坛中发现的情况来看,有几种不同的方法可以使用
browser.driver.wait
或使用
条件
承诺
的类似技术来实现这一点

我特别想要实现的是遵循框架中的页面对象模型设计,允许每个页面提供自己的功能,以确定该页面在浏览器中是否可见。为此,我最终编写了页面对象,如下所示:

var pages = {
  home: {
    name: 'home',
    url: server + '/#/home',
    title: 'Home',
    isVisible: until.titleIs(this.title)
  },
  ...
}
var condition = until.titleIs('some title');
var result = browser.wait(condition, timeout).then(function(res) { return res; });
if (result)
    // do something
else
   // do another thing
有两个问题我正在努力解决:

  • 首先也是最重要的是,我得到一个错误,即
    until
    是未定义的。我还没有找到正确的方法来使用这个对象,我所有的搜索都导致了等待元素可见或预期条件为真的替代方法。如何直接访问此对象?而且,这是否被认为是糟糕/过时的设计
  • 假设我找到了一种直接使用
    until
    对象的方法,我可以在量角器源代码中看到
    until.titleIs()
    函数返回一个
    条件
    ,那么我的下一个问题是如何使用这个
    条件
    对象在等待结束(或超时)后获得布尔结果?对于某些特殊情况,我需要这样做,例如:

    var pages = {
      home: {
        name: 'home',
        url: server + '/#/home',
        title: 'Home',
        isVisible: until.titleIs(this.title)
      },
      ...
    }
    
    var condition = until.titleIs('some title');
    var result = browser.wait(condition, timeout).then(function(res) { return res; });
    if (result)
        // do something
    else
       // do another thing
    
  • 我将非常感谢你在这方面的帮助

    直到对象为
    。我将全局定义它,将以下内容放入配置中的
    onPrepare()
    函数中:

    onPrepare: function () {
        global.until = protractor.ExpectedConditions;
    },
    
    至于你的第二个问题,我将使
    isVisible
    成为一个函数,它将返回一个承诺:

    isVisible: function () {
        return browser.wait(until.titleIs(this.title), 5000).then(function () {
            return true;
        },
        function () {
            return false;
        });
    },
    
    然后,您可以在测试中预期:

    expect(myPageObject.isVisible()).toBe(true);
    

    谢谢@alecxe。有道理,我会试试看。如果我正确理解了您的答案,那么为了能够使用此承诺作为条件,我必须执行如下操作:browse.wait(直到.titleIs(this.title),5000)。然后(function(res){If(res)do this;else do that;});对吗?@exfounda如果您需要使用
    isVisible
    结果来做出某种决定:
    myPageObject.isVisible().then(函数(res){if(res)do smth else do smth else})。。希望有帮助,明白了。最后一个问题。。。在第一种情况下,使用
    browser.wait(条件,超时)。然后使用(func1,func2)
    ,当等待时间超过超时时,是否使用第二个函数
    func2
    ?此解决方案非常有效。非常感谢你!