javascript - Selenium 测试未正确失败 - 通过配置失败而不是“正确”失败
问题描述
嗨,我还是 Selenium/Scripting/Java 的新手,我还处于将其他地方的代码组合在一起以完成工作的阶段(主要是教程和记录器)
无论如何,我正在尝试编写一个脚本来检查是否存在特定的“元素”(我也希望反过来)我可以让脚本在找到“元素”时正确传递,但是如果更改元素详细信息,所以我知道它应该失败(因为它不存在) TestNG 仍然通过了测试但给出了配置失败?
我想我错过了一些东西来涵盖测试的失败方面,但不知道如何去做,每次我尝试让它遇到这个问题。
package Links;
import org.testng.annotations.*;
import static org.testng.Assert.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
public class TestArea {
private WebDriver driver;
private StringBuffer verificationErrors = new StringBuffer();
@BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
System.setProperty("webdriver.gecko.driver", "C:\\Automation\\SeleniumFiles\\Browser Drivers\\geckodriver.exe");
driver = new FirefoxDriver();
}
@Test
public void Example() throws Exception {
driver.get(
"http://MyWebsite");
try {
assertTrue(isElementPresent(
By.xpath("The Element I want look for ")));
} catch (Error e) {
verificationErrors.append(e.toString());
}
}
// -------------------------------------------------------------------------------------
@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
}
“通过”测试但配置失败的示例。
配置失败:@AfterClass tearDown java.lang.AssertionError: java.lang.AssertionError: 预期 [true] 但在 Links.TestArea.tearDown(TestArea 的 org.testng.Assert.fail(Assert.java:96) 发现 [false] .java:39) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 在 java.lang.reflect.Method。在 org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:59) 在 org.testng.internal.Invoker.invokeConfigurationMethod( Invoker.java:455) 在 org.testng.internal.Invoker.invokeConfigurations(Invoker.java:222) 在 org.testng.internal.Invoker.invokeConfigurations(Invoker.java:142) 在 org.testng.internal.TestMethodWorker.invokeAfterClassMethods(TestMethodWorker.java:214) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java :111) 在 org.testng.TestRunner.privateRun(TestRunner.java:648) 在 org.testng.TestRunner.run(TestRunner.java:505) 在 org.testng.SuiteRunner.runTest(SuiteRunner.java:455) 在 org .testng.SuiteRunner.runSequentially(SuiteRunner.java:450) 在 org.testng.SuiteRunner.privateRun(SuiteRunner.java:415) 在 org.testng.SuiteRunner.run(SuiteRunner.java:364) 在 org.testng.SuiteRunnerWorker。 runSuite(SuiteRunnerWorker.java:52) 在 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84) 在 org.testng.TestNG.runSuitesSequentially(TestNG.java:1208) 在 org.testng.TestNG。runSuitesLocally(TestNG.java:1137) at org.testng.TestNG.runSuites(TestNG.java:1049) at org.testng.TestNG.run(TestNG.java:1017) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG .java:114) 在 org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 在 org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
通过:示例
================================================= 默认测试测试运行:1,失败:0,跳过:0
配置失败:1,跳过:0
================================================= 默认套件总计测试运行:1,失败:0,跳过:0 配置失败:1,跳过:
0
当测试可以找到元素时,我没有遇到配置问题。
首先十分感谢
解决方案
您的测试代码中存在一些问题。
默认情况下,TestNG 在以下情况下会失败一个@Test
方法:
- 断言失败
- 测试方法引发异常。
所以你不需要在一个块中包装assertTrue()
调用。try..catch
如果您想遍历所有断言并最终让测试方法失败,您应该在 TestNG中使用称为Soft Assertion的东西。
下面是您的测试代码的清理版本。
import org.testng.annotations.*;
import static org.testng.Assert.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
public class TestArea {
private WebDriver driver;
@BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
System.setProperty("webdriver.gecko.driver", "C:\\Automation\\SeleniumFiles\\Browser Drivers\\geckodriver.exe");
driver = new FirefoxDriver();
}
@Test
public void Example() throws Exception {
driver.get( "http://MyWebsite");
assertTrue(isElementPresent( By.xpath("The Element I want look for ")));
}
@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
driver.quit();
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
}
推荐阅读
- java - java在一个单独的文件中获取一个二维数组到另一个类
- spring - 我需要转义 application.properties 中的特殊字符吗?
- python - Pandas 中的时间戳和日期时间之间必须首选哪种类型?
- chromium-embedded - 使用针对不同版本的铬的 CefGlue 加载多个单词插件?
- javascript - 如何使用上游和 Azure Function App 诊断 Azure SignalR 404 中的错误?
- swift - 向 CLLocation 添加其他属性的正确方法是什么?
- twilio - Twilio MMS 设置会影响视频的载波压缩吗?
- javascript - 如何使用 javascript 为内联样式标签中的单个属性添加注释?
- postgresql - 如何在将结果放入 json 数组时加入表?
- python - 在条件熊猫下插入完整的重复行