【问题标题】:TestCafe: Selector within SelectorTestCafe:选择器中的选择器
【发布时间】:2020-11-02 08:48:44
【问题描述】:

我为我的页面模型开发了一组助手。

这就是 DOM 的样子:

    <div id="parentA">
        <div class="child yes">hello</div>
        <div class="child">world</div>
    </div>
    
    <div id="parentB">
        <div class="child no">hello</div>
        <div class="child">world</div>
    </div>

现在我想检查#parentA#parentB 中的.child 元素之一。

import { Selector } from "testcafe";

fixture `children`
    .page `http://localhost:8080/index.html`;

// an example of what I expect.
// this is not how i want to write tests.
test("hard-coded: child in A has class 'yes'", async (t) => {
    const yesChild = Selector("#parentA .child").withText("hello");
    t.expect((await yesChild.classNames).includes("yes"));
});

// helper function for the page model (in a shared module later)
function getParent(name: string) {
    return Selector(`#parent${name}`);
}
// helper function for the page model (in a shared module later)
function getChild() {
    return Selector(".child");
}

// this is how I want to write tests.
test("parametric-find: child in A has class 'yes'", async (t) => {
    const parent = getParent("A");
    const child = getChild().withText("hello");
    const yesChild = parent.find(child); // there is no overload for find that takes another Selector.
    t.expect((await yesChild.classNames).includes("yes"));
});

我认为一种解决方案可能是这样的函数:

async function withinParent(child: Selector, parent: Selector): Selector {
   // how should I implement this?
}

另一种解决方案可能是创建 filterFunction 的高阶函数:

test("parametric-find-descendantChild: child in A has class 'yes'", async (t) => {
    const parent = getParent("A");
    const child = getChild().withText("hello");
    const yesChild = parent.find(descendantChild(child));
    
    t.expect((await yesChild.classNames).includes("yes"));
});
function descendantChild(child: Selector): (node: Element) => boolean {
    // how should I implement this?
}

但我能想到的所有方法都会导致死胡同。

  • parentchild 可以匹配多个元素
  • 没有简单的方法可以访问选择器选择的元素,以便将其与另一个选择器进行比较
  • 如何比较选择器?
  • 在元素级别上运行的函数/回调在浏览器中执行。我将选择器或选择器匹配的元素传递给浏览器函数有多冷?

好吧,我应该写一个功能请求,还是有一个聪明的方法来做到这一点?

【问题讨论】:

    标签: testing automation automated-tests e2e-testing testcafe


    【解决方案1】:

    您可以链接Selector 方法来实现此目的。

    function getParent(name) {
        return Selector(`#parent${name}`);
    }
    
    function getChildren(selector) {
        return selector.child('.child');
    }
    
    test(`parametric-find: child in A has class 'yes'`, async (t) => {
        const parent = getParent('A');
        const child  = getChildren(parent).withText('hello');
    
        await t.expect(child.classNames).contains('yes');
    });
    

    【讨论】:

    • 它不像我希望的那样通用。我现在反其道而行之。有多种方法可以为子级创建选择器,但只有一种方法可以为父级创建选择器。所以我只复制这个。 function getParentWith(name, child) {child.parent(`#parent${name}`)}
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2021-03-06
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多