Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

[Resolved] Как ввести текст в поле textarea


(Junior Tester) #1

Есть сайт https://www.sprintapi.com/dhcs.html. как ввести текст в поле Body с помощью Selenium WebDriver и Java?


(Sergey Korol) #2

Как пробовали, что не получилось?


(Junior Tester) #3

Пробовали

driver.findElementByXPath("div[@class='CodeMirror-measure']").sendKeys("aaaaa");

Пробовали другие xpath(


(Павел Смолкин) #4

может не самый красивый локатор, но работает.
Там заметил особенность, что по 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();
            }
        }
    }

(Sergey Korol) #5

Исходя из того, что FF консоль благополучно скушала следующий кусок:

можно сделать вывод, что:

findElement(By.cssSelector("div + pre")).sendKeys("css selectors are very easy");

должен cработать не хуже.

П.С. И не забываем читать FAQ. :wink:


(Павел Смолкин) #6

Забавно то, что мой пример в 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();


(Sergey Korol) #7

Насчет фокусировки ничего сказать не могу, т.к. пробовал лишь в консоли. :blush:

П.С. perform уже включает в себя build.


(Junior Tester) #8

Ура. Работает) Спасибо большое… А как перед вводом строки “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");
```
не работает(

(Junior Tester) #9

решила вопрос так:

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");

(Павел Смолкин) #10

если уж говорить об обходных путях, то можно дополнить мой предыдущий пример вот этим


    (new Actions(driver)).DoubleClick().SendKeys(Keys.Backspace).Perform();

ну а количество этих действий в зависимости от например


    driver.FindElements(By.ClassName("CodeMirror-linenumber")).Count

ибо стирается только одна строка.
Вообще нетривиальный такой пример, очень уж многослойный и активный элемент.

пробовал стирать текст с помощью JS из < pre> < /pre>, но после снятия фокуса текст возвращается
Если есть желание сделать быстро и чисто - надо написать скрипт, который будет находить этот textarea и присваивать value пустую строку