【问题标题】:Can I get Protractor/Jasmine to hit a breakpoint when an element locator fails to find its target?当元素定位器找不到目标时,我可以让 Protractor/Jasmine 打断点吗?
【发布时间】:2020-11-17 04:12:41
【问题描述】:

每次量角器元素定位器失败时,它都会打印一个错误,并在我的规范和套件中继续沿着无尽的级联故障的可怕路径。接下来的每个测试都依赖于元素定位器找到它的元素,并且依赖于当前的规范通过。

我想在使用控制台时保持正在测试的网页处于打开状态。目标是调试页面的当前状态并调查元素定位器可能未能找到其目标的原因。

我不太担心整个套件失败并在第一个规范失败时退出(我已经看到了其他关于 --fail-fast 并在第一个规范失败时停止的答案。)这不是我想要的方法采取。我想设置一个断点,并在页面运行时检查环境。

也许doThisOnFailure: () => { debugger } 有类似 Jasmine 的选项,我认为这对我有用。

我真的不喜欢在 afterEach 期间使用规范报告器执行并检查整个规范功能的 Jasmine 环境中失败的规范计数的解决方案。我想立即知道元素定位器何时失败,并在失败后立即中断。

也许真的很恶心的东西会起作用$('element').click().catch(() => { debugger })。

编辑:请注意,我是在询问是否打破规范,而不是在规范结束时打破。

it('should execute deadly code', function () {
    p.navigation.openStorageConfigTab()
    $$('.bad-selector').get(0).click() /* IMPORTANT: I want to break here */
    p.volume.navigateTo()
})

it('should not execute this spec', function () {
    $$('.bad-selector').get(0).click()
})

还有输出

  ✗ should execute deadly code
    - Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator By(css selector, .bad-selector)
  ✗ should not execute this spec
    - Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator By(css selector, .bad-selector)

【问题讨论】:

    标签: jasmine protractor


    【解决方案1】:

    我可以向你推荐我使用的方法,希望你能从这里开始

    总体方法是等到您在浏览器网址中输入close/ 命令:

    await browser.waitForAngularEnabled(false);
    await browser.wait(
      async () => {
        let url = await browser.getCurrentUrl();
        return url.includes('close/');
      },
      5 * 60 * 1000,
      'Keep-alive timeout reached, closing the session...'
    );
    

    问题是你什么时候想调用它。我在配置文件中使用了onComplete 回调函数的优势。当它被调用时,浏览器仍然可用。因此,一旦所有测试完成,它不会退出 5 分钟,除非我将 close/ 提交到 url 字段。显然,这可以是有条件的,通过添加类似if (DEBUG === true)

    此设置的一个缺点是它会在所有测试完成后被调用,并且您的规范可能已经离开出现错误的页面。所以你也可以做的是利用茉莉花记者的优势(如果你使用茉莉花)。粗略地说,您只需将其添加到您的onPrepare func:

    jasmine.getEnv().addReporter({
        jasmineStarted: function(suiteInfo) {},
        suiteStarted: function(result) {},
        specStarted: function(result) {},
        specDone: async function(spec) {
            if (spec.status === 'failed') {
                await browser.waitForAngularEnabled(false);
                await browser.wait(
                    async () => {
                        let url = await browser.getCurrentUrl();
                        return url.includes('close/');
                    },
                    5 * 60 * 1000,
                    'Keep-alive timeout reached, closing the session...'
                );
                await browser.close();
                process.exit(35);
            }
        },
        suiteDone: function(result) {},
        jasmineDone: function(result) {},
    });
    

    因此,如果任何it 块具有failed 状态,那么它将停止。但是,我还没有测试它,我会留给你。其次,我没有考虑其他排队的规格会发生什么,因为您被重定向到不存在的网址close/,但我相信它仍然对您有用。最坏的情况,只要你理解这个概念,你就可以玩让它继续或关闭浏览器实例

    附: 我修改了代码以在您键入 close/ 时关闭浏览器,添加

    await browser.close();
    process.exit(35);
    

    我用以下场景测试了这段代码:

    • 幸福之路:所有5个it都成功
    • 第二个 it 块的第一个元素查找器失败
    • 第二个 it 块的第二个元素查找器失败

    全部通过。代码按预期工作

    【讨论】:

    • 是的。当量角器找不到元素时会发生什么,如果将it 块标记为失败,则抛出错误,退出此特定步骤(it),并且在下一个开始之前,调用specDone 函数。不要让名称 spec 混淆您 - spec === it(不是规范文件)和 suite === describe。先试一试,告诉我你遇到了什么错误
    • 最坏的情况,将它放在afterEach部分并检查it状态是否失败。虽然您必须将代码复制到每个规范文件
    • 如果你尝试,你会感到惊讶
    • 好吧,一个更正,除非你将每个$(...) 包装在try/catch 中,这将起作用
    • @activedecay 我刚刚在本地测试了代码,一切正常。当您输入close/ 时,我改进了退出量角器的代码
    猜你喜欢
    • 2014-12-28
    • 2017-03-14
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多