Selenium can't locate iframe

2020-03-30 04:26发布

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条回答
姐就是有狂的资本
2楼-- · 2020-03-30 05:05

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");
查看更多
祖国的老花朵
3楼-- · 2020-03-30 05:06

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')]")));
查看更多
女痞
4楼-- · 2020-03-30 05:12

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

查看更多
ら.Afraid
5楼-- · 2020-03-30 05:19

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

查看更多
成全新的幸福
6楼-- · 2020-03-30 05:23

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);
查看更多
登录 后发表回答