sendkeys在Selenium Webdriver中不起作用

时间:2014-01-05 17:02:21

标签: selenium selenium-webdriver

我无法使用网络驱动程序在我的应用程序中添加任何值。 我的应用程序正在使用框架。

我可以使用driver.findElement(By.name("name")).clear();清除文本框的值,但我无法使用driver.findElement(By.name("name")).sendKeys("manish");添加任何值。 click命令适用于同一页面上的另一个按钮。

13 个答案:

答案 0 :(得分:28)

我之前也遇到过这个问题。但那时我做的是让它发挥作用

myInputElm.click();
myInputElm.clear();
myInputElm.sendKeys('myString');

答案 1 :(得分:3)

在发送密钥之前,请尝试单击文本框。

可能需要在输入前触发该字段上的事件,并希望点击会这样做

答案 2 :(得分:1)

在字段中使用 javascript点击,然后然后使用sendkeys()输入值。 我过去和帧有类似的问题。 Javascript是最好的方式。

答案 3 :(得分:0)

尝试使用Javascript发送密码()。

WebElement element = driver.findElement(By.name("name"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

有关Javascript Executor的更多信息,请访问@ JavascriptExecutor - Selenium

答案 4 :(得分:0)

首先使用----

将驱动程序控制传递给帧
  driver.switchTo().frame("pass id/name/index/webelement");

之后执行您要对框架内存在的元素执行的操作 -

 driver.findElement(By.name("name")).sendKeys("manish");

答案 5 :(得分:0)

我遇到了同样的问题,其中复制粘贴也不适用于该文本框。 下面的代码对我来说很好 -

WebDriver driver = new FirefoxDriver();
String mobNo = "99xxxxxxxx";
WebElement mobileElementIrs = 
driver.findElement(By.id("mobileNoPrimary"));
mobileElementIrs.click();
mobileElementIrs.clear();
mobileElementIrs.sendKeys(mobNo);

答案 6 :(得分:0)

单击该元素也适用于我,但是,我找到的另一个解决方案是使用JavaScript输入值,这不需要元素具有焦点:

var _element= driver.FindElement(By.Id("e123"));
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].setAttribute('value', 'textBoxValue')", _element);

答案 7 :(得分:0)

当我使用

时,我也有类似的问题
providers:
    in_memory:
        memory:
            users:
                user1:
                    password: password1
                    roles: 'ROLE1'

&#34; text&#34;中的值并没有完全写入输入,想象是&#34; <link rel="prefetch" href="image1.svg"> <link rel="prefetch" href="image2.svg">&#34;有时写'&#34; P&#34;另一个&#34; Pat&#34;,......所以测试失败

我所做的是修复它是一种解决方法,并使用Javascript

<link rel="preload" href="image1.svg">
<link rel="preload" href="image2.svg">

现在很好

而不是

getDriver().findElement(By.id(idValue)).clear();
getDriver().findElement(By.id(idValue)).sendKeys(text);

使用,

Patrick

这对我有用。

答案 8 :(得分:0)

我遇到了同样的问题,并且能够为此收集以下解决方案:

  1. 确保元素处于焦点位置-> 首先尝试单击它,然后输入一个字符串
  2. 如果此输入框有一些动画,请应用一些等待(不是静态的),您可以等待动画之后的元素。(我的情况)
  3. 您可以使用Actions类进行尝试。

答案 9 :(得分:0)

在sendkeys()之前使用click()方法[即,在您的情况下:clear(),click(),sendKeys()]

driver.findElement(By.name("name")).clear();
driver.findElement(By.name("name")).click(); // Keep this click statement even if you are using click before clear.
driver.findElement(By.name("name")).sendKeys("manish");

答案 10 :(得分:0)

我最近遇到了类似的问题,尝试了上述一些建议,但没有任何效果。最后,它失败了,进行了蛮力重试,如果输入框未设置为期望的值,则重试。

出于明显的原因,我想避免 thread.sleep ,并看到了失败的不同示例,看起来像是某种竞赛或计时条件。

public void TypeText(string id, string text)
{
    const int numberOfRetries = 5;
    for (var i = 1; i < numberOfRetries; i++)
    {
        try
        {
            if (TryTypeText())
                return;
        }
        catch (Exception)
        {
            if (i == numberOfRetries)
                throw;
        }
    }

    bool TryTypeText()
    {
        var element = _webDriver.FindElement(By.Id(id));
        element.Click();
        element.Clear();
        element.SendKeys(text);
        if (element.TagName.ToLower() == "input"
            && !DoesElementContainValue(element, text, TimeSpan.FromMilliseconds(1000)))
        {
            throw new ApplicationException($"Unable to set the type the text '{text}' into element with id {id}. Value is now '{element.GetAttribute("value")}'");
        }
        return true;
    }
}

private bool DoesElementContainValue(IWebElement webElement, string expected, TimeSpan timeout)
{
    var wait = new WebDriverWait(_webDriver, timeout);
    return wait.Until(driver =>
    {
        try
        {
            var attribute = webElement.GetAttribute("value");
            return attribute != null && attribute.Contains(expected);
        }
        catch (StaleElementReferenceException)
        {
            return false;
        }
    });
}

答案 11 :(得分:-1)

我确实有同样的问题。首先,我按照@andyssundaypink的假设进行了尝试。但这没有帮助。因此,当我在单击元素之前1秒钟添加sleep时,问题已解决

Thread.sleep(2000);
element = driver.findElement(...);
element.click();
element.clear();
element.sendKeys('abc');
Thread.sleep(1000);

答案 12 :(得分:-2)

通常我会保留一个临时变量。这应该有用。

var name = element(by.id('name'));
name.clear();
name.sendKeys('anything');

希望它有所帮助。