Specflow Visual Studio C# - 如何 IWebdriver 在新窗口上恢复另一个场景的执行

您好,我对编码和规范流很陌生。

在我的功能文件中,我有两个场景。 运行场景 A 后,窗口关闭,场景 B 在另一个窗口上运行。然而,当场景 B 正在执行时,它不会从场景 A 离开的地方继续。

我想知道如何让场景B从场景A离开的地方继续。

我创建了一个类来存储我的所有元素(Iwebelements。)

这是我的特征文件

@navigation
Scenario: Login 
Given user is in Main Page
And user selects menu to navigate to User Schedule
And User Schedule page is displayed

@FORM
Scenario: Verify data can be entered on the form
When user click on the calendar icon 
Then a calendar should appear
And user should be able to select any date and year
When user click on the field Time  
Then a dropdown list id displayed
And user should select a Time

这是我的步骤定义

public class FillForm
    {

    private DriverHelper _driverHelper;
    Userpage UPage;
    LoginSteps LogSteps;
    LoginPage LogPage;

    

    public FillForm(DriverHelper driverHelper)
    {
        _driverHelper = driverHelper;
        UPage= new UserPage(driverHelper.WebDriver);
        LogPage = new LoginPage(driverHelper.WebDriver);

    }

    [Given(@"user is in  Main Page")]
    public void GivenUserIsInmainPage()
    {

     

        _driverHelper.WebDriver.Navigate().GoToUrl("www.randomsite.com");
        
 _driverHelper.WebDriver.FindElement(By.XPath("//input[@id='username']")).SendKeys("Test123");
            _driverHelper.WebDriver.FindElement(By.Id("Password")).SendKeys("P@ssword!");
            LogPage.ClickSignUp();
            Thread.Sleep(5000);
    }
    
    [Given(@"user selects menu to navigate to User Schedule")]
    public void GivenUserSelectsMenuToNavigateToUserSchedule()
    {
        UPage.ClickMenu();
        Thread.Sleep(5000);
        UPage.ClickSolution();
        Thread.Sleep(5000);
        UPage.ClickPM();
        Thread.Sleep(5000);
        UPage.ClickonForm(); 
        Thread.Sleep(6000);
    }
    
    [Given(@"User Schedule page is displayed")] 
    public void GivenUserSchedulePageIsDisplayed()
    {
        Assert.That(Upage.SyncNowbtnIsDisplayed(),Is.True);
       
    }

    [When(@"user click on the calendar icon")] //This is where scenario B starts
    public void WhenUserClickOnTheCalendarIcon()
    {
        
    }

这是我的钩子

[Binding]
public sealed class Hooks
{
    
    private DriverHelper _driverHelper;

    public Hooks(DriverHelper driverHelper) => _driverHelper = driverHelper;

    [BeforeScenario]
    public void BeforeScenario()
    {
        ChromeOptions option = new ChromeOptions();
        option.AddArguments("--start-maximized");
        option.AddArguments("--disable-gpu");
        
        _driverHelper.WebDriver = new ChromeDriver(option);
        
    }

    [AfterScenario]
    public void AfterScenario()
    {
        _driverHelper.WebDriver.Quit();
    }

那是我设置 IWebDriver 的 Driverhelper 类

public class DriverHelper
{
    public IWebDriver WebDriver { get; set; }
}
zj005386 回答:Specflow Visual Studio C# - 如何 IWebdriver 在新窗口上恢复另一个场景的执行

这是对行为驱动开发如何运作的误解。每个场景都应该是原子的。它应该是完全可以独立执行的,而不是依赖于任何其他场景。诀窍是创建额外的 Given 步骤来模拟之前的场景所做的事情。登录是您的第二个场景的先决条件。登录是在第一个场景中测试的行为。每个都应该有自己的步骤列表:

@navigation
Scenario: Login 
    Given user is in Main Page
    When user selects menu to navigate to User Schedule
    Then User Schedule page is displayed

建议对您的第一个场景进行一些更改,包括正确使用 WhenThen 关键字来描述操作和断言。您可以对多个步骤重复使用相同的步骤定义,因为 Given user selects menu to navigate to User Schedule 可以是“给定”或“何时”,具体取决于当前场景的上下文。我建议将 ... User Schedule page is displayed 转换为“Then”步骤,因为它正在做出断言。断言应该是一个“然后”步骤。

[Given(@"user selects menu to navigate to User Schedule")]
[When(@"user selects menu to navigate to User Schedule")]
public void GivenUserSelectsMenuToNavigateToUserSchedule()
{
    ...
}

[Then(@"User Schedule page is displayed")] 
public void GivenUserSchedulePageIsDisplayed()
{
    ...
}

第二种情况变成:

@FORM
Scenario: Verify data can be entered on the form
    Given user is in Main Page
    And user selects menu to navigate to User Schedule
    When user click on the calendar icon 
    Then a calendar should appear
    And user should be able to select any date and year
    When user click on the field Time  
    Then a dropdown list id displayed
    And user should select a Time

完全消除场景中的重复步骤实际上是不可取的。场景和行为驱动的开发首先与沟通有关。虽然重复步骤似乎是一个坏主意,但它仍然传达了该特定用例的完整范围。重复步骤比重复 C# 代码更容易被原谅。

如果你在每个场景中都复制了大量的步骤,可以考虑将常见的步骤重构为场景背景,可以消除重复的步骤:

Feature: ...

Background:
    Given common step 1
    And common step 2
    ...
    And common step N

Scenario: 1
    ...

Scenario: 2
    ...
本文链接:https://www.f2er.com/89386.html

大家都在问