【问题标题】:How to re-initialize page objects in protractor before each scenario?如何在每个场景之前重新初始化量角器中的页面对象?
【发布时间】:2019-03-04 13:36:38
【问题描述】:

我正在使用量角器与黄瓜和 trypescript。我将所有页面对象都定义为类。在步骤定义中,我初始化所需的每个页面对象并将其用于各种断言或操作。运行一个场景时,设置工作正常。但是,如果我想运行更多场景,我需要找到一种方法来重新初始化每个场景的页面对象,否则量角器将使用先前初始化的对象以及为第一个浏览器实例获取的元素,我会得到一个错误。

关于如何做到这一点的任何想法?我试图在 github 上查看项目示例,但找不到任何可以解决我的问题的内容。

这是我设置中的一个小例子:

loginpage.po.ts:

export class LoginPage{
    ...     
    async login(username:string,password:string){
        await this.enteremail(username);
        await this.clickNext();
        await this.enterPass(password);
        await this.clickSignIn();
   ...
}
    }

common.steps.ts:

import { LoginPage} from '../pageobjects/loginPage.po';
...
var loginPage: LoginPage= new LoginPage();

Given('I have the URL ', async () => {
    await browser.get(config.baseUrl);
    await expect(loginPage.isAtSignIn()).to.eventually.be.true;
});

 Given ('I login', async () => {
     await loginPage.login(config.params.username, config.params.password);
 });

【问题讨论】:

  • 您的方法看起来是正确的。请显示您遇到的错误。
  • 在运行两个场景时,我收到第二个场景的以下错误:“NoSuchSessionError: This driver instance does not have a valid session ID (d did you call WebDriver.quit()?) and may不再使用。”如果我在“Given”函数中移动 LoginPage 的初始化,这两种情况都会通过。但是,想知道是否有更优雅的方法来执行此操作,而不是在步骤定义中初始化页面对象(因为当我想重用其他扫描仪中的某些步骤时,这种方法可能会导致问题)
  • 检查您的代码以查看您在钩子后或第一个场景的最后一步关闭浏览器会话。喜欢打电话browser.quite()。或者在量角器conf.js中设置restartBrowser
  • 是的,我在 hooks.ts 中有这个,并且从日志中可以看到它被执行:After(async () => { await browser.quit(); });跨度>
  • 如果在每个场景后关闭浏览器不是强制选项,请将其从 after hook 中删除。

标签: typescript protractor cucumber pageobjects


【解决方案1】:

在你的规范文件中创建一个函数

initializePageObjects() {
var loginPage: LoginPage= new LoginPage();
}

现在在你的beforeEach() 中添加这个函数,这样你的类就会为每个it() 初始化。

beforeEach(){
await initializePageObjects();
}

希望对你有帮助

【讨论】:

  • 它就是这样工作的。但是,我决定从方法中初始化并返回页面对象,因此我避免在开始时初始化所有页面对象。我会将响应标记为正确,因为建议的解决方案有效。
猜你喜欢
  • 2020-07-19
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2021-07-08
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多