簡體   English   中英

使變量在整個 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 無法“看到”腳本中的第一個變量……是嗎? 如果是這樣,我該如何補救?

附上代碼 - 不是最終形式!

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

回答您的問題很簡單,您只需像這樣在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 的工作方式,當瀏覽器尚未打開時,它會“解析”所有的it塊。

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

您記錄文本,但默認情況下該函數仍然返回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
      }
    );
  // ...
  });
});

您必須了解 Promise 才能使用此語法。 最后最好的方法是這個

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 如果您使用 Protractor 5 及更高版本,則不推薦使用此命令

#2 該命令有時可能不起作用,因為 Promise 是如何工作的

#3 是你的主要問題,我已經解釋過了

#4 重復命令,你不需要它

#5 不要使用這些長的 xpath,它們每天都會壞掉

是的,AZ_ 是對的,這個問題與javascript 變量 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);
      });
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM