Веб-драйвер 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(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAAXNSR0IArs4c6QAAAPhJREFUOBHlU70KgzAQPlMhEvoQTg6OPoOjT+JWOnRqkUKHgqWP4OQbOPokTk6OTkVULNSLVc62oJmbIdzd95NcuGjX2/3YVI/Ts+t0WLE2ut5xsQ0O+90F6UxFjAI8qNcEGONia08e6MNONYwCS7EQAizLmtGUDEzTBNd1fxsYhjEBnHPQNG3KKTYV34F8ec/zwHEciOMYyrIE3/ehKAqIoggo9inGXKmFXwbyBkmSQJqmUNe15IRhCG3byphitm1/eUzDM4qR0TTNjEixGdAnSi3keS5vSk2UDKqqgizLqB4YzvassiKhGtZ/jDMtLOnHz7TE+yf8BaDZXA509yeBAAAAAElFTkSuQmCC&quot;); 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<>))]
Другие вопросы по тегам