web-dev-qa-db-ja.com

javaを使用してSelenium WebDriverでiframeを処理する方法

_<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、relativeを使用してみましたが、運がありませんでした。

注:内側のフレームを選択しない場合(_cq-gen379_)。 [OK]ボタンをクリックできます。

35
smriti

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(); 
52
Yi Zeng

次のコードでIframeから抜け出す必要があります。

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

それが役立つことを願って

37
Tarken

最初に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
_

それが役に立てば幸い。

21
user5366543

親フレームに戻るには、次を使用します。

driver.switchTo().parentFrame();

最初の/メインフレームに戻るには、次を使用します。

driver.switchTo().defaultContent();
4
Nik
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");
3
Ratnesh Sharma

フレーム処理の以下のアプローチ:ネストされたフレームの場合に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();
2
Ratnesh Sharma

Selenium Web Driver Handling Frames
iPathであるため、XPathで直接 iframe をクリックすることはできません。 最初にフレームに切り替えてから、xpathを使用してクリックします。

driver.switchTo().frame()には複数のオーバーロードがあります。

  1. driver.switchTo().frame(name_or_id)
    ここで、iframeにはIDも名前もありません。

  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からWeb-Driverへの変換Javaコマンド。 link


<frame> は、別のHTMLドキュメントを表示できる特定の領域を定義するHTML要素です。フレームは<frameset>内で使用する必要があります。 "非推奨。新しいWebサイトでは使用しません。

1
Yash