Atata Selenium Web驱动程序无法在Angle App上通过ID查找控件

时间:2018-11-22 10:34:41

标签: c# angular selenium .net-core atata

我一直在努力使用atata作为框架在Angular(5)应用程序上建立简单的自动化测试,该框架只是包装了硒Web驱动程序以进行测试。为了我的一生,我无法在登录页面上找到我需要的元素。我试过按xpath,css,id和名称查找。都不起作用。请问有人可以帮我理解我做错了什么吗?

我已确保要尝试管理的控件具有适当的ID,并在我检查元素时显示它们。有什么我应该做的事情,以便网络驱动程序访问dom而不访问网站html源(因为它是spa,所以有所区别)?我还尝试过等待10秒钟,然后继续搜索控件。

所有软件包的版本均为最新。

AtataSettings.cs

snackBarRef.afterDismissed().subscribe(() => {
  console.log('The snack-bar was dismissed');
});


snackBarRef.onAction().subscribe(() => {
  console.log('The snack-bar action was triggered!');
});

snackBarRef.dismiss();

SignInPage.cs

using Atata;

[assembly: Culture("en-us")]
[assembly: VerifyTitleSettings(Format = "Login")]

SignInTests.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; }
    }
}

编辑:

如果我按如下方式使用普通硒设置,我设法使其找到了元素。为什么该方法有效,但Atata的包装方法却无效?

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();
        }
    }
}

编辑2:

我发现有人遇到类似问题,但仅限于文件输入字段。有人可以确认我正在使用的设置是否存在缠绵的错误吗?

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

编辑3:

电子邮件字段输入控件的HTML代码段:

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");
            }

1 个答案:

答案 0 :(得分:3)

问题出在控件用法错误。 Atata具有独特的ControlDefinition功能,该功能指定控件元素的基本XPath。通过滤除错误的元素,可以使元素搜索更加准确。对于TextInput<TOwner>,它是[ControlDefinition("input[@type='text' or not(@type)]")]

您的电子邮件元素为<input type="email">,与TextInput<TOwner>的基本XPath不匹配。密码控制也应该如此。

只需将控件的类型更改为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/#inputs

您还可以选择将两种控件类型都更改为Input<string, TOwner>。由于Input的{​​{1}}较不严格,因此也可以使用。

顺便说一句,如果您需要为全局特定控件覆盖一些默认的ControlDefinition

ControlDefinition

或者甚至放置[assembly: ControlDefinition("input", ComponentTypeName = "text input", TargetType = typeof(TextInput<>))] 来匹配任何元素。

"*"