捕获WebdriverJs值以便在块外使用

时间:2016-03-14 04:58:44

标签: javascript ecmascript-6 mocha webdriverjs

我正在尝试研究如何在使用WebDriverJs + Mocha时使用promise来检索值的块中返回值。

我有这个示例代码试图显示我面临的问题,mocha测试1)失败,因为它没有使用嵌套test.it块中的值,而测试2)通过。

import assert from 'assert';
import test from 'selenium-webdriver/testing';
import webdriver from 'selenium-webdriver';

test.describe( 'Capture value from promise', function() {
    this.timeout( 20000 );

    let title, driver;

    test.before( 'Start Browser', function() {
        driver = new webdriver.Builder().forBrowser( 'chrome' ).build();
    } );

    test.describe( '1) Capture page title without block', function() {
        test.it( 'Get and use page title', function() {
            driver.get( 'https://WordPress.com' );
            title = driver.getTitle().then( ( innerTitle ) => {
                return innerTitle;
            } );
            console.log( title ); //promise
            return assert.equal( title, 'WordPress.com: Create a free website or blog' );
        } );
    } );

    test.describe( '2) Capture page title with block', function() {
        test.it( 'Get page title', function() {
            driver.get( 'https://WordPress.com' );
            return driver.getTitle().then( ( innerTitle ) => {
                title = innerTitle;
            } );
        } );

        test.it( 'Use page title', function() {
            console.log( title ); // actual title
            return assert.equal( title, 'WordPress.com: Create a free website or blog' );
        } );
    } );
} );

如果我想使用返回值而不嵌套另一个test.it块,是否有办法等待承诺得到解决?

3 个答案:

答案 0 :(得分:1)

在你的第二次测试中,你正在做一些Mocha不支持的事情:嵌套对it的调用。当我在这里运行你的代码时,测试2次传递,但是测试标题'Use page title'没有输出到控制台,并且console.log没有被执行。

Mocha flat out不支持这样的嵌套。这在实践中意味着如果您将呼叫嵌套到it,您将获得未定义的行为。当我以前尝试嵌套it调用时,我实际上能够运行嵌套测试。它只是以意想不到的顺序运行。但是未定义的行为意味着什么时候可以起作用的方式可能不再起作用了。

所以你必须让第一个测试工作。为此,您只需在.then调用中移动断言即可。当断言失败时,承诺将被拒绝,测试将失败。

test.it( '1) Capture page title without block', function() {
    driver.get( 'https://WordPress.com' );
    driver.getTitle().then( ( innerTitle ) => {
        assert.equal(innerTitle, 'WordPress.com: Create a free website or blog');
    } );
} );

如果这是“股票”摩卡(摩卡不是通过Selenium使用),那么你必须将调用链接到driver.getdriver.getTitle,你必须从测试中返回结果承诺。但是,你通过selenium-webdriver/testing获得的是一个修改过的Mocha,它与Selenium的“控制流”机制挂钩。因此,您不必链接呼叫或返回承诺。 (关于“控制流”的确切解释可以在promises的Selenium文档中找到。)

答案 1 :(得分:1)

为了使路易斯的答案更进一步,您可以直接使用控制流机制来保证步骤将按给定的顺序执行:

test.it( '3) Capture page title with controlFLow', function() {
  let flow = driver.controlFlow();
  driver.get( 'https://WordPress.com' );
  let title = "";
  flow.execute( function() {
    return driver.getTitle().then( ( innerTitle ) => {
      title = innerTitle;
      } );
  } );

  flow.execute( function() {
    console.log( title ); // actual title
    assert.equal( title, 'WordPress.com: Create a free website or blog' );
  } );
} );

答案 2 :(得分:-1)

Mocha允许您返回一个必须解决的承诺才能通过测试。如果承诺被拒绝,它将失败。如果它超时,它将失败。如果assert为false,则会失败。

  test.describe("1) Capture page title without block", function() {
    test.it("Get and use page title", function(){
      driver.get("https://WordPress.com");
      return driver.getTitle().then(function(title) {
        assert.equal(title, "WordPress.com: Create a free website or blog");
      });
    });
  });