skip to Main Content

Selenium fails to locate the iframe by ID and Name.

This is for an automated checkout test on Shopify. The specific issue lies within the payment field. I found the ID and name of the iframe, which is card-fields-number-b1kh6njydiv00000.

iframe Image:

iframe Image

Text Field Image:

Text Field Image

Code trials:

driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
System.out.println("Found iframe");

The error is:

org.openqa.selenium.NoSuchFrameException: No frame element found by name or id card-fields-number-b1kh6njydiv00000

5

Answers


  1. Chosen as BEST ANSWER

    My solution was to look for keywords that are the exact same for different dynamic id's. In this case, it was "card-fields-name". I did this by using the XPath locator.

    driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'card-fields-number')]")));
    

  2. Are you tried to use driver.switchTo().defaultContent(); before switchTo.frame ?

    Maybe you aren’t out of all the frames

    driver.switchTo().defaultContent();
    driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
    System.out.println("Found iframe");
    
    Login or Signup to reply.
  3. I guess the frame name or ID is dynamic each time.In that case use index to identify the frame.

    int size = driver.findElements(By.tagName("iframe")).size();
      for(int i=0; i<=size; i++){
        driver.switchTo().frame(i); 
        //Do necessary operation here.
        driver.switchTo().defaultContent();
       }
    

    Hope this helps

    Login or Signup to reply.
  4. It is possible to use XPath for this I believe. You will need to find the IFrame IWebElement with XPath, and then pass the IWebElement into the SwitchTo().Frame()

    var ele = driver.FindElement(By.XPath("//iframe[contains(id, 'card-fields-number')]"));
    
    driver.switchTo().frame(ele);
    
    Login or Signup to reply.
  5. As per the images you have shared the <iframe> is having dynamic attributes so to locate and switch to the desired <iframe> you have to:

    • Induce WebDriverWait for the desired frame to be available and switch to it.
    • You can use either of the following solutions:

      • cssSelector:

        new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe.card-fields-iframe[id^='card-fields-number-'][src*='shopifycs']")));
        
      • xpath:

        new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@class='card-fields-iframe' and starts-with(@id,'card-fields-number-')][contains(@src, 'shopifycs')]")));
        

    Here you can find a relevant discussion on Ways to deal with #document under iframe

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search