Селен не может найти iframe - PullRequest
       30

Селен не может найти iframe

0 голосов
/ 07 февраля 2019

Selenium не может найти iframe с помощью ID и Name.

. Это для проверки автоматической проверки на Shopify.Конкретная проблема заключается в поле оплаты.Я нашел идентификатор и имя iframe, которое card-fields-number-b1kh6njydiv00000.

iframe Image:

iframe Image

Изображение текстового поля:

Text Field Image

Кодовые испытания:

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

Ошибка:

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

Ответы [ 5 ]

0 голосов
/ 08 февраля 2019

Мое решение состояло в том, чтобы искать ключевые слова, которые являются одинаковыми для разных динамических идентификаторов.В данном случае это было «имя-поля-карты».Я сделал это с помощью локатора XPath.

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'card-fields-number')]")));
0 голосов
/ 08 февраля 2019

В соответствии с изображениями, которыми вы поделились, <iframe> имеет динамические атрибуты, поэтому для поиска и переключения на желаемое <iframe> необходимо:

  • Индуцировать WebDriverWait для получения желаемого кадра и переключения на него .
  • Вы можете использовать любое из следующих решений:

    • 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')]")));
      

Здесь вы можете найти соответствующую дискуссию по Способы работы с #document в iframe

0 голосов
/ 07 февраля 2019

Я предполагаю, что имя или идентификатор кадра каждый раз динамичны. В этом случае используйте индекс для идентификации кадра.

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();
   }

Надеюсь, это поможет

0 голосов
/ 07 февраля 2019

Для этого можно использовать XPath.Вам нужно будет найти IFrame IWebElement с XPath, а затем передать IWebElement в SwitchTo (). Frame ()

var ele = driver.FindElement(By.XPath("//iframe[contains(id, 'card-fields-number')]"));

driver.switchTo().frame(ele);
0 голосов
/ 07 февраля 2019

Вы пытались использовать driver.switchTo (). DefaultContent ();перед switchTo.frame?

Может быть, вы не из всех кадров

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