Nightwatch如何在命令中显示元素选择器?

时间:2017-08-02 15:43:41

标签: javascript

我正在使用Nightwatch编写测试来测试网格的分页。我正在使用页面对象和元素选择器来简化测试套件的维护。但是,似乎我在命令中使用元素选择器遇到了限制。以下代码执行时没有错误:



    pagination() {
      var lastPageNum;
      var currentPageNum;
      var newPageNum
      return this
      .getText('@pageNum1', function(result) {
        currentPageNum = parseInt(result.value);
        console.log('Current Page Number = ' + currentPageNum);
      })
      .getText('@pageNum2', function(result) {
        lastPageNum = parseInt(result.value);
        console.log('last Page Number = ' + lastPageNum);
        if (lastPageNum >= 2) {
          this.useXpath()
            .waitForElementVisible('//*[@id="borderLayout_eRootPanel"]/div[2]/div/div/span[2]/button[3]', 3000)            
            .click('//*[@id="borderLayout_eRootPanel"]/div[2]/div/div/span[2]/button[3]')
            .getText('//*[@id="borderLayout_eRootPanel"]/div[2]/div/div/span[2]/span[1]', function(result) {
              newPageNum = parseInt(result.value);
              console.log('New Page = ' + newPageNum);
              this.assert.equal(newPageNum, currentPageNum + 1, "Assert pagination to Next page passed.");
            })
        } else {
          console.log('Not enough rows exist in grid to test pagination, pages = ' + lastPageNum)
        }
      })
    },




请注意,我正在使用.getText命令的元素选择器。以下是我使用的选择器:



      pageNum1: {
        selector: '//*[@id="borderLayout_eRootPanel"]/div[2]/div/div/span[2]/span[1]',
        locateStrategy: 'xpath'
      },

      pageNum2: {
        selector: '//*[@id="borderLayout_eRootPanel"]/div[2]/div/div/span[2]/span[2]',
        locateStrategy: 'xpath'
      },




到目前为止,这么好。我遇到的问题是当我尝试用元素选择器替换.getText命令中的xpath元素时。这是我试图用以下代码替换上面的代码:



pagination() {
      var lastPageNum;
      var currentPageNum;
      var newPageNum
      return this
      .getText('@pageNum1', function(result) {
        currentPageNum = parseInt(result.value);
        console.log('Current Page Number = ' + currentPageNum);
      })
      .getText('@pageNum2', function(result) {
        lastPageNum = parseInt(result.value);
        console.log('last Page Number = ' + lastPageNum);
        if (lastPageNum >= 2) {
          this.useXpath()
            .waitForElementVisible('@nextPageButton', 3000)            
            .click('@nextPageButton')
            .getText('@pageNum1', function(result) {
              newPageNum = parseInt(result.value);
              console.log('New Page = ' + newPageNum);
              this.assert.equal(newPageNum, currentPageNum + 1, "Assert pagination to Next page passed.");
            })
        } else {
          console.log('Not enough rows exist in grid to test pagination, pages = ' + lastPageNum)
        }
      })
    },




这是我正在使用的附加元素选择器:



      nextPageButton: {
        selector: '//*[@id="borderLayout_eRootPanel"]/div[2]/div/div/span[2]/button[3]',
        locateStrategy: 'xpath'
      },




当我尝试在使用元素选择器替换.getText命令中的xpaths后运行测试时,测试失败并显示以下错误:

Timed out while waiting for element <@NextPageButton> to be present for 3000 milliseconds.  - expected "visible" but got: "not found"

有没有办法让元素选择器在.getText命令函数中可见?

1 个答案:

答案 0 :(得分:0)

由于似乎没有办法在命令中实际使用选择器,我将发布我最近使用的解决方法。这很简单:在页面对象中,我声明一个包含我想用作选择器的web元素的常量。在声明用于保存页面对象方法的常量或变量之前,这需要位于页面对象的顶部。我上面发布的原始片段只包含方法,而不是整个页面对象,但声明需要在此之前发生。以下是包含上述方法的页面对象的示例:

const nPageButton =  '//*[@id="borderLayout_eRootPanel"]/div[2]/div/div/span[2]/button[3]';
const gridComands = {
  //page object methods go here
}

将web元素声明为常量后,可以在构造元素选择器时使用该常量:

  nextPageButton: {
    selector: nPageButton,
    locateStrategy: 'xpath'
  },

这样可以更轻松地进行维护,同时牺牲了选择器提供的一些功能。当选择器不起作用时,您可以在页面对象中使用常量,您将失去定义定位策略的实用程序,因此在为Web元素使用xpath时,您需要依赖于方法中的.useXpath() 。