Есть сайт sprintapi.com. как ввести текст в поле Body с помощью Selenium WebDriver и Java?
Как пробовали, что не получилось?
Пробовали
driver.findElementByXPath("div[@class='CodeMirror-measure']").sendKeys("aaaaa");
Пробовали другие xpath(
может не самый красивый локатор, но работает.
Там заметил особенность, что по body надо сперва кликнуть.
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.sprintapi.com/dhcs.html");
driver.FindElement(By.ClassName("btn-open-body-editor")).Click();
driver.FindElement(By.ClassName("body")).Click();
driver.FindElement(By.XPath("//*[@id='request']/div[2]/div[4]/div[2]/div[4]/div/div[1]/div/div[1]/div[1]/textarea")).SendKeys("tralalalalala");
System.Threading.Thread.Sleep(5000);
driver.Quit();
}
}
}
Исходя из того, что FF консоль благополучно скушала следующий кусок:
можно сделать вывод, что:
findElement(By.cssSelector("div + pre")).sendKeys("css selectors are very easy");
должен cработать не хуже.
П.С. И не забываем читать FAQ.
Забавно то, что мой пример в FF вызывает исключение “ElementNotVisible”, а ваш в хроме “cannot focus element”. А в FF ошибок нет, но и строка в текстбоксе не появляется.
UPD:
Возможно, конечно, я где-то свернул не туда, но у меня во всех браузерах заработал такой код:
var driver = new FirefoxDriver();
driver.Navigate().GoToUrl("https://www.sprintapi.com/dhcs.html");
//ждем загрузки страницы
new WebDriverWait(driver, TimeSpan.FromSeconds(5)).Until<bool>((_driver) =>
{
driver.FindElement(By.ClassName("btn-open-body-editor")).Click();
return true;
});
//фокусимся на текстбоксе
driver.FindElement(By.ClassName("CodeMirror")).Click();
//отправляем текст, куда зафокусились
(new Actions(driver)).SendKeys("tralala").Build().Perform() ;
Console.Read();
driver.Quit();
Насчет фокусировки ничего сказать не могу, т.к. пробовал лишь в консоли.
П.С. perform уже включает в себя build.
Ура. Работает) Спасибо большое… А как перед вводом строки “tralalalalala” стереть все в поле.
Пробовали так:
driver.FindElementByClassName("body").Click();
driver.FindElementByXPath("//*[@id='request']/div[2]/div[4]/div[2]/div[4]/div/div[1]/div/div[1]/div[1]/textarea").clear(); driver.FindElementByXPath("//[@id='request']/div[2]/div[4]/div[2]/div[4]/div/div[1]/div/div[1]/div[1]/textarea").sendKeys("t ralalalalala");
```
не работает(
решила вопрос так:
driver.FindElementByXPath("//[@id='request']/div[2]/div[4]/div[2]/div[4]/div/div[1]/div/div[1]/div[1]/textarea").sendKeys("\b\b\b\b\b\b");
если уж говорить об обходных путях, то можно дополнить мой предыдущий пример вот этим
(new Actions(driver)).DoubleClick().SendKeys(Keys.Backspace).Perform();
ну а количество этих действий в зависимости от например
driver.FindElements(By.ClassName("CodeMirror-linenumber")).Count
ибо стирается только одна строка.
Вообще нетривиальный такой пример, очень уж многослойный и активный элемент.
пробовал стирать текст с помощью JS из < pre> < /pre>, но после снятия фокуса текст возвращается
Если есть желание сделать быстро и чисто - надо написать скрипт, который будет находить этот textarea и присваивать value пустую строку