web-dev-qa-db-fra.com

Comment gérer iframe dans Selenium WebDriver en utilisant 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> 

Dans ce scénario, il y a un iframe sous iframe. Et je dois sélectionner le iframe extérieur pour aller au iframe intérieur et écrire dans le corps qui se trouve dans le iframe intérieur.

Ensuite, je dois sortir du iframe intérieur au iframe extérieur et cliquer sur le bouton OK (qui se trouve dans le iframe extérieur).

Voici mon code

/*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(); 

Voici mon problème:

Mon code de test fonctionne parfaitement jusqu'au numéro de ligne 4, c'est-à-dire l'écriture dans le corps, mais je veux sortir de l'intérieur vers l'extérieur iframe, il est indiqué que l'élément //button[text()='OK'] n'est pas trouvé.

J'ai essayé d'utiliser index, parent, parent, mais je n'ai pas eu de chance.

NOTE: Si je ne sélectionne pas le cadre interne (cq-gen379). Je peux cliquer sur le bouton OK.

35
smriti

Dans Webdriver, vous devez utiliser driver.switchTo().defaultContent(); pour sortir d'un cadre. Vous devez d'abord sortir de tous les cadres, puis basculer à nouveau dans le cadre extérieur.

// 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

Vous devez sortir de l'Iframe avec le code suivant:

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

j'espère que ça t'as aidé

37
Tarken

Vous devez d'abord trouver iframe. Vous pouvez le faire en utilisant la déclaration suivante.

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

Ensuite, vous pouvez y accéder en utilisant la méthode switchTo sur vous WebDriver objet.

driver.switchTo().frame(iFrame);

Et pour revenir au cadre parent, vous pouvez utiliser switchTo().parentFrame() ou si vous souhaitez revenir au cadre principal (ou à la plupart des parents), vous pouvez utiliser switchTo().defaultContent();.

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

J'espère que ça aide.

21
user5366543

Pour revenir au cadre parent, utilisez:

driver.switchTo().parentFrame();

Pour revenir au premier/cadre principal, utilisez:

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

Approche ci-dessous pour la gestion des images: lorsqu'aucun identifiant ou nom n'est donné en cas d'image imbriquée

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

Sélénium Web Gestion des cadres
Il est impossible de cliquer iframe directement via XPath car il s'agit d'un iframe. Nous devons d’abord basculer sur le cadre puis cliquer avec xpath.

driver.switchTo().frame() a plusieurs surcharges.

  1. driver.switchTo().frame(name_or_id)
    Ici votre iframe n'a pas d'identifiant ni de nom, donc pas pour vous.

  2. driver.switchTo().frame(index)
    C’est la dernière option à choisir car l’utilisation d’index n’est pas assez stable comme vous pouvez l’imaginer. S'il s'agit de votre seul iframe dans la page, essayez driver.switchTo().frame(0)

  3. driver.switchTo().frame(iframe_element)
    Le plus commun. Vous localisez votre iframe comme d’autres éléments, puis vous le transmettez à la méthode.

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();

Test 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>

Conversion de RC en Web-Driver Java. lien .


<frame> est un élément HTML qui définit une zone particulière dans laquelle un autre document HTML peut être affiché. Un cadre doit être utilisé dans un <frameset>. "Obsolète. Ne pas utiliser dans les nouveaux sites Web.

1
Yash