2014-02-10 22 views
0

我試圖自動插入使用Selenium/Webdriver到文本框中鍵入一些文字創建使用tinymce如何將文本輸入tinceMCE editior使用硒/ webdriver的

文本框是不是一個普通的文本框,所以下面不工作:

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

注:通過硒,我不能夠得到「嵌入式」的HTML文檔內的任何元素(我得到元素未找到錯誤)

我已經找到了蟒蛇等於拿到上面做,但是,仍然希望得到它在我的Java代碼來完成:

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

回答

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謝謝,第二個解決方案innerHTML one爲我工作。不知道,第一種解決方案發生了什麼,我沒有得到任何錯誤,但也沒有看到文本輸入到文本框中。 – Watt

+0

@Watt:在發送密鑰之前,您可能需要先單擊身體才能對焦。 –

+0

即使首先點擊身體,第一個解決方案也不適用於我。 innerHTML js調用很好地工作。 .NET等價物,使用驅動程序擴展方法:'driver.ExecuteScript(「arguments [0] .innerHTML = arguments [1]」,driver.FindElement(By.TagName(「body」)),htmlValueToSet);' – rogersillito

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

謝謝!我試過這段代碼我得到一個異常,說'input_data_ifr'沒有找到..我需要指定它的'id' – Watt

+0

@Watt對不起,我拼錯了ID。我在代碼中糾正了它。 – Richard

+0

沒問題。 +1,當我執行'element = inputWebDriver.findElement(By.id(「tinymce」));它不會在輸入命令'element.sendKeys( 「測試文本」);'。任何想法,我應該做什麼不同? – Watt

0

從@ user1177636的答案AB ove,我發現 - 在Firefox驅動程序中 - 我只能得到「使用TinyMCE的本地API」選項才能工作。但是,那真的不是我想要的,因爲這會使用提供給該API方法的字符串覆蓋文本框中的所有內容。這對我來說是不利的,因爲我在編輯中有一堆我不想失去的內容。

但是,我很高興地通知您,只需使用activeEditor.selection.setContent就可以將它插入一些文本,而不是覆蓋所有文本。 Yeap,那額外的「選擇」是我需要的。

所以,這裏是我的解決方案,這僅僅是對上述@ user1177636的TinyMCE的API略有變化,並且再加上單詞「變了!」:

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

不要忘了,你需要這個進口爲工作

import org.openqa.selenium.JavascriptExecutor; 

希望這有助於別人誰可能具有相同的困境,我並保存一定時間(沒有,只要我做了,發現這個打獵)。