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

How to make Nightwatch use xpath by default in page object files

我所有的页面对象看起来像这样:

  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']"
      }

如果我能说 "use xpath everywhere" 会更好 - 那会彻底崩溃

The docs 说你应该可以在你的 "test settings" 中设置 "use_xpath" : true,但我在 nightwatch.json 中可以看到的所有地方都试过了,它没有任何效果。

(不完全清楚他们是否表示此设置会影响页面对象文件中的声明,无论如何:该示例仅显示它影响测试用例中的后续断言调用)。

您可以像这样使用 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 函数以实现元素部分的统一可读性。

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

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;

也许它会对某人有所帮助。

尝试设置:

"use_xpath": true

在你的nightwatch.json

尝试设置:

"use_xpath": true

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

对我有用:)