如何使用selenium / webdriver将文本输入tinyMCE编辑器

时间:2014-02-10 17:40:54

标签: java selenium tinymce selenium-webdriver wysiwyg

我正在尝试使用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");

就像纯文本框https://code.google.com/p/selenium/wiki/GettingStarted

一样正常

以下是截图如何在浏览器的元素选项卡中看到textarea元素的位置: http://imageshack.com/a/img812/9341/1zau.png

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

我发现python相当于上面做的,但是,仍然希望在我的java代码中完成它:

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

3 个答案:

答案 0 :(得分:6)

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

Test WYSIWYG editors using Selenium WebDriver

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

  • 直接发送密钥。与Richard的回答above相同。
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 = '<h1>Set text using innerHTML</h1>'", element);
  • 使用TinyMCE的原生API
// no need to switch iframe
(JavascriptExecutor)driver.executeScript("tinyMCE.activeEditor.setContent('<h1>Native API text</h1> TinyMCE')");

答案 1 :(得分:1)

该元素位于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();

答案 2 :(得分:0)

从上面的@ user1177636回答中,我发现 - 在Firefox驱动程序中 - 我只能得到&#34;使用TinyMCE的原生API&#34;工作的选择。但是,这真的不是我想要的,因为它会用提供给该API方法的字符串覆盖文本框中的所有内容。这对我来说是不利的,因为我在编辑器中有一堆我不想丢失的内容。

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

所以,这是我的解决方案,这只是@ user1177636上面的tinyMce API的一个小变化,它预先设置了单词&#34;更改了! &#34;:

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

不要忘记,您需要使用此导入才能正常工作

import org.openqa.selenium.JavascriptExecutor;

希望这可以帮助那些可能会遇到同样困境的人并节省他们一些时间(只要我发现这一点就不必打猎)。