我一直在努力使用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");
}
答案 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<>))]
来匹配任何元素。
"*"