【问题标题】:TestNG doesn't re-run all failed methods after ElementClickInterceptedExceptionTestNG 不会在 ElementClickInterceptedException 之后重新运行所有失败的方法
【发布时间】:2022-12-14 19:49:16
【问题描述】:

我有一个自动化框架 TestNG + Selenide,它在 Jenkins 上运行作业并提供 Allure 报告。 我添加了一个带有一些简单测试的测试类。一个测试在尝试点击一个元素时偶尔会失败,但重新运行可以解决问题,所以我很自然地想为这个测试引入重试。

问题来了——失败的测试不会重试。我试过通过注释转换器添加 IRetryAnalyzer/RetryAnalyzerCount 或将 retryAnalyzer 添加到 @Test 注释,但没有成功。

我目前的配置:

public class RetryAnalyzer extends RetryAnalyzerCount {

    private static final int MAX_RETRY_ATTEMPTS = 3;

    public RetryAnalyzer() {
        setCount(MAX_RETRY_ATTEMPTS);
    }

    @Override
    public boolean retryMethod(ITestResult iTestResult) {
        return true;
    }
}
public class AnnotationTransformer implements IAnnotationTransformer {

    private final Logger logger = LoggerFactory.getLogger(AnnotationTransformer.class);

    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
        annotation.setRetryAnalyzer(RetryAnalyzer.class);
        logger.debug("SET RETRY ANALYZER FOR TEST {}", testMethod.getName());
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="E2 widget tests" thread-count="6" parallel="classes" data-provider-thread-count="3">
    <listeners>
        <listener class-name="framework.AnnotationTransformer"/>
    </listeners>
    <test name="E2 widgets - chrome">
        <parameter name="browser" value="chrome"/>
        <parameter name="width" value="1366"/>
        <parameter name="height" value="786"/>
        <packages>
            <package name="tests.other.e2widgets" />
        </packages>
    </test>

</suite>

我的测试+它正在使用的数据提供者

    @DataProvider(name = "countries-with-odds-widget-enabled", parallel = true)
    public Object[][] countriesWithOddsWidgetEnabled() {
        List<String> oddsWidgetCountries = sevWidgetSteps.getOddsWidgetCountries(configUrl);
        List<Object[]> parameters = oddsWidgetCountries.stream().map(country -> new Object[]{country}).collect(Collectors.toList());
        return parameters.toArray(new Object[1][parameters.size()]);
    }

    @Test(description = "Check odds widget for all countries",
            dataProvider = "countries-with-odds-widget-enabled"
    )
    public void checkOddsWidgetsForEnabledCountries(String country) {
        ...some code...

        // here test fails because of ElementClickInterceptedException
        $(By.id("3__match-calendar-link")).click();

        proxy.stop();
        softly.assertAll();
    }

我在魅力报告中看到的错误:

Invalid element state [[id*='match-calendar-link'][3]]: element click intercepted: Element <a id="3__match-calendar-link" class="zh Eh">...</a> is not clickable at point (690, 296). Other element would receive the click: <div class="Mg"></div>
Screenshot: file:/Users/jenkins/workspace/UI-SANDBOX/build/reports/tests/1653409276041.25.png
Page source: file:/Users/jenkins/workspace/UI-SANDBOX/build/reports/tests/1653409276041.25.html
Timeout: 10 s.
Caused by: ElementClickInterceptedException: element click intercepted: Element <a id="3__match-calendar-link" class="zh Eh">...</a> is not clickable at point (690, 296). Other element would receive the click: <div class="Mg"></div>

如果该点击方法失败,我希望测试重试,但在诱惑报告中我看不到重试,但如果此时方法没有失败但稍后由于断言 - 它将重试。希望有人能帮我解决这个问题,在此先感谢

【问题讨论】:

    标签: java selenium selenide retry-logic


    【解决方案1】:

    如果你没有,请尝试将 maven surefire 插件添加到你的 pom.xml

        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
        </dependency>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <argLine>
                        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                    </argLine>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多