learntogrow-growtolearn
learntogrow-growtolearn

Reputation: 1280

TestNG: Method requires 2 parameters but 0 were supplied in the @Test annotation

I am a newbie to selenium testing. Basically, I have a selenium class like :

import org.testng.annotations.Test;
import org.testng.annotations.Test;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import org.testng.annotations.Test;
import com.google.common.base.Function;

import java.awt.AWTException;
import java.awt.Robot;

import org.openqa.selenium.By;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Test;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SeleniumTests {

    public void commonFunction(){
        System.setProperty("webdriver.chrome.driver", "C://Downloads//chromedriver_win32//chromedriver.exe");
        WebDriver driver  = new ChromeDriver();
        Actions builder = new Actions(driver);
        driver.get("http://localhost:3000");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        test1(driver,builder);
    }
    //The driver,builder will be used by all the below 3 test functions.

    /**
     * Calling the Most Visited API -- TEST1
     */
    public void test1(WebDriver driver,Actions builder){
        WebElement most_visited_link = driver.findElement(By.id("mostVisited"));
        Thread.sleep(2000);

        Action mouseOvermost_visited_link = builder.moveToElement(most_visited_link).build();
        mouseOvermost_visited_link.perform(); 
        Thread.sleep(2000);
        driver.findElement(By.id("mostVisited")).click();
        Thread.sleep(1000);
        WebElement most_Visited_button = driver.findElement(By.id("datePicked"));
        Action mouse_most_VisitedOverDatePicker = builder.moveToElement(most_Visited_button).build();
        mouse_most_VisitedOverDatePicker.perform(); 
        Thread.sleep(2000);
        driver.findElement(By.id("datePicked")).click();
        Thread.sleep(2000);

        driver.findElement(By.linkText("6")).click();
        Thread.sleep(5000);
        test2(driver,builder);
    }

    /**
     * Calling the Status Pie API  -- TEST2
     * @param builder 
     * @param driver 
     */
    public void test2(WebDriver driver,Actions builder){
        WebElement status_pie_link = driver.findElement(By.id("statusPie"));
        Thread.sleep(2000);
        //Actions builder = new Actions(driver);
        Action mouseOverStatusPie = builder.moveToElement(status_pie_link).build();
        mouseOverStatusPie.perform(); 
        Thread.sleep(1000);
        driver.findElement(By.id("statusPie")).click();
        Thread.sleep(1000);

        WebElement status_pie_button = driver.findElement(By.id("datePicked"));
        Action mouseOver_Status_pie_DatePicker = builder.moveToElement(status_pie_button).build();
        mouseOver_Status_pie_DatePicker.perform(); 
        Thread.sleep(2000);
        driver.findElement(By.id("datePicked")).click();
        Thread.sleep(2000);
        driver.findElement(By.linkText("6")).click();
        Thread.sleep(5000);
        test3(driver,builder);
    }

    /**
     * Calling the Old Data API -- TEST3
     */
    public void test2(WebDriver driver,Actions builder){
        WebElement old_data_link = driver.findElement(By.id("oldData"));
        Thread.sleep(2000);
        // Actions builder = new Actions(driver);
        Action mouseOverOldData = builder.moveToElement(old_data_link).build();
        mouseOverOldData.perform(); 
        Thread.sleep(2000);
        driver.findElement(By.id("oldData")).click();
        Thread.sleep(1000);

        WebElement old_data_button = driver.findElement(By.id("datePicked"));
        Action mouseOverDatePicker = builder.moveToElement(old_data_button).build();
        mouseOverDatePicker.perform(); 
        Thread.sleep(2000);
        driver.findElement(By.id("datePicked")).click();
        Thread.sleep(2000);
        driver.findElement(By.linkText("6")).click();
        Thread.sleep(5000);
        driver.quit();
    }

}

The code executes as expected on the browser and closes the chrome window. However, in the index report, I see log as :

3 methods, 2 skipped, 1 passed 
Skipped methods :    
 mostVisitedfunction   
 statuspiefunction   

Passed methods :    
 createConnection  

Any idea where am I going wrong ? Thanks in advance.

Upvotes: 0

Views: 6141

Answers (3)

Shakya Rathnaike
Shakya Rathnaike

Reputation: 11

@Test 
public void assertBackToLogin(WebDriver driver) throws InterruptedException {
    LoginPage login = new  LoginPage (driver); 
    login.assertLogin();
}

Is NOT working

Remove all the parameters and run

@Test 
public void assertBackToLogin() throws InterruptedException {
    LoginPage login = new  LoginPage (driver); 
    login.assertLogin();
}

Upvotes: 1

niharika_neo
niharika_neo

Reputation: 8531

The error comes because if you have parameters in your @Test annotated method, then those need to come from @Parameters or @DataProvider. Else, if none of the annotation supplies the arguments, which is your case, then the error is thrown.

Apart from that what @Kishan has suggested in terms of structure of code is correct. You need to differentiate between your tests and common functions.

Upvotes: 1

Kishan Patel
Kishan Patel

Reputation: 1383

The method mostVisitedfunction should not have annotation because it is the helping method for yoyr test case. Instead create a new class, create a object of the same in the @test class and then call that method..

See the below example..

My test is

//MAximize the Screen
    driver.manage().window().maximize(); 
//Go to Gmail Login Page
    SignInPage SignInPage = WebUtils.GoToSignInPage(driver);
//Sign in to Login page -Send Username 
    SignInPage.SendkeysMethodForSignInPAge(driver, By.cssSelector("input[id='Email']") , "[email protected]" );
//Click on Next
    SignInPage.ClickToLogin(driver, By.cssSelector("input[id='next']"));
//Wait for password field to be visible
    SignInPage.WaitForElementTobeVisible(driver, By.cssSelector("input[id='Passwd'][type='password']"));

So when i call the method SendkeysMethodForSignInPAge i wont write it in @Test.

See SendkeysMethodForSignInPAge method: public class SignInPage {

public void SendkeysMethodForSignInPAge(WebDriver driver, By by, String s) {
    WebUtils.Sendkeys(driver,by,s);
}

I created a new class and there i defined it. This is basic flow. Hope you can relate this. Reply to me, if your are still stuck. Happy Learning :-)

Upvotes: 1

Related Questions