Веб-драйвер Atata selenium не может найти элементы управления по идентификатору в угловом приложении
Я изо всех сил пытался настроить простой автоматизированный тест на угловом (5) приложении, используя atata в качестве основы, которая просто оборачивает веб-драйвер селена для выполнения своих тестов. Для жизни я не могу найти элементы, которые мне нужны, на странице входа. Я попытался найти по xpath, css, id и имени. Ни одна из которых не работает. Пожалуйста, кто-нибудь может помочь мне понять, если я делаю что-то не так?
Я позаботился о том, чтобы были идентификаторы для элементов управления, которыми я пытаюсь управлять, и они отображаются, когда я проверяю элемент. Есть ли что-то, что я должен сделать, чтобы веб-драйвер обращался к dom, а не к html-источнику веб-сайтов (поскольку есть разница, потому что это спа)? Я также попытался подождать 10 секунд, прежде чем продолжить поиск элемента управления.
Версии всех пакетов обновлены.
AtataSettings.cs
using Atata;
[assembly: Culture("en-us")]
[assembly: VerifyTitleSettings(Format = "Login")]
SignInPage.cs
using Atata;
namespace PortalTests2
{
using _ = SignInPage;
[Url("auth/login")]
[VerifyTitle]
public class SignInPage : Page<_>
{
[FindById("email")]
public TextInput<_> Email { get; set; }
[FindById("password")]
public TextInput<_> Password { get; set; }
[FindById("login_button")]
public Button<_> SignIn { get; set; }
[FindById]
public Select<_> selectedClientId { get; set; }
[FindById("continue_button")]
public Button<_> ContinueButton { get; set; }
}
}
SignInTests.cs
using Atata;
using NUnit.Framework;
namespace PortalTests2
{
[TestFixture]
public class SignInTests
{
[SetUp]
public void SetUp()
{
AtataContext.Configure().
UseChrome().
WithFixOfCommandExecutionDelay().
WithLocalDriverPath().
UseBaseUrl($"http://localhost:4300/").
UseNUnitTestName().
AddNUnitTestContextLogging().
AddScreenshotFileSaving().
LogNUnitError().
TakeScreenshotOnNUnitError().
Build();
}
[TearDown]
public void TearDown()
{
AtataContext.Current?.CleanUp();
}
[Test]
public void SignIn()
{
Go.To<SignInPage>().
Email.Set("root").
Password.Set("r00t").
SignIn.Click();
}
}
}
Редактировать:
Мне удалось получить его, чтобы найти элемент, если я использую обычную настройку селена следующим образом. Почему это работает, но упаковка Ататы не работает?
using (var driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)))
{
driver.Navigate().GoToUrl(@"http://localhost:4300/");
var link = driver.FindElement(By.Id("email"));
link.SendKeys("hello");
}
редактировать 2:
Я нашел кого-то, у кого была похожая проблема, но она была ограничена полем ввода файла. Может кто-то может подтвердить, есть ли давняя ошибка относительно установки, которую я использую?
https://github.com/atata-framework/atata/issues/188
редактировать 3:
HTML-фрагмент элемента управления вводом поля электронной почты:
<input autocomplete="off" class="form-control ng-pristine ng-valid ng-touched" id="email" name="email" placeholder="Email address" type="email" ng-reflect-name="email" ng-reflect-is-disabled="false" style="background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAAXNSR0IArs4c6QAAAPhJREFUOBHlU70KgzAQPlMhEvoQTg6OPoOjT+JWOnRqkUKHgqWP4OQbOPokTk6OTkVULNSLVc62oJmbIdzd95NcuGjX2/3YVI/Ts+t0WLE2ut5xsQ0O+90F6UxFjAI8qNcEGONia08e6MNONYwCS7EQAizLmtGUDEzTBNd1fxsYhjEBnHPQNG3KKTYV34F8ec/zwHEciOMYyrIE3/ehKAqIoggo9inGXKmFXwbyBkmSQJqmUNe15IRhCG3byphitm1/eUzDM4qR0TTNjEixGdAnSi3keS5vSk2UDKqqgizLqB4YzvassiKhGtZ/jDMtLOnHz7TE+yf8BaDZXA509yeBAAAAAElFTkSuQmCC"); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;" xpath="1">
1 ответ
Проблема в неправильном использовании контроля. Атата имеет уникальный ControlDefinition
особенность, которая определяет базовый XPath элемента управления. Это делает поиск элементов более точным, отфильтровывая неправильные элементы. За TextInput<TOwner>
это [ControlDefinition("input[@type='text' or not(@type)]")]
,
Ваш почтовый элемент <input type="email">
который не соответствует базовому XPath из TextInput<TOwner>
, То же самое должно быть с контролем пароля.
Просто измените типы элементов управления на EmailInput<TOwner>
а также PasswordInput<TOwner>
:
public class SignInPage : Page<_>
{
[FindById("email")]
public EmailInput<_> Email { get; set; }
[FindById("password")]
public PasswordInput<_> Password { get; set; }
//...
}
Вот ссылка на документы управления вводом: https://atata-framework.github.io/components/
В качестве опции вы также можете изменить оба типа управления на Input<string, TOwner>
, Это также будет работать как Input
имеет менее строгий ControlDefinition
,
Кстати, если вам нужно переопределить некоторые по умолчанию ControlDefinition
для конкретного контроля в глобальном масштабе:
[assembly: ControlDefinition("input", ComponentTypeName = "text input", TargetType = typeof(TextInput<>))]
Или поставить даже "*"
соответствовать любому элементу.
[assembly: ControlDefinition("*", ComponentTypeName = "text input", TargetType = typeof(TextInput<>))]