如何使Nightwatch在页面对象文件中默认使用xpath

时间:2016-03-22 06:53:33

标签: xpath pageobjects nightwatch.js

我的所有页面对象都是这样的:

  elements: {
      header: {
         locateStrategy: 'xpath',
         selector: "//h3[text()='Welcome']"
      },
      loginButton: {
         locateStrategy: 'xpath',
         selector: "//button[text()='Login']"
      },
      forgotPasswordLink: {
         locateStrategy: 'xpath',
         selector: "//a[text()='Forgot Password?']"
      },
      signupButton: {
         locateStrategy: 'xpath',
         selector: "//button[text()='Signup']"
      }

如果我可以说"在任何地方使用xpath"那会更好。 - 那将彻底崩溃

The docs说您应该可以在"测试设置"中设置"use_xpath" : true,但我已经在nightwatch.json中可以看到的所有地方尝试过,{它没有任何效果。

(如果它们意味着此设置将影响页面对象文件中的声明,则无论如何都不完全清楚:示例仅显示它影响测试用例中的次要断言调用)。

4 个答案:

答案 0 :(得分:3)

您可以使用这样的javascript函数(取决于您最喜欢的创建对象的方式):

var xSelector = function (selector) {
    return {
        selector: selector,
        locateStrategy: 'xpath'
    }
};

然后像这样使用它:

elements: {

    xxx: xSelector('//a[text()="Bank Details"]')
    createStepButton: { selector: '#menu-create-item' },
}

提示:在上面的示例中,createStepButton仍在使用css选择器策略。还要考虑创建一个cssSelector函数,以便元素部分具有统一的可读性。

答案 1 :(得分:3)

尝试设置: “ use_xpath”:是

在nightwatch.conf.js文件中,而不是nightwatch.json

为我工作:)

答案 2 :(得分:0)

为了解决这个问题,你可以遍历你的元素并为每个元素设置任何给定的定位策略,如下所示:

var pageObject = {
    url: 'https://google.com',
    elements: {
        myFirstElement: {
            selector: "//div[@class='my-first-el']"
        },
        mySecondElement: {
            selector: "//div[@class='my-seconds-el']"
        }
    }
};

for (var el in pageObject.elements){
    pageObject.elements[el]["locateStrategy"] = "xpath";
}
module.exports = pageObject;

答案 3 :(得分:0)

也许会帮助某人。

尝试设置:

"use_xpath": true

在您的 nightwatch.json