我正在使用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命令函数中可见?
答案 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() 。