Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使变量在整个spec.js文件中可用_Javascript_Protractor - Fatal编程技术网

Javascript 使变量在整个spec.js文件中可用

Javascript 使变量在整个spec.js文件中可用,javascript,protractor,Javascript,Protractor,我有一个测试规范文件,其目的是在我们的应用程序中检查预订参考,然后检查电子邮件中是否引用了相同的参考 在测试的第一部分中,我声明了一个名为dbmRef的变量-我知道它正在工作,因为我有一个显示变量内容的控制台.log 在电子邮件系统(Outlook.com)中,我有另一个名为dbm的变量,它在电子邮件正文中查找预订参考 最后,我有expect(dbm).toContain(dbmRef)但是的这个错误期望'DBM040815'包含未定义的内容。 我假设量角器看不到脚本后面的第一个变量……是这样吗

我有一个测试规范文件,其目的是在我们的应用程序中检查预订参考,然后检查电子邮件中是否引用了相同的参考

在测试的第一部分中,我声明了一个名为
dbmRef
的变量-我知道它正在工作,因为我有一个显示变量内容的
控制台.log

在电子邮件系统(Outlook.com)中,我有另一个名为
dbm
的变量,它在电子邮件正文中查找预订参考

最后,我有
expect(dbm).toContain(dbmRef)
但是
的这个错误期望'DBM040815'包含未定义的内容。

我假设量角器看不到脚本后面的第一个变量……是这样吗?如果是的话,我该如何补救

随信附上代码-不是最终形式

/**********************
 * 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);
  });
}); 

是的,阿兹是对的,这个问题与

但是,解决方案是可以在
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);
      });
    });

问题的答案很简单,您只需在
description
之外定义变量,如下所示

let myVar;

describe('DBM Hotel', function () {

  it('Confirmation', function () {
    console.log(myVar); // undefined
    myVar = "value";
  });

  it('Confirmation', function () {
    console.log(myVar); // value
  });
});
我不知道为什么它在
descripe
中不起作用,但我假设是因为Jasmine是如何工作的,当浏览器还没有打开时,它会“解析”descripe及其
it

但这不是您的问题,因为您在同一块
中执行所有操作。基本上你有很多问题。您的主要问题是如何设置变量

var dbmRef = element(by.xpath("xpath")).getText().then(console.log);
这意味着

var dbmRef = element(by.xpath("xpath")).getText().then(
  function(value) {
    console.log(value)
  }
);
您可以记录文本,但默认情况下,函数仍然返回
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
      }
    );
  // ...
  });
});
您必须理解使用此语法的承诺。最后,最好的办法就是这样

it('Confirmation', async function () {
  // ...
  dbmRef = await element(by.xpath("xpath")).getText();
  // ...
});
但是它需要
await browser.waitForAngularEnabled(true)
和一些关于
async/await
关键字的知识。但理解它们要比承诺容易得多,所以我强烈建议花一天时间阅读所有关于它的内容

最后,我将提到代码中的一些其他问题

// #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由于承诺的工作方式,命令有时可能不起作用

#3是你的主要问题,我已经解释过了

#4重复命令,您不需要它


#5不要使用这些长xpath,它们每天都会中断

在哪里声明变量,变量的作用域是什么?这与量角器无关这是代码-不是最终状态!!谢谢两个-我已经包括了脚本,但同时我会尝试上面的内容。@sergey-仍然有问题-请发表你的建议。非常感谢-那里有很多有用的信息!!