我正在尝试让我的自动化尝试每个将显示密码要求的密码。在循环的第一次迭代之后,当我希望它跳过该 if 并移至下一个 else if 时,它会陷入寻找password8And256CharValidationError 元素的困境。
这是例外:
java.lang.RuntimeException:org.openqa.selenium.TimeoutException:预期条件失败:等待代理元素的可见性:DefaultElementLocator'By.xpath://* [contains(text(),'密码必须介于8和之间) 256')]'(尝试了 60 秒,间隔 1000 毫秒)
@Step("Verify the create account fields.")
public void getInvalidAccountDetails() {
try {
if (!isFirstTime) {
clickCreateAccount();
}
isFirstTime = false;
fillValidAccountDetails();
boolean isPasswordErrorHandled = false;
for (String invalidPassword : invalidPasswords) {
Thread.sleep(1000);
fillPassword(invalidPassword);
fillConfirmPassword(invalidPassword);
clickCreateAccountAccountPage();
if (isElementPresent(password8And256CharValidationError)) {
verifyPasswordLengthWarning();
isPasswordErrorHandled = true;
} else if (isElementPresent(passwordSpecialCharValidationError)) {
verifyOneSpecialCharacter();
isPasswordErrorHandled = true;
} else if (isElementPresent(password1numberValidationError)) {
verifyOneNumberWarning();
isPasswordErrorHandled = true;
} else if (!isPasswordErrorHandled) {
fillPassword("Test@123");
fillConfirmPassword("Test@1234");
clickCreateAccountAccountPage();
verifyConfirmPasswordNotMatchValidationError();
}
clearPasswordFields();
}
}
}
我尝试过使用不同的捕获异常,但这没有帮助。
一些反馈:
最佳实践是每个脚本仅包含一个测试。因此,将这四种场景分成四个单独的测试。
每个测试都应该有自己的浏览器。这为每个测试提供了最有可能成功的机会,并且不会被浏览器中之前运行的其他测试所污染。每个测试应该:1. 启动一个新浏览器,2. 完成步骤并进行验证,以及 3. 关闭浏览器。
通过让每个场景都是自己的测试并拥有自己的浏览器,您可以通过并行执行获得巨大的速度提升。
它还使测试更易于调试、阅读和维护。现在,您在
if
循环内有一堆 for
,这使得更难判断您当前正在测试什么。
如果早期验证失败,您将无法获得有关后续测试/验证的信息。
我会编写如下所示的测试。每一项的名称都明确,步骤也明确,任何失败都一目了然。测试易于阅读和理解,易于维护,易于调试。
注意:我不知道您的场景,因此您需要更新不同的无效密码以匹配预期场景,但这应该会让您了解组织测试的更好方法。
public void password8And256CharValidationShort() {
clickCreateAccount();
fillValidAccountDetails();
String invalidPassword = "aaaaaa";
fillPassword(invalidPassword);
fillConfirmPassword(invalidPassword);
clickCreateAccountAccountPage();
verifyPasswordLengthWarning();
}
public void password8And256CharValidationLong() {
clickCreateAccount();
fillValidAccountDetails();
String invalidPassword;
invalidPassword = "a".repeat(257);
fillPassword(invalidPassword);
fillConfirmPassword(invalidPassword);
clickCreateAccountAccountPage();
verifyPasswordLengthWarning();
}
public void passwordSpecialCharValidation() {
clickCreateAccount();
fillValidAccountDetails();
String invalidPassword = "aaaaaaa!";
fillPassword(invalidPassword);
fillConfirmPassword(invalidPassword);
clickCreateAccountAccountPage();
verifyOneSpecialCharacter();
}
public void passwordOneNumberValidation() {
clickCreateAccount();
fillValidAccountDetails();
String invalidPassword = "aaaaaaa1";
fillPassword(invalidPassword);
fillConfirmPassword(invalidPassword);
clickCreateAccountAccountPage();
verifyOneNumberWarning();
}
public void passwordDoesntMatchValidation() {
clickCreateAccount();
fillValidAccountDetails();
fillPassword("Test@123");
fillConfirmPassword("Test@1234");
clickCreateAccountAccountPage();
verifyConfirmPasswordNotMatchValidationError();
}