Как обрабатывать 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("/libs/cq/ui/widgets/themes/default/ext/form/text-bg.gif"); 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
). Я могу нажать на кнопку ОК.
Ответы
Ответ 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()
имеет несколько перегрузок.
-
driver.switchTo().frame(name_or_id)
Здесь у вашего iframe
нет идентификатора или имени, поэтому не для вас.
-
driver.switchTo().frame(index)
Это последний вариант выбора, потому что использование индекса недостаточно стабильно, как вы могли себе представить. Если это ваш единственный iframe на странице, попробуйте driver.switchTo().frame(0)
-
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>
. " Устаревший. Не для использования на новых веб-сайтах.