selenium - restartBrowserBetweenTests 与 onPrepare() 之间的交互

标签 selenium protractor

我希望每个测试都在干净的浏览器 (Firefox) 上运行,因此我使用 restartBrowserBetweenTests:true 选项。因为我使用非 Angular 演示应用程序,所以在 onPrepare() 函数中我使用 browser.waitForAngularEnabled(false)。当我运行单个规范时,它工作正常,但是当我运行 2 个规范时,我遇到错误。

在页面上找不到 Angular。如果这不是 Angular 应用程序,您可能需要关闭等待 Angular。

我该如何解决这个问题?此外,在这种情况下,onPrepare 是如何工作的 - 每次浏览器启动时或在所有规范之前一次?

这是我的conf.js

const screenshotReporter = require('./screenshotCustomReporter')

exports.config = {
    capabilities: {
        browserName: 'firefox'
    },

    restartBrowserBetweenTests: true,

    framework: 'jasmine',
    directConnect: true,

    baseUrl: URL,

    specs: ['path/**/*Spec.js'],

    // Options to be passed to Jasmine.
    jasmineNodeOpts: {
        defaultTimeoutInterval: 30000,
        includeStackTrace: true
    },

    onPrepare: () => {
        require("@babel/register");

        jasmine.getEnv().addReporter(screenshotReporter)
        browser.waitForAngularEnabled(false)
    }
}

<小时/>

您可以使用以下简单项目重现此问题:

conf.js

exports.config = {
    framework: 'jasmine',
    specs: ['./app.1.js', './app.2.js'],
    seleniumAddress: 'http://localhost:4444/wd/hub',
    restartBrowserBetweenTests:true,
    onPrepare:function(){
        browser.waitForAngularEnabled(false);
    },
}

app.1.js

describe('second test', () => {
    it('should check is displayed successfully', () => {
        browser.driver.get("https://stackoverflow.com");
        browser.driver.sleep(5000);
        expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true);
    });
});

app.2.js

describe('first test', () => {
    it('should check is displayed successfully', () => {
        browser.driver.get("https://stackoverflow.com");
        browser.driver.sleep(5000);
        expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true);
    });
});

最佳答案

OnPrepare 是为套件需要执行的所有设置而定义的。就是这个意思 无论规范文件的数量有多少,始终是一次性操作。

您需要理解的一个概念是,每当新实例 Firefox 浏览器启动后,WebdriverJs 初始化 webdriver 的实例。 Protractor 中的全局对象浏览器也被初始化。

在您的情况下,第一个规范文件启动 Firefox 浏览器,随后执行 OnPrepare 函数, Protractor 的默认设置被 WaitForAngularEnabled 覆盖。但是当您运行第二个规范文件时, Firefox 浏览器再次启动,并带有新的 webdriver 和 Protractor 浏览器实例,预计 角度应用程序,在这种情况下测试用例会失败。

解决这个问题的方法是在spec文件中使用before函数

describe('first test', () => {
      before(() => {
                     browser.waitForAngularEnabled(false);
       });

    it('should check is displayed successfully', () => {
        browser.driver.get("https://stackoverflow.com");
        browser.driver.sleep(5000);
        expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true);
    });
});

注意:如果您使用 restartBrowserBetweenTests: true 那么您将必须使用 beforeEach() 函数来等待 waitForAngularEnabled,因为每次都会创建新的 webdriver 实例。

关于selenium - restartBrowserBetweenTests 与 onPrepare() 之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56379706/

相关文章:

c# - Selenium - SendKeys ("@")写入 "à"

python - 尝试使用 Selenium webdriver 登录时出错

c# - 使用带有 C# 的 Selenium WebDriver 全屏打开浏览器窗口

jasmine - Protractor Jasmine Reporter + BDD + Azure DevOps

javascript - 是否可以更改 Protractor 事件队列或控制流?

javascript - 如何从 Protractor 测试发出 POST 请求?

typescript - 实习生 Selenium 错误 : BUG: suiteEnd was received for invalid session

python - Selenium 远程连接拒绝使用 Python split

javascript - 告诉 Protractor 在异步调用时阻塞

javascript - 这个模式是如何工作的 : 'test/e2e/**/*.spec.js' ?