发现元素可见后无法使用递归定位元素

Cannot locate element using recursion after it found it as visible

我的问题:

我正在尝试使用页面对象中的部分单击 Nightwatch 下拉菜单中的选项。我不确定这是部分声明的问题还是我遗漏了与范围相关的内容。问题是它发现该元素是可见的,但是当它尝试单击时会抛出无法使用递归定位它的错误。

我可以尝试使用部分解决此问题吗?

测试中:

var myPage = browser.page.searchPageObject();
var mySection = searchPage.section.setResults;

// [finding and clicking the dropdown so it opens and displays the options]
browser.pause (3000);

browser.expect.section('@setResults').to.be.visible.before(1000);
myPage.myFunction(mySection, '18');

页面对象中:

var searchKeywordCommands = {
    myFunction: function (section, x) {
        section.expect.element('@set18').to.be.visible.before(2000);
        if (x == '18') section.click('@set18');
        //[...]
};

module.exports = {
    //[.. other elements and commands..]
    sections: {
        setResults: {
            selector: '.select-theme-result', //have also tried with '.select-content' and '.select-options' but with the same result
            elements: {
                set18: '.select-option[data-value="18"]',
                set36: '.select-option[data-value="36"]' //etc

            }}}}

这是我的源代码:

当我 运行 这块核心时,它似乎找到了该部分,找到了可见的元素(我也可以清楚地看到它打开了下拉列表并显示了选项)但是当试图点击任何选项,我得到错误: <strong>错误:无法定位元素:Section[name=setResults],Element[name=@set18]”使用:recursion</strong>

这是完整的错误:

我的尝试:

我试图将 set18 选择器声明为一个单独的元素,而不是在部分内部,这样一切正常,但在部分内部不起作用。我还尝试了所有可用的选择器来定义该部分的选择器,但它不适用于其中任何一个。

这就是我正在做的事情(笑) 我假设步骤是(查找保管箱 - 单击保管箱 - select 值)。

var getValueElement = {
        getValueSelector: function (x) {
            return 'li[data-value="'+ x + '"]';
        }
}; 

module.exports = {
    //[.. other elements and commands..]
    sections: {
        setResults: {
            commands:[getValueElement],
            selector: 'div[class*="select-theme-result"', //* mean contains,sometime class is too long and unique,also because i am lazy.
            elements: {
                setHighlight:'li[class*="select-option-highlight"]',
                setSelected:'li[class*="select-option-selected"]', 
                //set18: 'li[data-value="18"]',
                //set36: 'li[data-value="36"]' 
                // i think getValueFunction is better,what if you have 100+ of set.

            }}}}

在你的测试中

var myPage = browser.page.searchPageObject();
var mySection = searchPage.section.setResults;

// [finding and clicking the dropdown so it opens and displays the options]
mySection
     .click('@dropboxSelector')
     .waitForElementVisible('@setHighlight',5000,false,
          function(){
            var set18 = mySection.getValueElement(18);
            mySection.click(set18);
            });

Ps:在我的情况下(我认为你的情况也是如此),dropbox 或任何在你的网络应用程序中多次使用的小型第三方 js 框架,所以最好为它创建一个不同的 PageObject,使 pageObject/section 尽可能简单。