Usando C#con selenio y cleditor
selenium (2)
Quiero ser capaz de configurar el cuerpo para un campo de texto cleditor usando selenio en c #, pero este proceso parece ser muy difícil. ¿Alguien puede explicarlo como si tuviera 4 años?
En google chrome navegue a la página haga clic con el botón derecho en el área editable del campo de texto. Haga clic en Inspeccionar elemento. Cuando se abra el html, haga clic con el botón derecho en el elemento resaltado y haga clic en Copiar XPath.
En el controlador web Selenium
IWebElement textField = driver.FindElement(By.XPath("Paste what you got from CHROME"));
textField.SendKeys("Desired Text");
La lógica básica de Selenio es encontrar primero el elemento y luego realizar acciones en él.
Sin embargo, en este caso, tiene las siguientes dificultades:
- el editor está en un
iframe
- el iframe no tiene id, name o incluso src significativo
- el editor no es un input o textarea, sino el
body
mismo.
Cómo navegar en iframes (el enlace de Arran debería ser un buen tutorial para mirar)
Use Firefox + Firebug + Firepath para encontrar iframes.
Como puede ver, hay cuatro iframes en la página, necesita uno de los siguientes métodos para cambiar al marco del editor, no a los otros marcos. ( fuente )
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
Entonces tenemos:
IWebElement iframe = driver.FindElement(By.XPath("//iframe[@src=''javascript:true;'']"));
driver.SwitchTo().Frame(iframe);
Cómo enviar claves al editor
Una vez que su controlador está dentro del iframe, a través de Firebug, puede ver que el editor es en realidad el body
, no de input
o de textarea
.
Entonces necesita encontrar el elemento del cuerpo, limpiarlo y enviar claves. Tenga en cuenta que Clear()
puede no funcionar en el elemento del cuerpo, por lo que necesita utilizar IJavaScriptExecutor
o enviar Control+a
para seleccionar todo primero.
Cambiar de los iframes
Después de que se haya enviado algo de texto al editor, puede usar driver.SwitchTo().DefaultContent();
salir.
El código completado
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();
}
}
}