Веб-драйвер Atata selenium не может найти элементы управления по идентификатору в угловом приложении - PullRequest
0 голосов
/ 22 ноября 2018

Я изо всех сил пытался настроить простой автоматический тест для приложения angular (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");
            }

edit 2:

Я нашел кого-то, у кого была похожая проблема, но она была ограничена полем ввода файла.Может кто-то может подтвердить, есть ли давняя ошибка в отношении используемой установки?

https://github.com/atata-framework/atata/issues/188

edit 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 Ответ

0 голосов
/ 22 ноября 2018

Проблема в неправильном использовании элементов управления.Атата имеет уникальную функцию 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

В качестве опции вы также можете изменить оба типа управления на Input<string, TOwner>.Он также будет работать, так как Input имеет менее строгий ControlDefinition.

Кстати, если вам нужно переопределить некоторые значения по умолчанию ControlDefinition для конкретного элемента управления глобально:

[assembly: ControlDefinition("input", ComponentTypeName = "text input", TargetType = typeof(TextInput<>))]

Илиположить даже "*", чтобы соответствовать любому элементу.

[assembly: ControlDefinition("*", ComponentTypeName = "text input", TargetType = typeof(TextInput<>))]
...