首页 > 解决方案 > 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

当测试可以找到元素时,我没有遇到配置问题。

首先十分感谢

标签: javascriptjavaseleniumselenium-webdrivertestng

解决方案


您的测试代码中存在一些问题。

默认情况下,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; 
        } 
    } 
}

推荐阅读