捕获 WebdriverJs 值以在块外使用
Capture WebdriverJs value for use outside of block
我正在尝试找出如何 return 使用 WebDriverJs + Mocha 时使用承诺检索值的块中的值。
我有这个示例代码来尝试显示我遇到问题的地方,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
块的情况下使用 returned 值,有没有办法等待 promise 被解析?
在您的第二个测试中,您正在做 Mocha 不支持的事情:嵌套调用 it
。我这里运行你的代码时,测试2通过了,但是测试标题'Use page title'
没有输出到控制台,console.log
没有执行
Mocha 完全不支持这种嵌套。这实际上意味着如果嵌套调用 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');
} );
} );
如果这是 "stock" Mocha(Mocha 不通过 Selenium 使用),那么您必须将调用链接到 driver.get
和 driver.getTitle
,并且您必须 return 来自测试结果的承诺。但是,您通过 selenium-webdriver/testing
获得的是一个修改后的 Mocha,它挂钩到 Selenium 的 "control flow" 机制中。因此,您不必链接调用或 return 承诺。 (关于 "control flow" 功能的一个很好的解释可以在 promises 上的 Selenium 文档中找到。)
为了让 Louis 的答案更进一步,您可以直接使用控制流机制来保证步骤将按给定的顺序执行:
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' );
} );
} );
Mocha 允许您 return 必须解决才能通过测试的承诺。如果承诺被拒绝,它就会失败。如果超时,它将失败。如果 assert
为假,它将失败。
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");
});
});
});
我正在尝试找出如何 return 使用 WebDriverJs + Mocha 时使用承诺检索值的块中的值。
我有这个示例代码来尝试显示我遇到问题的地方,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
块的情况下使用 returned 值,有没有办法等待 promise 被解析?
在您的第二个测试中,您正在做 Mocha 不支持的事情:嵌套调用 it
。我这里运行你的代码时,测试2通过了,但是测试标题'Use page title'
没有输出到控制台,console.log
没有执行
Mocha 完全不支持这种嵌套。这实际上意味着如果嵌套调用 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');
} );
} );
如果这是 "stock" Mocha(Mocha 不通过 Selenium 使用),那么您必须将调用链接到 driver.get
和 driver.getTitle
,并且您必须 return 来自测试结果的承诺。但是,您通过 selenium-webdriver/testing
获得的是一个修改后的 Mocha,它挂钩到 Selenium 的 "control flow" 机制中。因此,您不必链接调用或 return 承诺。 (关于 "control flow" 功能的一个很好的解释可以在 promises 上的 Selenium 文档中找到。)
为了让 Louis 的答案更进一步,您可以直接使用控制流机制来保证步骤将按给定的顺序执行:
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' );
} );
} );
Mocha 允许您 return 必须解决才能通过测试的承诺。如果承诺被拒绝,它就会失败。如果超时,它将失败。如果 assert
为假,它将失败。
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");
});
});
});