使用C#与硒和cleditor

时间:2013-06-11 16:04:14

标签: c# selenium cleditor

我希望能够在c#中使用selenium为cleditor文本字段设置正文,但这个过程似乎非常困难。任何人都可以像我4岁那样解释它吗?

2 个答案:

答案 0 :(得分:1)

基本的Selenium逻辑是先找到元素,然后对它执行操作。

但是,在这种情况下,您遇到以下困难:

  1. 编辑器位于iframe
  2. iframe没有id,name甚至没有意义的src
  3. 编辑器不是输入或文本区域,而是body本身。
  4. 如何导航到iframe (Arran的链接应该是一个很好的教程来查看)

    使用Firefox + Firebug + Firepath查找iframe。

    Firefox+Firebug+Firepath usage

    如您所见,页面中有四个iframe,您需要使用以下方法之一切换到编辑器框架,而不是其他框架。 (source

    IWebDriver Frame(int frameIndex); // works but not desirable, as you have 4 frames, index might be changing
    IWebDriver Frame(string frameName); // not working, your editor doesn't have frameName or id.
    IWebDriver Frame(IWebElement frameElement); // the way to go, find frame by xpath or css selector in your case
    

    所以我们有:

    IWebElement iframe = driver.FindElement(By.XPath("//iframe[@src='javascript:true;']"));
    driver.SwitchTo().Frame(iframe);
    

    如何将密钥发送到编辑器

    一旦您的驱动程序位于iframe内,通过Firebug,您可以看到编辑器实际上是body,而不是inputtextarea

    所以你需要找到body元素,清除它并发送密钥。请注意Clear()可能不适用于body元素,因此您需要使用IJavaScriptExecutor或发送Control+a来全部选择。

    退出iframe

    将一些文字发送给编辑后,您可以使用driver.SwitchTo().DefaultContent();退出。

    已完成的代码

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using OpenQA.Selenium;
    using OpenQA.Selenium.Firefox;
    
    namespace SOTest {
        [TestClass]
        public class TestCLEditor {
            [TestMethod]
            public void TestMethod1() {
                IWebDriver driver = new FirefoxDriver();
                driver.Navigate().GoToUrl("http://premiumsoftware.net/CLEditor");
    
                // find frames by src like 'javascript:true;' is really not a good idea, but works in this case
                IWebElement iframe = driver.FindElement(By.XPath("//iframe[@src='javascript:true;']"));
                driver.SwitchTo().Frame(iframe);
    
                IWebElement body = driver.FindElement(By.TagName("body")); // then you find the body
                body.SendKeys(Keys.Control + "a"); // send 'ctrl+a' to select all
                body.SendKeys("Some text");
    
                // alternative way to send keys to body
                // IJavaScriptExecutor jsExecutor = driver as IJavaScriptExecutor;
                // jsExecutor.ExecuteScript("var body = document.getElementsByTagName('body')[0]; body.innerHTML = 'Some text';");
    
                driver.Quit();
            }
        }
    }
    

答案 1 :(得分:0)

在Google Chrome浏览器中,右键单击文本字段的可编辑区域。单击“检查元素”。打开html后,右键单击突出显示的元素,然后单击Copy XPath。

在Selenium Web驱动程序中

IWebElement textField =      driver.FindElement(By.XPath("Paste what you got from CHROME"));
textField.SendKeys("Desired Text");