如何使用selenium / webdriver将文本输入到tinceMCE editior中

我正在尝试使用Selenium / Webdriver自动将一些文本插入到使用tinymce创建的文本框中

文本框不是普通的香草文本框,因此以下不起作用:

System.out.println("Finding text input element"); WebElement element = inputWebDriver.findElement(By.xpath("//html/body/div/form/div/div/div[2]")); //not working //WebElement element = inputWebDriver.findElement(By.tagName("form")); // not working //WebElement element = inputWebDriver.findElement(By.id("tinymce")); // not working System.out.println("Entering something in text input"); element.sendKeys("Test text"); 

喜欢纯文本框可以正常工作http://sofzh.miximages.com/java/selenium-google-code-issue-archive

注意:通过selenium,我无法在’embedded’html doc中找到任何元素(我得到元素未找到错误)

我发现一个python等同于上面完成,但是,仍然希望在我的java代码中完成它:

 browser.execute_script("tinyMCE.activeEditor.setContent('{}')".format(testTextVar)) 

有多种方法可以做到这一点。 这是一篇你可能想看的文章。

使用Selenium WebDriver测试WYSIWYG编辑器

下面的代码片段未经过测试,仅提供Java中的逻辑。

  • 直接发送密钥。 与理查德的答案相同。
 inputWebDriver.switchTo().frame("input-data_ifr"); WebElement element = inputWebDriver.findElement(By.cssSelector("body")); element.sendKeys("Send keys"); 
  • 设置innerHTML
 inputWebDriver.switchTo().frame("input-data_ifr"); WebElement element = inputWebDriver.findElement(By.cssSelector("body")); (JavascriptExecutor)driver.executeScript("arguments[0].innerHTML = '

Set text using innerHTML

'", element);
  • 使用TinyMCE的原生API
 // no need to switch iframe (JavascriptExecutor)driver.executeScript("tinyMCE.activeEditor.setContent('

Native API text

TinyMCE')");

该元素位于iframe内部。

你需要使用:

 inputWebDriver.switchTo().frame("input-data_ifr"); WebElement element = inputWebDriver.findElement(By.id("tinymce")); System.out.println("Entering something in text input"); element.sendKeys(Keys.CONTROL + "a"); element.sendKeys("Test text"); 

然后使用以下内容在完成后切换回文档的顶部。

 inputWebDriver.switchTo().defaultContent(); 

从@ user1177636上面的答案,我发现 – 在Firefox驱动程序中 – 我只能使用“使用TinyMCE的本机API”选项。 但是,这真的不是我想要的,因为这将覆盖文本框中的所有内容,并提供给该API方法的字符串。 这对我来说是不利的,因为我在编辑器中有很多内容我不想丢失。

但是,我很高兴地通知您,只需使用activeEditor.selection.setContent就可以简单地插入一些文本而不是覆盖所有文本。 是的,那个额外的“选择”就是我所需要的。

所以,这是我的解决方案,这只是上面的@ user1177636的tinyMce API的一个小变化,其前面加上“已更改!”这个词:

 ((JavascriptExecutor)driver).executeScript("tinyMCE.activeEditor.selection.setContent('changed! ')"); 

不要忘记你需要这个导入才能工作

 import org.openqa.selenium.JavascriptExecutor; 

希望这可以帮助那些可能有同样困境的人,并节省他们一些时间(不必像我一样去寻找这个)。