Подтвердить что ты не робот

Как обрабатывать iframe в Selenium WebDriver с помощью java

<div>    
  <iframe id="cq-cf-frame ">    
    <iframe id="gen367">   
      <body spellcheck="false" id="CQrte" style="height: 255px; font-size: 12px; font-family:tahoma,arial,helvetica,sans-serif; background-image: url(&quot;/libs/cq/ui/widgets/themes/default/ext/form/text-bg.gif&quot;); background-repeat: repeat-x; background-attachment: fixed;">
        <p>4t43t4<br></p>
      </body >
    </iframe>
  </iframe>    
</div> 

В этом сценарии есть iframe под iframe. И я должен выбрать внешний iframe чтобы перейти к внутреннему iframe и написать в теле, которое находится во внутреннем iframe.

Затем я должен выйти из внутреннего iframe во внешний iframe и нажать кнопку OK (которая находится во внешнем iframe).

Ниже мой код

/*Line 1 */ driver.switchTo().frame("cq-cf-frame");
/*     2 */ driver.findElement(By.css("#extdd-9 > div.tblRow >  input.edititem").click();
/*     3 */ driver.switchTo().Frame("cq-gen379");
/*     4 */ driver.findElement(By.id("CQrte").sendKeys("Tnx");  
/*     5 */ selenium.selectFrame("relative=up");       
/*     6 */ driver.findElement(By.xpath("//button[text()='OK']")).click(); 

Следующее - моя проблема:

Мой тестовый код работает нормально до строки № 4, т.е. записывает в тело, но я хочу выйти из внутреннего в внешний iframe он говорит, что элемент //button[text()='OK'] не найден.

Я пытался с использованием индекса, родителя, родственника, но безуспешно.

ПРИМЕЧАНИЕ. Если я не выбрал внутреннюю рамку (cq-gen379). Я могу нажать на кнопку ОК.

4b9b3361

Ответ 1

В Webdriver вы должны использовать driver.switchTo().defaultContent();, чтобы выйти из фрейма. Сначала вам нужно выйти из всех кадров, а затем снова переключиться на внешний кадр.

// between step 4 and step 5
// remove selenium.selectFrame("relative=up");
driver.switchTo().defaultContent(); // you are now outside both frames
driver.switchTo().frame("cq-cf-frame");
// now continue step 6
driver.findElement(By.xpath("//button[text()='OK']")).click(); 

Ответ 2

Вам нужно вернуться из iframe со следующим кодом:

driver.switchTo().frame(driver.findElement(By.id("frameId")));
//do your stuff
driver.switchTo().defaultContent();

надеюсь, что поможет

Ответ 3

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

WebElement iFrame= driver.findElement(By.tagName("iframe"));

Затем вы можете перейти к нему с помощью метода switchTo для вас WebDriver.

driver.switchTo().frame(iFrame);

И чтобы вернуться к родительскому фрейму, вы можете либо использовать switchTo().parentFrame(), либо если вы хотите вернуться к основному (или основному) кадру, вы можете использовать switchTo().defaultContent();.

driver.switchTo().parentFrame();    // to move back to parent frame
driver.switchTo().defaultContent(); // to move back to most parent or main frame

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

Ответ 4

Чтобы вернуться к исходному фрейму, используйте:

driver.switchTo().parentFrame();

Чтобы вернуться к первому/основному кадру, используйте:

driver.switchTo().defaultContent();

Ответ 5

WebDriver driver=new FirefoxDriver();
driver.get("http://www.java-examples.com/java-string-examples");
Thread.sleep(3000);
//Switch to nested frame
driver.switchTo().frame("aswift_2").switchTo().frame("google_ads_frame3");

Ответ 6

Ниже подход обработки кадров: когда ни один идентификатор или имя не указывается с вложенным фреймом

WebElement element =driver.findElement(By.xpath(".//*[@id='block-block19']//iframe"));
driver.switchTo().frame(element);
driver.findElement(By.xpath(".//[@id='carousel']/li/div/div[3]/a")).click();

Ответ 7

Рамки для обработки веб-драйверов Selenium
Невозможно щелкнуть iframe непосредственно через XPath, так как это iframe. Сначала мы должны переключиться на фрейм, а затем щелкнуть по xpath.

driver.switchTo().frame() имеет несколько перегрузок.

  1. driver.switchTo().frame(name_or_id)
    Здесь у вашего iframe нет идентификатора или имени, поэтому не для вас.

  2. driver.switchTo().frame(index)
    Это последний вариант выбора, потому что использование индекса недостаточно стабильно, как вы могли себе представить. Если это ваш единственный iframe на странице, попробуйте driver.switchTo().frame(0)

  3. driver.switchTo().frame(iframe_element)
    Самый распространенный. Вы определяете свой iframe как другие элементы, а затем передаете его в метод.

driver.switchTo(). defaultContent (); [parentFrame, defaultContent, frame] (); [parentFrame, defaultContent, frame]

// Based on index position:
int frameIndex = 0;
List<WebElement> listFrames = driver.findElements(By.tagName("iframe"));
System.out.println("list frames   "+listFrames.size());
driver.switchTo().frame(listFrames.get( frameIndex ));

// XPath|CssPath Element:
WebElement frameCSSPath = driver.findElement(By.cssSelector("iframe[title='Fill Quote']"));
WebElement frameXPath = driver.findElement(By.xpath(".//iframe[1]"));
WebElement frameTag = driver.findElement(By.tagName("iframe"));

driver.switchTo().frame( frameCSSPath ); // frameXPath, frameTag


driver.switchTo().frame("relative=up"); // focus to parent frame.
driver.switchTo().defaultContent(); // move to the most parent or main frame

// For alert's
Alert alert = driver.switchTo().alert(); // Switch to alert pop-up
alert.accept();
alert.dismiss();

Тест XML:

<html>
    <IFame id='1'>...       parentFrame() « context remains unchanged. <IFame1>
    |
     -> <IFrame id='2'>...  parentFrame() « Change focus to the parent context. <IFame1>
</html>

</html>
<frameset cols="50%,50%">
    <Fame id='11'>...     defaultContent() « driver focus to top window/first frame. <html>
    |
     -> <Frame id='22'>... defaultContent() « driver focus to top window/first frame. <Fame11> 
                           frame("relative=up") « focus to parent frame. <Fame11>
</frameset>
</html>

Преобразование RC в Java-команды Web-драйвера. ссылка.


<frame> - это элемент HTML, который определяет определенную область, в которой может отображаться другой документ HTML. Кадр должен использоваться в <frameset>. " Устаревший. Не для использования на новых веб-сайтах.