使变量在整个 spec.js 文件中可用
Make a variable available throughout a spec.js file
我有一个测试规范文件,其目的是检查我们应用程序中的预订参考,然后检查电子邮件中是否引用了相同的参考。
在测试的第一部分,我声明了一个名为 dbmRef
的变量 - 我知道这是有效的,因为我有一个显示变量内容的 console.log
。
进一步在电子邮件系统 (Outlook.com) 中,我有另一个名为 dbm
的变量,它可以在电子邮件正文中找到预订编号。
最后,我有 expect(dbm).toContain(dbmRef)
但是这个错误 Expected 'DBM040815' to contain undefined.
我假设 Protractor 不能 'see' 脚本上方的第一个变量...是这样吗?如果是这样,我该如何补救?
附上代码 - 不是最终形式!
/**********************
* Company: Guestline
* Product: DBM
* Author: D Redmayne
**********************/
var hotKeys = require('protractor-hotkeys');
describe('DBM Hotel', function() {
it('Confirmation', function() {
browser.ignoreSynchronization = true;
browser.sleep(500);
// assertions
expect(browser.getTitle()).toEqual('| Confirmation');
var conf1 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText();
expect(conf1).toContain("DBM");
var conf2 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[3]/div[2]/div[1]/div/div[2]/span/span/span")).getText();
expect(conf2).toContain("£50.00");
var dbmRef = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText().then(console.log);
// allows time for Outlook to capture email
browser.sleep(2000);
browser.get('https://outlook.com/');
browser.ignoreSynchronization = true;
browser.sleep(10000);
//chooses sign-in
element(by.xpath("html/body/section/div/div/nav/div/div/div/a")).click();
browser.sleep(500);
// enters credentials
element(by.xpath(".//*[@id='i0116']")).sendKeys('xxxxxx@outlook.com');
browser.sleep(1000);
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(500);
element(by.xpath(".//*[@id='i0118']")).sendKeys('pppppppp');
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(300);
expect(browser.getTitle()).toEqual('Mail - David Redmayne - Outlook');
browser.sleep(10000);
element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[1]/div[2]/div/div/div/div/div/div[2]/div/div/div")).click();
browser.sleep(500);
var dbm = element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[3]/div/div/div/div/div[2]/div/div[1]/div/div/div/div[2]/div[1]/div/div/div/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td/b")).getText();
expect(dbm).toContain(dbmRef);
});
});
是的,AZ_ 是对的这个问题与 javascript variable scope.
有关
但是,解决方案是您可以在 it
块之外初始化变量。
更新:
describe('DBM Hotel', function () {
var dbmRef;
it('Confirmation', function () {
// ...
element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText().then(text => {
dbmRef = text;
});
// ...
var dbm = element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[3]/div/div/div/div/div[2]/div/div[1]/div/div/div/div[2]/div[1]/div/div/div/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td/b")).getText();
expect(dbm).toContain(dbmRef);
});
});
你的问题的答案很简单,你只需像这样在 describe
之外定义你的变量
let myVar;
describe('DBM Hotel', function () {
it('Confirmation', function () {
console.log(myVar); // undefined
myVar = "value";
});
it('Confirmation', function () {
console.log(myVar); // value
});
});
不确定为什么它在 describe
中不起作用,但我假设是因为 Jasmine 的工作方式,'parses' 描述了当浏览器不可用时它的所有 it
块还没开。
但这不是您的问题,因为您在同一个 it
块内完成所有操作。本质上你有很多问题。您的主要问题是如何设置变量
var dbmRef = element(by.xpath("xpath")).getText().then(console.log);
这个意思是
var dbmRef = element(by.xpath("xpath")).getText().then(
function(value) {
console.log(value)
}
);
您记录了您的文本,但默认情况下该功能仍然是 returns undefined
,要更改它,您只需添加 return 语句,例如
var dbmRef = element(by.xpath("xpath")).getText().then(
function(value) {
console.log(value);
return value
}
);
这是一种方式。另一种方式是
let dbmRef;
describe('DBM Hotel', function () {
it('Confirmation', function () {
// ...
element(by.xpath("xpath")).getText().then(
function(value) {
dbmRef = value
}
);
// ...
});
});
您必须了解 Promises 才能使用此语法。最后最好的方法是这个
it('Confirmation', async function () {
// ...
dbmRef = await element(by.xpath("xpath")).getText();
// ...
});
但它需要 await browser.waitForAngularEnabled(true)
和一些关于 async/await
关键字的知识。但是理解它们比 Promise 容易得多,所以我强烈建议花一天时间阅读所有相关内容
最后我会提到你的代码中的其他一些问题
// #1
browser.ignoreSynchronization = true;
browser.sleep(500);
expect(browser.getTitle()).toEqual('| Confirmation');
// #2
var conf1 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText();
expect(conf1).toContain("DBM");
var conf2 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[3]/div[2]/div[1]/div/div[2]/span/span/span")).getText();
expect(conf2).toContain("£50.00");
// #3
var dbmRef = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText().then(console.log);
browser.sleep(2000);
browser.get('https://outlook.com/');
// #4
browser.ignoreSynchronization = true;
browser.sleep(10000);
element(by.xpath("html/body/section/div/div/nav/div/div/div/a")).click();
browser.sleep(500);
element(by.xpath(".//*[@id='i0116']")).sendKeys('xxxxxx@outlook.com');
browser.sleep(1000);
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(500);
element(by.xpath(".//*[@id='i0118']")).sendKeys('pppppppp');
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(300);
expect(browser.getTitle()).toEqual('Mail - David Redmayne - Outlook');
browser.sleep(10000);
element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[1]/div[2]/div/div/div/div/div/div[2]/div/div/div")).click();
browser.sleep(500);
// #5
var dbm = element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[3]/div/div/div/div/div[2]/div/div[1]/div/div/div/div[2]/div[1]/div/div/div/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td/b")).getText();
expect(dbm).toContain(dbmRef);
#1 如果您使用量角器 5 及更高版本,则不推荐使用此命令
#2 由于 promise 的工作方式,该命令有时可能不起作用
#3是你的主要问题,我已经解释过了
#4 重复命令,你不需要它
#5 不要使用这些长 xpath,它们每天都会崩溃
我有一个测试规范文件,其目的是检查我们应用程序中的预订参考,然后检查电子邮件中是否引用了相同的参考。
在测试的第一部分,我声明了一个名为 dbmRef
的变量 - 我知道这是有效的,因为我有一个显示变量内容的 console.log
。
进一步在电子邮件系统 (Outlook.com) 中,我有另一个名为 dbm
的变量,它可以在电子邮件正文中找到预订编号。
最后,我有 expect(dbm).toContain(dbmRef)
但是这个错误 Expected 'DBM040815' to contain undefined.
我假设 Protractor 不能 'see' 脚本上方的第一个变量...是这样吗?如果是这样,我该如何补救?
附上代码 - 不是最终形式!
/**********************
* Company: Guestline
* Product: DBM
* Author: D Redmayne
**********************/
var hotKeys = require('protractor-hotkeys');
describe('DBM Hotel', function() {
it('Confirmation', function() {
browser.ignoreSynchronization = true;
browser.sleep(500);
// assertions
expect(browser.getTitle()).toEqual('| Confirmation');
var conf1 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText();
expect(conf1).toContain("DBM");
var conf2 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[3]/div[2]/div[1]/div/div[2]/span/span/span")).getText();
expect(conf2).toContain("£50.00");
var dbmRef = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText().then(console.log);
// allows time for Outlook to capture email
browser.sleep(2000);
browser.get('https://outlook.com/');
browser.ignoreSynchronization = true;
browser.sleep(10000);
//chooses sign-in
element(by.xpath("html/body/section/div/div/nav/div/div/div/a")).click();
browser.sleep(500);
// enters credentials
element(by.xpath(".//*[@id='i0116']")).sendKeys('xxxxxx@outlook.com');
browser.sleep(1000);
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(500);
element(by.xpath(".//*[@id='i0118']")).sendKeys('pppppppp');
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(300);
expect(browser.getTitle()).toEqual('Mail - David Redmayne - Outlook');
browser.sleep(10000);
element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[1]/div[2]/div/div/div/div/div/div[2]/div/div/div")).click();
browser.sleep(500);
var dbm = element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[3]/div/div/div/div/div[2]/div/div[1]/div/div/div/div[2]/div[1]/div/div/div/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td/b")).getText();
expect(dbm).toContain(dbmRef);
});
});
是的,AZ_ 是对的这个问题与 javascript variable scope.
有关但是,解决方案是您可以在 it
块之外初始化变量。
更新:
describe('DBM Hotel', function () {
var dbmRef;
it('Confirmation', function () {
// ...
element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText().then(text => {
dbmRef = text;
});
// ...
var dbm = element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[3]/div/div/div/div/div[2]/div/div[1]/div/div/div/div[2]/div[1]/div/div/div/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td/b")).getText();
expect(dbm).toContain(dbmRef);
});
});
你的问题的答案很简单,你只需像这样在 describe
之外定义你的变量
let myVar;
describe('DBM Hotel', function () {
it('Confirmation', function () {
console.log(myVar); // undefined
myVar = "value";
});
it('Confirmation', function () {
console.log(myVar); // value
});
});
不确定为什么它在 describe
中不起作用,但我假设是因为 Jasmine 的工作方式,'parses' 描述了当浏览器不可用时它的所有 it
块还没开。
但这不是您的问题,因为您在同一个 it
块内完成所有操作。本质上你有很多问题。您的主要问题是如何设置变量
var dbmRef = element(by.xpath("xpath")).getText().then(console.log);
这个意思是
var dbmRef = element(by.xpath("xpath")).getText().then(
function(value) {
console.log(value)
}
);
您记录了您的文本,但默认情况下该功能仍然是 returns undefined
,要更改它,您只需添加 return 语句,例如
var dbmRef = element(by.xpath("xpath")).getText().then(
function(value) {
console.log(value);
return value
}
);
这是一种方式。另一种方式是
let dbmRef;
describe('DBM Hotel', function () {
it('Confirmation', function () {
// ...
element(by.xpath("xpath")).getText().then(
function(value) {
dbmRef = value
}
);
// ...
});
});
您必须了解 Promises 才能使用此语法。最后最好的方法是这个
it('Confirmation', async function () {
// ...
dbmRef = await element(by.xpath("xpath")).getText();
// ...
});
但它需要 await browser.waitForAngularEnabled(true)
和一些关于 async/await
关键字的知识。但是理解它们比 Promise 容易得多,所以我强烈建议花一天时间阅读所有相关内容
最后我会提到你的代码中的其他一些问题
// #1
browser.ignoreSynchronization = true;
browser.sleep(500);
expect(browser.getTitle()).toEqual('| Confirmation');
// #2
var conf1 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText();
expect(conf1).toContain("DBM");
var conf2 = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[3]/div[2]/div[1]/div/div[2]/span/span/span")).getText();
expect(conf2).toContain("£50.00");
// #3
var dbmRef = element(by.xpath(".//*[@id='root']/div[2]/div/div[2]/div/section/div[1]/div[2]/div/h4")).getText().then(console.log);
browser.sleep(2000);
browser.get('https://outlook.com/');
// #4
browser.ignoreSynchronization = true;
browser.sleep(10000);
element(by.xpath("html/body/section/div/div/nav/div/div/div/a")).click();
browser.sleep(500);
element(by.xpath(".//*[@id='i0116']")).sendKeys('xxxxxx@outlook.com');
browser.sleep(1000);
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(500);
element(by.xpath(".//*[@id='i0118']")).sendKeys('pppppppp');
element(by.xpath(".//*[@id='idSIButton9']")).click();
browser.sleep(300);
expect(browser.getTitle()).toEqual('Mail - David Redmayne - Outlook');
browser.sleep(10000);
element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[1]/div[2]/div/div/div/div/div/div[2]/div/div/div")).click();
browser.sleep(500);
// #5
var dbm = element(by.xpath("html/body/div[2]/div/div[2]/div/div[1]/div[3]/div[2]/div/div[3]/div/div/div/div/div[2]/div/div[1]/div/div/div/div[2]/div[1]/div/div/div/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td/b")).getText();
expect(dbm).toContain(dbmRef);
#1 如果您使用量角器 5 及更高版本,则不推荐使用此命令
#2 由于 promise 的工作方式,该命令有时可能不起作用
#3是你的主要问题,我已经解释过了
#4 重复命令,你不需要它
#5 不要使用这些长 xpath,它们每天都会崩溃