Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Почему не работает FindsBy (C#)


(metasar) #1

Здравствуйте, уважаемые формучане!
Подскажите пожалуйста почему может не срабатывать FindsBy? Если я пытаюсь обратиться к элементу страницы, то возникает исключение:
“Необработанное исключение типа “System.NullReferenceException” в FindsByDemo.exe
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.”

Если произвожу поиск элементов стандартным образом, то все работает:


private void Init()
{
	this._loginInputText = this.WebDriver.FindElement(By.Name("login"));
}


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

namespace FindsByDemo.Pages
{
	class LoginPage : BasePage
	{
		/// <summary>
		/// Поле ввода логина.
		/// </summary>
		[FindsBy(How = How.Name, Using = "login")]
		private IWebElement _loginInputText;

		/// <summary>
		/// Поле ввода пароля.
		/// </summary>
		[FindsBy(How = How.Name, Using = "pass")]
		private IWebElement _passwordInputPassword;

		/// <summary>
		/// Кнопка (ссылка) отправки формы авторизации.
		/// </summary>
		[FindsBy(How = How.Id, Using = "authbtn_link")]
		private IWebElement _authBtnLink;

		/// <summary>
		/// Ссылка на страницу регистрации
		/// </summary>
		[FindsBy(How = How.Id, Using = "show_reg")]
		private IWebElement _showRegLink;

		/// <summary>
		/// Ссылка на страницу напоминания пароля.
		/// </summary>
		[FindsBy(How = How.Id, Using = "auth-forgot-pass")]
		private IWebElement _authForgotPassLink;

		public LoginPage(IWebDriver webDriver) : base(webDriver) 
		{
			this.Init();
			this.Login = "anextour";
			//Console.WriteLine(this._loginInputText.ToString());
		}

		private void Init()
		{
			this._loginInputText = this.WebDriver.FindElement(By.Name("login"));
		}
				
		/// <summary>
		/// Устанавливает значение логина в форме авторизации на странице.
		/// </summary>
		public string Login
		{
			set 
			{
				this._loginInputText.Clear();
				this._loginInputText.SendKeys(value);
			}
		}

		/// <summary>
		/// Устанавливает значение пароля в форме авторизации на странице.
		/// </summary>
		public string Password
		{
			set
			{
				this._passwordInputPassword.Clear();
				this._passwordInputPassword.SendKeys(value);
			}
		}

		public void Submit()
		{
			this._authBtnLink.Click();
		}

		/// <summary>
		/// Отправляет данные формы авторизации.
		/// </summary>
		public void Authorization(String login, String password)
		{
			this.Login = login;
			this.Password = password;
			this._authBtnLink.Click();
		}
	}
}


(metasar) #2

Извините, разобрался, я почему-то думал, что PageFactory самому реализовывать нужно и что FindsBy цепляет нужные элементы. понял, что был не прав.
Нужно, например так:


public LoginPage(IWebDriver webDriver) : base(webDriver) 
{
	PageFactory.InitElements(this.WebDriver, this);
}