1

我有一个始终具有相同结构的菜单,但 ID 可以从一个安装更改为另一个。唯一保持不变的是标题(在我的例子中是“插件”)。我在我的测试中调用document.getElementsByClassName函数:Selector

var slides = Selector(() =>{
    return document.getElementsByClassName("c-p-header-text");
});

菜单元素的每个标题都有c-p-header-text类。这是菜单标题元素的样子:

<div id="ext-comp-1002" class="c-p c-tree c-p-collapsed" style="width: auto;">
     <div class="c-p-header c-unselectable c-accordion-hd" id="ext-gen135" style="cursor: pointer;">
        <div class="c-tool c-tool-toggle" id="ext-gen140">&nbsp;</div>
        <img src="/backEnd/images/s.gif" class="c-p-inline-icon order"><span class="c-p-header-text" id="ext-gen150">Plugins</span>
     </div>

它很容易使用await t.click("#ext-gen150"),但总是这个 id 是不安全的。

这是我尝试过的:

await t
    .click('#sites__db');
var slides = Selector(() =>{
    return document.getElementsByClassName("c-p-header-text");
});
console.log("[DEBUG]" + slides);
console.log("[DEBUG] found " + slides.length + " elements");
for(var i = 0; i < slides.length; i++)
{
    var txtOfCurrElem = slides.item(i).innerText; 
    console.log("[DEBUG "+ i +"] Text: " + txtOfCurrElem);
}

运行这个测试给我以下输出:

[DEBUG]function __$$clientFunction$$() {
        var testRun = builder.getBoundTestRun() || _testRunTracker2.default.resolveContextTestRun();
        var callsite = (0, _getCallsite.getCallsiteForMethod)(builder.callsiteNames.execution);
        var args = [];

        // OPTIMIZATION: don't leak `arguments` object.
        for (var i = 0; i < arguments.length; i++) {
            args.push(arguments[i]);
        }return builder._executeCommand(args, testRun, callsite);
    }
[DEBUG] found 0 elements

计划是找到元素(标题为“插件”),然后在测试继续时单击它。

4

2 回答 2

1
  1. document.getElementsByClassName在这种情况下,您不必使用。您可以只使用 CSS 类选择器:

    var slides = Selector('.c-p-header-text');
    
  2. count在处理选择器数组时应该使用该属性。文档。此外,元素属性,如exists,countDOM 节点状态属性是 Promisified,所以当你在 not in 中使用它们时t.expect,你应该使用await关键字:

    var count = await slides.length;
    
    console.log("[DEBUG] found " + count + " elements");
    
    for(var i = 0; i < count; i++)
    {
        var txtOfCurrElem = await slides.nth(i).innerText; 
        console.log("[DEBUG "+ i +"] Text: " + txtOfCurrElem);
    }
    
于 2017-12-07T13:08:40.437 回答
1

我为我的问题找到了一个简单的答案。我使用该.withText选项单击 Plugins 元素:

.click(Selector('span').withText("Plugins"))

由于此名称也是唯一的,因此它始终是被点击的正确元素。如果我的网站不是 extJS Web 应用程序,我不知道它是否可以与 @AndreyBelym 的解决方案一起使用。

于 2017-12-13T13:54:17.103 回答