参数是@Test所必需的,但尚未标记为@optional或已定义

时间:2017-07-11 03:18:38

标签: java selenium testng

您好我看到了这个错误,请帮忙

@Test在方法searchByVisitNo上需要参数'Visit',但尚未标记为@Optional或已定义。

我不知道为什么在testng xml文件中定义时需要将其标记为可选

以下是我使用的完整代码

<suite name="Suite" parallel="tests">
    <test name="SearchByVisit">
        <parameter name="Visit" value="123456"/>
        <classes>
            <class name="abc"/>
        </classes>
    </test>
</suite>

@Parameters({"Visit"})
@Test(priority=3)
public void searchByVisitNo(String VisitNumber)throws InterruptedException
{
    searchByVisit(VisitNumber);
}

public void searchByVisit(String Visit) throws InterruptedException
{
    WebDriverWait wait = new WebDriverWait(driver, 20);
    WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("search-input"))
    );
    element.sendKeys(Visit);
    clickSearch();
}

13 个答案:

答案 0 :(得分:3)

您正在.xml文件中传递参数<parameter name="Visit" value="123456"/>并直接运行TestNG类。所以在编译时没有获得该参数。

因此,您需要运行xml套件以向TestNG类提供有效参数。

答案 1 :(得分:1)

您正在收到此错误,因为您正在直接运行此类。您应该运行TestNG XML文件。

您可以遵循的步骤:

  1. 创建测试套件。
  2. 指定类和方法名称(类名应为packageName.className)
  3. 指定应该用于方法的参数。
  4. 运行测试套件。

    看起来你正在直接尝试运行该类,因此它显示异常。

答案 2 :(得分:1)

即使我面临着同样的问题,问题也很简单..

  1. 在Testng XML中,我将参数传递给day1而不是day4
  2. 将所有参数传递给testng XML中的正确测试用例文件夹

考虑以下 Day1代码和Day4代码两个都存在

在Testng xml中,在day4而不是day1中传递参数将引发此错误

第1天

package test2;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class Day1 {
@Parameters({"URL"}) //Only to Particular test method only
    @Test
    public void test11(String urlname)
    {
        System.out.println(urlname);
        System.out.println("Test case 11 in Day1");     
    }
    @Test
    public void test12()
    {
        System.out.println("Test case 12 in Day1");
    }
    @Test
    public void test13()
    {
        System.out.println("Test case 13 in Day1\n");
    }

}

第四天

package test2;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class Day4 {

@Parameters({"URL","API/username"})
    @Test
    public void test41(String urlname, String name)
    {
        System.out.println(urlname);
        System.out.println("Test case 41 in Day4");
        System.out.println(name);       
    }
    @Test
    public void test42()
    {
        System.out.println("Test case 42 in Day4");
    }

}

XML错误

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">

  <parameter name = "URL" value = "https://www.youtube.com"/>

 <**test name = "Day2Testcase">
   <parameter name = "URL" value = "day2test2.com"/>
   <parameter name = "API/username" value = "12345"/>** 

    <classes>
        <class name = "test2.Day1">
        </class> 
    </classes>

 </test>
  <test name = "Day4Testcase">
   <parameter name = "URL" value = "day4test2.com"/>
    <classes>
        <class name = "test2.Day4">
        </class> 
    </classes>   
 </test>

错误

  

[实用程序] [错误] [错误] org.testng.TestNGException:参数   @Test在方法test41上需要“ API /用户名”,但具有   未被标记为@Optional或在F:\ Selenium WebDriver中用   Java-从基础到高级+框架by Rahul   Shetty \ Workspace \ TestNG_Tutorial \ testng.xml

更正了XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite">

 <test name = "Day2Testcase">
   <parameter name = "URL" value = "day2test2.com"/>
    <classes>
        <class name = "test2.Day1">
        </class> 
    </classes>

 </test>
  <test name = "Day4Testcase">
   <parameter name = "URL" value = "day4test2.com"/>
   <parameter name = "username" value = "12345"/> 
    <classes>
        <class name = "test2.Day4">
        </class> 
    </classes>   
 </test>

</suite> <!-- Suite -->

答案 3 :(得分:0)

似乎问题在于使用花括号。 我试过下面的片段:

@Parameters({"browser"})
@BeforeMethod
public void setUp(String browser){
    if(browser.equalsIgnoreCase("Mozilla Firefox")){
    driver = new FirefoxDriver();
}

收到以下错误:

  

参数&#39; {browser}&#39; BeforeMethod对方法setUp是必需的,但尚未标记为@Optional或已定义

在删除大括号后开始工作如下:

@Parameters("browser")

答案 4 :(得分:0)

您应该尝试使用以下内容更新您的pom。只需在您的pom中添加以下内容然后执行即可。 将它添加到依赖项标记上方。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
        </plugin>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20.1</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
    </plugins>
</build>

答案 5 :(得分:0)

在XML文件开头的行下面提到:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

答案 6 :(得分:0)

您需要在方法中添加@Optional(“ Abc”),该方法指定当前参数为可选。 TestNG将传入指定的默认值,如果未指定默认值,则为null。

尝试执行公共无效searchByVisit(@Optional(“ Abc”)字符串访问)会抛出InterruptedException

答案 7 :(得分:0)

您是否正在使用Maven回购?尝试以Maven clean的方式运行pom.xml,然后进行Maven测试。这对我有用

答案 8 :(得分:0)

在您的TestNG.xml文件中,您需要提供测试类名称,在类名称中,您需要提供类名称以及包。这样可以解决问题!

请考虑以下示例以供参考:

如果测试类名称为Testclass并且在com.testpackage包下,则您的testNG.xml文件如下所示:

<suite name="Suite" parallel="tests">
    <test name="Testclass">
        <parameter name="Visit" value="123456"/>
        <classes>
            <class name="com.testpackage.Testclass"/>
        </classes>
    </test>
</suite>

答案 9 :(得分:0)

我的错误是我将参数关键字传递为“ Parameter”(P-大写)

答案 10 :(得分:0)

所以,我在传递参数时遇到了同样的问题,所以我在函数参数中添加了 @Optional。

@Test(priority = 2)
@Parameters("myName")
public void LoginAccountProcess(@Optional("Abc")String name) throws
FileNotFoundException, IOException, InterruptedException {
System.out.println("Name of th login Id is ==>"+name);
WebDriver chromeDriverObj=reusableComp.getLoadDriver();
chromeDriverObj.get(reusableComp.getUrl());

答案 11 :(得分:0)

Step1:- 在 Testng.xml 中定义类名:“packagname.abc”

Step2:- 现在右键单击 testng.xml 并运行为-> TestNG Suite。

注意:如果您使用 Testng Test 命令直接运行 testng 类“abc.java”,它将不会从 testng.xml 中获取 pic 参数值,因此您必须运行testng.xml 而不是运行 testNG 类“abc.java”作为 TestNG 测试

答案 12 :(得分:-1)

打开浏览器后,未传递任何URL,并且最后显示错误消息: “方法设置时,BeforeTest需要参数“浏览器”,但尚未将其标记为@Optional或已定义 在C:\Users\hassan.anwer\IdeaProjects\CRBTesting\testing.xml"