0

Why if i use same code of affordabilityErrorVerify() in mortgageCalculator() function its working fine but when i use that code in affordabilityErrorVerify() [ same as i posted here ] it says : --> org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"#ifrm_13536"} its weird for me can someone help me how i can make it work

 public class test1 extends base {
    public WebDriver driver;
    public static Logger log =LogManager.getLogger(base.class.getName());
    
    @BeforeTest
    public void initialize() throws IOException {

        driver = initializeDriver(); // initialize the browser driver based on data.properties file browser value
         
    }

    @Test(dataProvider = "dataDriven")
    public void mortgageCalculator(String amount, String year, String Frequency, String type, String product,
            String term, String rate) throws IOException, InterruptedException {
        
        
        driver.get(prop.getProperty("url"));  // read the data.properties file for get the value of url
        driver.manage().window().maximize(); 

        LandingPage l = new LandingPage(driver);  // created object for Landing page to access page element

        Actions actions = new Actions(driver);
        WebElement mainMenu = l.menuBar();
        actions.moveToElement(mainMenu);

        WebElement subMenu = l.clickLink();
        actions.moveToElement(subMenu);
        actions.click().build().perform();

        
        // Explicit wait because calculator is in frame and it loads after some time
        // so wait until frame is visible 
        WebDriverWait wait = new WebDriverWait(driver, 15);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(@class,'col-12 col-md-9 side-content')]")));
         
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("window.scrollBy(0,500)");
        
        // switch to frame elements
        driver.switchTo().frame(l.switchToFrame());

        Thread.sleep(3000);

        l.productTabClick().click(); // click on product tab
        Thread.sleep(3000);

        WebElement money = l.mortgageAmount();
        money.click();
        money.sendKeys(Keys.CONTROL + "a");
        money.sendKeys(Keys.DELETE);
        money.sendKeys(amount);

        WebElement period = l.mortgageYear();
        period.click();
        period.sendKeys(Keys.CONTROL + "a");
        period.sendKeys(Keys.DELETE);
        period.sendKeys(year);

        Select s = new Select(l.paymentFrequency());
        s.selectByValue(Frequency);
        
        
        // if data provider send Fixed it will click on fixed radio button otherwise click on variable 
        if (type == "Fixed") {
            l.paymentType().click();

        } else {
            l.paymentType().click();

        }

        Select ss = new Select(l.paymentProduct());
        ss.selectByValue(product);
        
        Thread.sleep(3000);
        
        driver.switchTo().defaultContent();
        js.executeScript("window.scrollBy(0,300)");

        driver.switchTo().frame(l.switchToFrame());
        Thread.sleep(3000);

        WebElement inputOwnRateTerm = l.paymentTerm();
        inputOwnRateTerm.click();
        inputOwnRateTerm.sendKeys(Keys.CONTROL + "a");
        inputOwnRateTerm.sendKeys(Keys.DELETE);
        l.paymentTerm().sendKeys(term);

        WebElement inputOwnRateValue = l.paymentRate();
        inputOwnRateValue.click();
        inputOwnRateValue.sendKeys(Keys.CONTROL + "a");
        inputOwnRateValue.sendKeys(Keys.DELETE);
        l.paymentRate().sendKeys(rate);
        inputOwnRateValue.sendKeys(Keys.ENTER);
        Thread.sleep(3000);

        String actualPayment = l.monthlyPayment().getText();
        String actualIOT = l.interestOverTerm().getText();

         
        String actualInterestOverTerm = actualIOT.substring(0, actualIOT.length()-1);
        
        //double actualInterestOverTerm = Math.round(actualIOT)* 10.0) / 10.0;
        //System.out.print(actualPayment);  // uncomment to see what Mortgage Payment amount function is returning for given data 
        
        //System.out.print(actualInterestOverTerm);
        //System.out.print(actualIOT);
         


        String totalAmount = amount;
        int arg1 = Integer.parseInt(totalAmount);

        String mortgageRate = rate;
        double arg2 = Double.parseDouble(mortgageRate);

        String totalYear = year;
        int arg3 = Integer.parseInt(totalYear);
        
        // to find out total Interest over term months based on year 
        String iot = term;
        int iot1 = Integer.parseInt(iot);
        int arg4 = iot1 * 12;

        
        // Pass all 4 argument into mortgage calculator to assert actual and expected result
        calculator c = new calculator();
        double[] expected = c.mortgageCalculator(arg1, arg2, arg3, arg4);

        //System.out.println("Mortgage Payment :" + expected[0]);  // giving back Mortgage Payment amount from custom function
        //System.out.println("Interest over term :" + expected[1]); // giving back Interest over term amount from custom function
        NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(); // converting numbers into money format [number format]
         
        String act = defaultFormat.format(expected[1]);
     
      String expectedInterestOverTerm = act.substring(0, act.length()-1);
        
        
        //***********************
        //  ActualPayment = Getting value from https://www.coastcapitalsavings.com/calculators/mortgage-calculator
        //  Expected[0] = Getting value from calculator() function which is mortgageCalculator logic file
        //***********************
        
         
            Assert.assertEquals(actualPayment,defaultFormat.format(expected[0])); // Assertion to find out both values are same
            Assert.assertEquals(actualInterestOverTerm,expectedInterestOverTerm); // Assertion to find out both values are same
            
            
            
            
            log.info("*************Expected****************");
            log.info("Mortgage Payment :" + expected[0]);
            log.info("Interest Over Term :" + expectedInterestOverTerm);
            log.info("**************Actual*****************");
            log.info("Mortgage Payment :" + actualPayment);
            log.info("Interest Over Term :" + actualInterestOverTerm);
            log.info("_______________________________________");
             
            
      
       
        
    }
    
    @Test
    public void affordabilityErrorVerify() throws InterruptedException
    {
        LandingPage l = new LandingPage(driver);  // created object for Landing page to access page element
        JavascriptExecutor js = (JavascriptExecutor) driver;
        
        Thread.sleep(3000);         
        driver.switchTo().defaultContent();
        js.executeScript("window.scrollBy(0,-500)");
        Thread.sleep(3000);
        driver.switchTo().frame(l.switchToFrame());
        WebDriverWait wait = new WebDriverWait(driver, 15);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(@class,'col-12 col-md-9 side-content')]")));
        Thread.sleep(3000);
        l.affordabilityTabClick().click(); // click on affordability tab     
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("slider-control:nth-child(3) > #slider-container #name")).click();
        driver.findElement(By.cssSelector("slider-control:nth-child(3) > #slider-container #name")).sendKeys("10000");
        driver.findElement(By.cssSelector("slider-control:nth-child(3) > #slider-container #name")).sendKeys(Keys.ENTER);
        
    }
Mix Match
  • 19
  • 3

1 Answers1

0

By looking at your code, I have a probable solution to your problem. There is no priority defined for tests. So in TestNG, if priority is not defined, the test will get executed in alphabetical order. In this case, affordabilityErrorVerify() test will execute first and then mortgageCalculator().

If I observe affordabilityErrorVerify(), there is no method to open URL like driver.get(url) so no page will get open and it will cause NoSuchElementException

A possible answer can be assigned priority to tests

@Test (priority=1, dataProvider = "dataDriven")
 public void mortgageCalculator(String amount, String year, String Frequency, String type, String product,
            String term, String rate) throws IOException, InterruptedException {
     //code
}

@Test (priority=2)
 public void affordabilityErrorVerify() throws InterruptedException
    {
    //code
    }

In this as well you have to make sure actions on second test are continuing on same page where test1 ends.

Modify your tests and actions considering flow of test and it will work

Happy coding~

Krishna Majgaonkar
  • 1,532
  • 14
  • 25