Selenium WebDriver:我想覆盖字段中的值,而不是使用Java使用sendKeys将其附加到该值


73

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

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

Answers:


88

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

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

2
是的,我只需要导入Keys类即可。非常感谢。
True_Blue 2010年

我正在Pyton尝试。如何导入Keys
Volatil3 2014年

1
@BaoNgo对于Mac,您需要使用Keys.COMMAND而不是Keys.CONTROL
MForMarlon

3
@SergiiPozharov是否有与此命令等效的Python?我已经用过,send_keys但遇到错误AttributeError: type object 'Keys' has no attribute 'chord'
James Hayek

2
找到了。element.send_keys(Keys.CONTROL, 'a')
詹姆斯·海耶克

107

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

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

7
True_Blue的疑问,他不能用明确的(),因为第二他这样做,该网页将抛出一个错误说,它必须是10和100之间提到
扬Hrcek

5
好决定。我将在这里保留我的答案,以防万一将来对某人有用,因为标题未指定。
蒂姆·班克斯

6
如果此解决方案不适用于某人,请提供其他信息:element.GetAttribute("value")在调用之前,请确保该值确实有一个值element.clear()(等待该值不为空)。当使用ngModel指令测试AngularJS输入时,有时会发生这种情况。
卢卡斯Wiatrak

为我工作,即使是空字段。
克里斯·奇萨克

21

好的,这是几天前的事...就我目前而言,ZloiAdun的答案对我不起作用,但使我与解决方案非常接近...

代替:

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

以下代码让我很高兴:

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

因此,我希望对您有所帮助!


我用这个-> element.sendKeys(Keys.HOME,Keys.chord(Keys.SHIFT,Keys.ARROW_DOWN,Keys.ARROW_DOWN,Keys.ARROW_DOWN)); 太神奇了,它在textarea框中选择了3行文本,因为Command A也不对我
有用

8

这对我有用。

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

2
这应该更好,Ctrl + A在西班牙键盘/ Windows中可能不起作用。
Kat Lim Ruiz'8


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清除它。它将尝试通过空路径查找文件,并会引发错误。

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


对不起,我理解错了。我的解决方案-只是清除输入值的正确方法,而不是如何用新的一项功能替换当前值
Gadget

1

使用以下内容:

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

0

由于textfield不接受键盘输入,并且鼠标解决方案似乎不完整,因此使用大多数上述方法都存在问题。

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

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

0

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

//Create a Javascript executor

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

55 =分配值


0

最初的问题是说clear()无法使用。这不适用于那种情况。我在此处添加工作示例,因为该SO帖子是Google在输入值之前清除输入的第一批结果之一。

对于没有其他限制的输入,我包括使用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 );
    });
},

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

此页面上有完整的代码示例和文章,可能会有所帮助。


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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.