【问题标题】:Unable to execute after test method -TestNG测试方法-TestNG后无法执行
【发布时间】:2016-08-17 09:08:39
【问题描述】:

在我的 TestNG 框架中,我想通过调用客户 Util 类的 方法 来执行 @AfterTest 方法以退出浏览器会话。我收到一个错误,因为 “@Configuration 在方法 TearDown 上需要参数 'Webdriver driver',但尚未标记为 @Optional 或已定义” 阅读该错误后,我向 AfterTest Method 声明了一个参数,如下所示。

@AfterTest

public void TearDown(WebDriver driver){
    Util.tearDown(driver);

    }

这是 Util 包中的拆解方法

    public static void tearDown(WebDriver driver) {

    driver.quit();
    if (driver.toString().equals(null)) {
        logger.info(driver.toString() + " is closed ");
    }
}

我错过了什么吗?你能建议如何解决这个问题吗?谢谢:)

在此处添加类文件

@Listeners({com.customerItestListener.CustomItestListener.class})

public class TC_CreateOnloadProposal {

WebDriver driver;

@Test

@Parameters({ "Url", "BemsID", "TransferType", "WrkTrnsfrTtle", "purpse" })

public void run(String Url, String BemsID, String TransferType, String WrkTrnsfrTtle, String purpse) {
    driver = BrowserFactory.getInstance("firefox", Url).getDriver();
    PageObjCreateExpressProposal pg_loc = PageFactory.initElements(driver, PageObjCreateExpressProposal.class);
    pg_loc.checkForElement(driver, pg_loc.Txt_Login, "set", BemsID);
    pg_loc.checkForElement(driver, pg_loc.Img_Logon, "click");
    pg_loc.checkForElement(driver, pg_loc.Lnk_onload, "click");
    pg_loc.checkForElement(driver, pg_loc.Img_CrtOrSelctPrpsl, "click");
}

@AfterTest

public void TearDown(){
    driver.quit();
}

`

【问题讨论】:

  • 我对 AfterTest 方法进行了以下更改 - 运气不好@AfterTest @parameters({"Webdriver driver"}) public void TearDown(WebDriver driver){ Util.tearDown(driver); }
  • 你在哪里初始化了驱动对象?它在 Util 类中吗?如果是这样,请删除将驱动程序传递给该方法。如果驱动程序已初始化 Test 类,则将其设为实例变量并将其传递给 Util。
  • 如果您之前声明过驱动程序,@AfterTest public void TearDown(){ Util.tearDown(driver); } 应该可以工作
  • 您收到此错误是因为您没有将 driver 传递给您的 TearDown 方法。
  • @Grasshopper 我已经在我的类中初始化了 webdriver 并作为参数传递给 AfterTest 方法。无论传递参数,我都无法使用 @AfterTest 方法解决问题,即使使用下面的简单代码 @AfterTest public void TearDown(){ driver.quit(); }

标签: selenium testng


【解决方案1】:

首先,如果您想在每个@Test 方法之后运行tearDown() 方法,您应该使用@AfterMethod 而不是@AfterTest。请参阅我对这个问题的回答:Difference between BeforeClass and BeforeTest in TestNG

另一个问题是您想使用未初始化 WebDriver 的 Util 类。将@AfterTest@AfterMethod 方法包含在测试用例所在的同一类中的最简单方法,或者如果要将其存储在单独的类中,则创建一个抽象类并用它扩展您的测试类。示例:

AbstractTest 类

public class AbstractTest {
    protected Webdriver driver;

    @BeforeTest
    public void setUp() {
        // init your webdriver
        this.driver = ...;
    }

    @AfterTest
    public void tearDown() {
        this.driver.quit();
    }
}

你的测试课

public class MyTests extends AbstractTest {
    @Test
    public void myCoolTest() {
        this.driver.get(...);
        // etc...
    }
}

希望对你有帮助。

【讨论】:

    【解决方案2】:

    @AfterTest 方法没有执行的原因是因为我没有将它包含在 xml 文件中。我正在以 TestNG xml 的形式运行此测试。

    以下是我对 xml 文件所做的更改:

    <?xml version="1.0" encoding="UTF-8"?>
    <suite name ="ExpressModule">
    <test name = "Express module Test">
        <parameter name="Url" value="http:XXXX"/>
        <parameter name="BemsID" value="95188"/>
        <parameter name="TransferType" value="Onload"/>
        <parameter name="WrkTrnsfrTtle" value="Onload"/>
        <parameter name="purpse" value="No Purpose"/>       
            <classes>
                <class name="com.wtms.ExpressProposalCreation.TC_CreateOnloadProposal"/>
                <methods>
                <include name="run"/>
                <include name="TearDown"/>
                </methods>
                </classes>
        </test>
    </suite>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2017-11-04
      相关资源
      最近更新 更多