78

在 WebDriver 中,如果我使用 sendKeys,它会将我的字符串附加到字段中已经存在的值。我无法使用 clear() 方法清除它,因为第二次这样做,网页会抛出一个错误,说它必须在 10 到 100 之间。所以我无法清除它,否则之前会抛出错误我可以使用 sendKeys 输入新值,如果我 sendKeys 它只是将它附加到已经存在的值上。

WebDriver 中是否有任何内容可以让您覆盖该字段中的值?

4

12 回答 12

112

您还可以在发送密钥之前清除该字段。

element.clear()
element.sendKeys("Some text here")
于 2011-04-21T15:29:19.803 回答
95

我认为您可以尝试首先选择字段中的所有文本,然后发送新序列:

from selenium.webdriver.common.keys import Keys
element.sendKeys(Keys.chord(Keys.CONTROL, "a"), "55");
于 2010-07-15T09:20:25.307 回答
21

好的,那是几天前......在我目前的情况下,ZloiAdun 的答案对我不起作用,但让我非常接近我的解决方案......

代替:

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

下面的代码让我很高兴:

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

所以我希望这对某人有帮助!

于 2013-11-07T17:18:56.223 回答
8

这对我有用。

mElement.sendKeys(Keys.HOME,Keys.chord(Keys.SHIFT,Keys.END),MY_VALUE);
于 2016-05-26T11:07:49.130 回答
7

如果它对任何人有帮助,ZloiAdun 的答案的 C# 等价物是:

element.SendKeys(Keys.Control + "a");
element.SendKeys("55");
于 2014-08-13T17:35:47.807 回答
2

使用这个,它是值得信赖的解决方案,适用于所有浏览器:

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

如果输入有 type="file" - 不要为 IE 清除它。它将尝试通过空路径查找文件并抛出错误。

您可以在我的博客上找到更多详细信息

于 2013-02-19T12:32:20.083 回答
1

由于文本字段不接受键盘输入,使用上述大多数方法时出现问题,并且鼠标解决方案似乎不完整。

这用于模拟字段中的点击,选择内容并将其替换为新内容。

     Actions actionList = new Actions(driver);
     actionList.clickAndHold(WebElement).sendKeys(newTextFieldString).
     release().build().perform();
于 2016-07-04T10:14:39.027 回答
1

使用以下内容:

driver.findElement(By.id("id")).sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE), "Your Value");
于 2018-01-04T11:12:45.027 回答
0

当我不得不处理带有嵌入式 JavaScript 的 HTML 页面时,这解决了我的问题

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);
于 2015-06-05T06:48:25.763 回答
0
 WebElement p= driver.findElement(By.id("your id name"));
 p.sendKeys(Keys.chord(Keys.CONTROL, "a"), "55");
于 2021-01-25T06:18:10.673 回答
0

这很容易做到,它对我有用:

//Create a Javascript executor

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

55 = 赋值

于 2018-08-30T21:34:24.670 回答
0

原始问题说 clear() 不能使用。这不适用于那种情况。我在这里添加我的工作示例,因为这个 SO 帖子是在输入值之前清除输入的第一个谷歌结果之一。

对于此处没有额外限制的输入,我将使用 NodeJS 为 Selenium 提供与浏览器无关的方法。var test = require( 'common' );这个片段是我在测试脚本中导入的公共库的一部分。它用于标准节点 module.exports 定义。

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 );
    });
},

找到元素,单击它,清除它,然后发送密钥。

这个页面有一个完整的代码示例和文章可能会有所帮助。

于 2017-09-27T23:00:30.467 回答