Как обрабатывать iframe в Selenium WebDriver с использованием Java - PullRequest
35 голосов
/ 30 марта 2012
<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'] не найден.

Я пытался использовать index, parent, относительный, но безуспешно.

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

Ответы [ 7 ]

52 голосов
/ 01 апреля 2012

В 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(); 
37 голосов
/ 30 марта 2012

Вы должны вернуться из Ифраме с помощью следующего кода:

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

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

21 голосов
/ 29 сентября 2015

Сначала нужно найти 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 голосов
/ 18 июля 2014

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

driver.switchTo().parentFrame();

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

driver.switchTo().defaultContent();
3 голосов
/ 27 февраля 2016
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");
2 голосов
/ 27 февраля 2016

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

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();
1 голос
/ 03 марта 2016

Кадры Selenium Web Driver
Невозможно нажать 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]

// 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-команды веб-драйвера. ссылка .


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...