2012-09-18 6 views
4

Besoin d'accéder aux éléments à l'intérieur d'un iframe modal.<'WebDriver'> .switchTo(). Frame (<'frameId'>) ne fonctionne pas avec le pilote Chrome

Ci-dessous le code fonctionne parfaitement bien pour le pilote FireFox tout échoue pour Chrome -

String frameId = null; 
List<WebElement> frameSet = driver.findElements(By.tagName("iframe")); 
for (WebElement frameName : frameSet){ 
    if(!(frameName.getAttribute("id").isEmpty()) && (frameName.getAttribute("id").contains("DlgFrame"))){ 
      frameId = frameName.getAttribute("id"); 
     } 
} 

try { 
    Thread.sleep(10000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

Logger.info("Switch to Frame - "+frameId); 
driver.switchTo().frame(driver.findElement(By.id(frameId))); 

Est-ce que switchTo.frame support du pilote Chrome (< 'frameId'>)?

Erreur lors de l'utilisation du pilote Chrome -

org.openqa.selenium.WebDriverException: Unknown command. Options: ActivateTab, CaptureEntirePage, CloseTab, DeleteCookie, ...

Command duration or timeout: 220 milliseconds Build info: version: '2.25.0', revision: '17482', time: '2012-07-18 22:18:01' System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_05' Driver info: driver.version: RemoteWebDriver Session ID: cbde65cb0394ee0434b3bb528918ce40 at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:188) at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:498) at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:244) at org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:87) at com.shn.services.Office365.sharePointUploadFile(Office365.java:173) at com.shn.test.RunOffice365Test.testSharePointUploadAndDeleteFile(RunOffice365Test.java:55) at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:74) at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:92) at org.apache.maven.surefire.Surefire.run(Surefire.java:180) at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)

Répondre

3

La question n'a été ni avec chromeDriver ni sélénium. Les deux fonctionnaient sur les dernières versions.

chromeDriver - 23.0.1240.0

Sélénium - 2.25.0

Le problème était avec le navigateur Chrome.

Mon navigateur fonctionnait sur ver. 12.0.742.112. Mises à jour automatiques échouaient en raison de -

update Server not available (error:7)

je devais désinstaller & installer de nouveau le navigateur pour obtenir le dernier ver. 21,0,1180,89 m.

Le problème est maintenant corrigé & Je peux basculer entre les images.

+0

Bizarre. J'ai mis à jour et cela a fonctionné – alanjds

4

ChromeDriver soutient SwitchTo car il implémente l'interface WebDriver. Cela fonctionne bien pour moi.

Vous devez faire comme ceci:

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

Oui, j'utilise Sélénium 2.25.0 et chomeDriver la version 23.0.1240.0. Je comprends que webDriver supporte switchTo. Mais supporte-t-il spécifiquement switchTo FrameId? – praneel

+0

a modifié mon poste. – Tarken

+0

Le code ci-dessus entraîne la même erreur. Même essayé, y compris quelques attentes avant de passer à l'image. Aucun effet. – praneel

1

Il semble que le problème ne soit pas dans l'iframe. La liste des erreurs inclut org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:87) at. Donc, je suppose qu'une autre partie de votre code mène à l'application. échouer.

+0

On dirait que l'OP a trouvé que le crash était la faute de Chrome. – orique

1

Ceci est mon mise en œuvre du passage à encadrer pour tous les navigateurs, car le passage à image par ID ou le nom ne fonctionne pas pour Chrome (avec les dernières versions)

  • utilisant XPath (code plus élégant/lisible) :
/** 
* This switch to frame method improves standard way to switching to frame 
* (driver.switchTo().{@linkplain org.openqa.selenium.WebDriver.TargetLocator#frame(String) frame(String nameOrId)}) 
* because Chrome browser has problem with this method. <br/> 
* 
* Bug: http://code.google.com/p/chromedriver/issues/detail?id=107 
* @param frameIdOrName the id or name of the &lt;frame&gt; or &lt;iframe&gt; element 
* @return This driver focused on the given frame. 
*/ 
public WebDriver switchToFrameByIdOrName(String frameNameOrId) { 
    if (driver instanceof ChromeDriver) { 
     String frameElementXpath = String.format("//frame[@name='%1$s' or @id='%1$s']", frameNameOrId); 
     WebElement f = driver.findElement(By.xpath(frameElementXpath)); 
     return driver.switchTo().frame(f); 
    } 
    return driver.switchTo().frame(frameNameOrId); 
} 

ou

  • en utilisant les sélecteurs CSS (parce que CSS selecto RS devrait être un moyen plus rapide de trouver des éléments. Pour plus d'infos voir Selecting WebDriver locators:
public WebDriver switchToFrameByIdOrName(String frameIdOrName) { 
    if (!(driver instanceof ChromeDriver)) { 
     return driver.switchTo().frame(frameIdOrName); 
    } 
    WebElement frame = null; 
    try { 
     frame = driver.findElement(By.cssSelector("frame[id='" + frameIdOrName + "']")); 
    } catch (NoSuchElementException e) { /* It's ok for the moment */ } 

    if (frame == null) { 
     try { 
      frame = driver.findElement(By.cssSelector("frame[name='" + frameIdOrName + "']")); 
     } catch (NoSuchElementException e) { 
      log.severe(String.format("CORE > switchToFrameByIdOrName() error: Frame with name or id '%s' not found.", frameIdOrName)); 
     } 
    } 
    return driver.switchTo().frame(element); 
} 

J'utilise:

Selenium 2.37.1 
Session info: chrome=31.0.1650.57) 
Driver info: chromedriver=2.7.236900,platform=Windows NT 6.1 SP1 x86_64 
Questions connexes