Selenium WebDriver: я хочу перезаписать значение в поле вместо добавления к нему с помощью sendKeys с помощью Java


в WebDriver, если я использую sendKeys он добавит мою строку к значению, которое уже существует в поле. Я не могу очистить его с помощью метода clear (), потому что во второй раз, когда я это сделаю, веб-страница выдаст ошибку, сказав, что она должна быть между 10 и 100. Поэтому я не могу очистить его или ошибка будет выброшена, прежде чем я смогу ввести новое значение с помощью sendKeys, и если я sendKeys он просто добавляет его к значению уже там.

есть ли что-нибудь в WebDriver, что позволяет вам перезаписать значение в поле?

11 60

11 ответов:

Я думаю, вы можете попробовать сначала выделить весь текст в поле, а затем отправить новую последовательность:

from selenium.webdriver.common.keys import Keys
element.sendKeys(Keys.chord(Keys.CONTROL, "a"), "55");

вы также можете очистить поле перед отправкой ключей.

element.clear()
element.sendKeys("Some text here")

хорошо, это вид дней назад... В моем текущем случае ответ от ZloiAdun не работает для меня, но приближает меня к моему решению...

вместо:

element.sendKeys(Keys.chord(Keys.CONTROL, "a"), "55");

следующий код делает меня счастливой:

element.sendKeys(Keys.HOME,Keys.chord(Keys.SHIFT,Keys.END),"55");

Так что я надеюсь, что это поможет кому-то!

это сработало для меня.

mElement.sendKeys(Keys.HOME,Keys.chord(Keys.SHIFT,Keys.END),MY_VALUE);

в случае, если это кому-то поможет, эквивалент C# ответа ZloiAdun:

element.SendKeys(Keys.Control + "a");
element.SendKeys("55");

используйте это, это надежное решение и хорошо работает для всех браузеров:

protected void clearInput(WebElement webElement) {
    // isIE() - just checks is it IE or not - use your own implementation
    if (isIE() && "file".equals(webElement.getAttribute("type"))) {
        // workaround
        // if IE and input's type is file - do not try to clear it.
        // If you send:
        // - empty string - it will find file by empty path
        // - backspace char - it will process like a non-visible char
        // In both cases it will throw a bug.
        // 
        // Just replace it with new value when it is need to.
    } else {
        // if you have no StringUtils in project, check value still empty yet
        while (!StringUtils.isEmpty(webElement.getAttribute("value"))) {
            // "\u0008" - is backspace char
            webElement.sendKeys("\u0008");
        }
    }
}

если ввод имеет тип= "файл" - не очищайте его для IE. Он попытается найти файл по пустому пути и выбросит ошибку.

более подробную информацию вы можете найти мой блог

использовать следующий:

driver.findElement(By.id("id")).sendKeys(Keys.chord(Keys.CONTROL, "a",Keys.DELETE),"Your Value");

это решило мою проблему, когда мне пришлось иметь дело с HTML-страницей со встроенным JavaScript

WebElement empSalary =      driver.findElement(By.xpath(PayComponentAmount));
Actions mouse2 = new Actions(driver);
mouse2.clickAndHold(empSalary).sendKeys(Keys.chord(Keys.CONTROL, "a"), "1234").build().perform();

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].onchange()", empSalary);

были проблемы с использованием большинства из упомянутых методов, так как textfield не принимал ввод с клавиатуры, и решение мыши кажется не полным.

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

     Actions actionList = new Actions(driver);
     actionList.clickAndHold(WebElement).sendKeys(newTextFieldString).
     release().build().perform();

исходный вопрос говорит, что clear () не может быть использован. Это не относится к данной ситуации. Я добавляю свой рабочий пример здесь, поскольку это сообщение SO было одним из первых результатов Google для очистки ввода перед вводом значения.

для ввода, где нет дополнительных ограничений, я включаю агностический метод браузера для Селена с использованием NodeJS. Этот фрагмент является частью общей библиотеки, которую я импортирую с помощью VAR test = require ('common'); в моих тестовых сценариях. Это для стандартный модуль узла.определение экспорта.

    when_id_exists_type : function( id, value ) {
    driver.wait( webdriver.until.elementLocated( webdriver.By.id( id ) ) , 3000 )
        .then( function() {
            var el = driver.findElement( webdriver.By.id( id ) );
            el.click();
            el.clear();
            el.sendKeys( value );
        });
},

найдите элемент, щелкните его, очистите и отправьте ключи.

На этой странице есть полный пример кода и статья что может помочь.

Это то, что легко сделать, и это сработало для меня:

//Create a Javascript executor

    JavascriptExecutor jst= (JavascriptExecutor) driver;
    jst.executeScript("arguments[1].value = arguments[0]; ", 55, driver.findElement(By.id("id")));

55 = значение