_<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']
が見つからないと言います。
Index、parent、relativeを使用してみましたが、運がありませんでした。
注:内側のフレームを選択しない場合(_cq-gen379
_)。 [OK]ボタンをクリックできます。
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();
次のコードでIframeから抜け出す必要があります。
driver.switchTo().frame(driver.findElement(By.id("frameId")));
//do your stuff
driver.switchTo().defaultContent();
それが役立つことを願って
最初に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
_
それが役に立てば幸い。
親フレームに戻るには、次を使用します。
driver.switchTo().parentFrame();
最初の/メインフレームに戻るには、次を使用します。
driver.switchTo().defaultContent();
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");
フレーム処理の以下のアプローチ:ネストされたフレームの場合にIDまたは名前が指定されていない場合
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();
Selenium Web Driver Handling Frames
iPathであるため、XPathで直接 iframe をクリックすることはできません。 最初にフレームに切り替えてから、xpathを使用してクリックします。
driver.switchTo().frame()
には複数のオーバーロードがあります。
driver.switchTo().frame(name_or_id)
ここで、iframe
にはIDも名前もありません。
driver.switchTo().frame(index)
これは選択する最後のオプションです。インデックスの使用は想像できるほど安定していないためです。これがページ内の唯一のiframeである場合は、driver.switchTo().frame(0)
を試してください
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からWeb-Driverへの変換Javaコマンド。 link 。
<frame>
は、別のHTMLドキュメントを表示できる特定の領域を定義するHTML要素です。フレームは<frameset>
内で使用する必要があります。 "非推奨。新しいWebサイトでは使用しません。