Как реализовать объектную модель страницы в C# Selenium? - PullRequest
1 голос
/ 04 мая 2020

Настройка

  • DotNetCore в Visual Studio 2019
  • Селен
  • SpecFlow
  • xUnit

Я хотел бы реализовать объектную модель страницы (POM) без PageFactory

Это код, который у меня есть

POM

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;

namespace Vasool.DrPay.Test
{
    class LoginPage
    {
        private readonly IWebDriver _driver;
        private const string PageUri = @"https://site.site/SignIn";

        [FindsBy(How = How.Name, Using = "Input.Username")]
        private IWebElement _username;

        [FindsBy(How = How.Name, Using = "Input.Password")]
        private IWebElement _password;

        [FindsBy(How = How.Id, Using = "Input_RememberMe")]
        private IWebElement _rememberLogin;

        [FindsBy(How = How.CssSelector, Using = ".btn.btn-primary")]
        private IWebElement _login;

        public LoginPage(IWebDriver driver)
        {
            _driver = driver;
        }

        public static LoginPage NavigateTo(IWebDriver driver)
        {
            driver.Navigate().GoToUrl(PageUri);

            return new LoginPage(driver);
        }



        public string Username { set { _username.SendKeys(value); } }
        public string Password { set { _password.SendKeys(value); } }

        public void Remember() {  _rememberLogin.Click(); }
        public void Login()
        {
            _login.Click(); 

       }


    }
}

Функциональный шаг

using OpenQA.Selenium;
using TechTalk.SpecFlow;
using Xunit;

namespace Inc.Test
{
    [Binding]
    public class LoginSteps

    {
        private readonly IWebDriver _webDriver;
        private LoginPage _loginPage;

        public LoginSteps(ScenarioContext scenarioContext)
        {
            _webDriver = scenarioContext["WEB_DRIVER"] as IWebDriver;

        }

        [Given(@"I am on the Login Page")]
        public void GivenIAmOnTheLoginPage()
        {

            _loginPage = LoginPage.NavigateTo(_webDriver);

        }

        [Given(@"I have entered the ""(.*)"" as the username")]
        public void GivenIHaveEnteredTheAsTheUsername(string username)
        {
            _loginPage.Username = username;
        }

        [Given(@"I have entered the ""(.*)"" as the password")]
        public void GivenIHaveEnteredTheAsThePassword(string password)
        {
            _loginPage.Password = password;
        }

        [Then(@"I should be navigated to the Home Page")]
        public void ThenIShouldBeNavigatedToTheHomePage()
        {
           // ScenarioContext.Current.Pending();
        }
    }
}

Когда я пытаюсь запустить тесты при отладке, я получаю нулевую ссылку на _username

Возможно, я я упускаю что-то очень очевидное, так как возвращаюсь к программированию после долгого времени

1 Ответ

1 голос
/ 04 мая 2020

Вам необходимо вызвать PageFactory.InitElements(this, driver); в конструкторе LoginPage.

Как вы отметили в своем комментарии, класс PageFactory устарел. Так как C# поддерживает свойства и члены с выражением , фабрика страниц перестала работать. Вы в конечном итоге с меньшим количеством кода. Например, свойство username:

[FindsBy(How = How.Name, Using = "Input.Username")]
private IWebElement _username;

будет переписано следующим образом:

private IWebElement Username => driver.FindElement(By.Name("Input.Username"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...