3

Maybe my question is similar to this Selenium WebDriver cannot locate element within an iframe, and throws NoSuchElementException however I still can't find required element.
The element itself looks:

body id="tinymce" class="mceContentBody" contenteditable="true" onload="window.parent.tinyMCE.get('compose_295_composeEditor').onLoad.dispatch();" dir="ltr" style="overflow: auto;">

the iframe containing this element is:

body id="tinymce" class="mceContentBody" contenteditable="true" onload="window.parent.tinyMCE.get('compose_295_composeEditor').onLoad.dispatch();" dir="ltr" style="overflow: auto;">  

I tried

driver.switchTo().frame(10);
driver.switchTo().frame(driver.findElement(By.id("tinymce")));
driver.findElement(By.id("tinymce")).clear();
driver.findElement(By.id("tinymce")).sendKeys("Privet!"); // clear mail text body
driver.switchTo().defaultContent();  

but received error:

Unable to locate frame: 10 

Tried also something like

driver.switchTo().frame(driver.findElement(By.id("tinymce")));  

as described in other answers there but received NoSuchElement error.

The HTML around the element is:

<div class="b-compose__editor ru_RU">
<div id="compose_295_toolbar_external" class="compose__editor_toolbar defaultSkin">
<div class="js-removeDraftContainer infobar infobar_notice infobar_draft" style="display: none;">
<div id="compose_295_composeFrame" class="b-compose__editor__frame">
<div class="compose__editor__frame_shadow"></div>
<table class="w100" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="vti w100">
<div id="compose_295_composeEditorFrame" class="composeEditorFrame" style="height: 200px;">
<table id="compose_295_shell__text" class="mlruTmpId0" cellspacing="0" cellpadding="0" bgcolor="" background="" style="width: 100%">
<tbody>
<tr class="nojsdn textModeHide">
<tr>
<td class="cell w100">
<table id="compose_295_middleTable" class="w100" cellspacing="0" cellpadding="0">
<tbody>
<tr id="compose_295_middleRow_sht">
<td id="compose_295_shell__text_cell_holder" class="cell shell__text_cell_holder w100" valign="top">
<table class="w100" cellspacing="0" cellpadding="0">
<tbody>
<tr class="nojsdn textModeHide">
<tr>
<td id="compose_295_shell__text_cell" class="cell shell__text_cell w100" valign="top">
<textarea id="compose_295_composeEditor" class="bsbb composeEditor" wrap="physical" tabindex="10" name="Body" style="width: 100%; height: 570px; display: none;" cols="80" rows="15" spellcheck="true" aria-hidden="true"> </textarea>
 <span id="compose_295_composeEditor_parent" class="mceEditor defaultSkin">
 <table id="compose_295_composeEditor_tbl" class="mceLayout" cellspacing="0" cellpadding="0" style="width: 100%; height: 570px;">
<tbody>
<tr class="mceFirst mceLast">
<td class="mceIframeContainer mceFirst mceLast">
<iframe id="compose_295_composeEditor_ifr" frameborder="0" src="javascript:""" allowtransparency="true" title="{#aria.rich_text_area}" style="width: 100%; height: 200px; display: block;" hidefocus="true" tabindex="10" scrolling="auto">
<html>
<head xmlns="http://www.w3.org/1999/xhtml">
<body id="tinymce" class="mceContentBody" contenteditable="true" onload="window.parent.tinyMCE.get('compose_295_composeEditor').onLoad.dispatch();" dir="ltr" style="overflow: auto;">
</html>
</iframe>
</td>
</tr>
</tbody>
</table>
</span>
</td>
</tr>
<tr class="nojsdn textModeHide">
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>

UPD Selenium and wordpress: New post test , olyv's answer there helped me but:
1) It was very hard to associate that question to mine since it doesn't mention TinyMCE editor in the title and the problem isn't really with wordpress.
2) I edited my question name to indicate the problem source - TinyMCE editor.
3) Saifur's answer here answers my question perfectly.
So I believe my question shouldn't be closed

Community
  • 1
  • 1
Prophet
  • 32,350
  • 22
  • 54
  • 79

3 Answers3

5

According to the html the selector to identify the iframe is incorrect. I am using a cssSelector that will allow you to identify the iframe with partial id match. Why do not you try this?

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[id$='_composeEditor_ifr']")));
d̶r̶i̶v̶e̶r̶.̶s̶w̶i̶t̶c̶h̶T̶o̶(̶)̶.̶f̶r̶a̶m̶e̶(̶d̶r̶i̶v̶e̶r̶.̶f̶i̶n̶d̶E̶l̶e̶m̶e̶n̶t̶(̶B̶y̶.̶i̶d̶(̶"̶t̶i̶n̶y̶m̶c̶e̶"̶)̶)̶)̶;̶
driver.findElement(By.id("tinymce")).clear();
driver.findElement(By.id("tinymce")).sendKeys("Privet!"); // clear mail text body
driver.switchTo().defaultContent();  
aholt
  • 2,829
  • 2
  • 10
  • 13
Saifur
  • 16,081
  • 6
  • 49
  • 73
  • This gives error: Caused by: org.openqa.selenium.NoSuchFrameException: Element is not a frame element: BODY – Prophet Jun 16 '15 at 17:23
  • Try the javascript solution provided by @Imcphers then. That's complicated – Saifur Jun 16 '15 at 17:26
  • Sounds good. I forgot to remove the way you were switching the frame. thanks @aholt for noticing that – Saifur Jun 16 '15 at 21:48
2

Since you're using Firefox, try this workaround. It does not require switching into the iFrame at all if all you want to do is submit text to the tinyMCE object. I tried other various options that you were trying recently in Firefox, but for some reason the only one that seems reliable is this one:

    driver.executeScript("tinyMCE.activeEditor.setContent('Privet!')");
lmcphers
  • 468
  • 3
  • 18
1

just use cssSelector with iframe

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe")));
Maddy
  • 63
  • 7
  • This will not work since TinyMCE embedded editor is used here. – Prophet Jun 17 '15 at 14:46
  • Additionally, there are multiple ifarmes on that pages. Editor is 10-th frame while your code will select the first iframe on the page. – Prophet Jun 17 '15 at 14:57