设置输入值而不是 sendKeys() - Selenium WebDriver nodejs

IT技术 javascript node.js selenium selenium-webdriver
2021-03-03 14:39:30

我有一个很长的字符串要测试,而且sendKeys()花费的时间太长。当我试图设置text程序崩溃的值时我知道 SeleniumsendKeys()是测试实际用户输入的最佳方式,但对于我的应用程序来说,它需要太多时间。所以我试图避免它。

有没有办法立即设置值?

请参阅此快速示例:

var webdriver = require('selenium-webdriver');

var driver = new webdriver.Builder().
   withCapabilities(webdriver.Capabilities.chrome()).
      build();

driver.get('http://www.google.com');

// find the search input field on google.com
inputField = driver.findElement(webdriver.By.name('q'));

var longstring = "test"; // not really long for the sake of this quick example

// this works but is slow
inputField.sendKeys(longstring);

// no error but no values set
inputField.value = longstring;

// Output: TypeError: Object [object Object] has no method 'setAttributes'

inputField.setAttributes("value", longstring);
6个回答

尝试使用executeScriptJavascriptExecutor方法设置元素的值

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById('elementID').setAttribute('value', 'new value for element')");
我实际上是用这个例子来测试它与谷歌。你能把对你有用的代码放在这里吗?
2021-04-16 14:39:30
我遇到与尝试执行.value = longstring 错误时相同的错误:ElementNotVisibleError: element not visible
2021-04-25 14:39:30
你能添加你的html样本吗?因为对于谷歌这个代码工作得很好。页面上的元素可能有问题(我认为它是隐藏的)
2021-05-03 14:39:30
在 Python Selenium 中它是 execute_script
2021-05-05 14:39:30
这个给你。 driver.executeScript("document.getElementById('gbqfq').setAttribute('value','Selenium Web Driver')");
2021-05-07 14:39:30

感谢 Andrey Egorov,在我的情况下,pythonsetAttribute不起作用,但我发现我可以直接设置属性,

试试这个代码:

driver.execute_script("document.getElementById('q').value='value here'")

从 Andrey-Egorov 的正确答案扩展而来,.executeScript()用于总结我自己的问题示例:

inputField = driver.findElement(webdriver.By.id('gbqfq'));
driver.executeScript("arguments[0].setAttribute('value', '" + longstring +"')", inputField);
对上述 2 个想法稍作修改,因为至少在我的上下文中,我试图设置一个 textarea 并且它抱怨语法。这是量角器: browser.executeScript("arguments[0].value=arguments[1].toString()", inputField, longstring); 我还发现为了使字段更新,它有助于 inputField.sendKeys(" "),在我的上下文中,额外的空间是无害的。
2021-04-22 14:39:30
是的,这也行。但也可以修改,更简单:driver.executeScript("arguments[0].setAttribute('value', arguments[1])", inputField, longstring);
2021-04-24 14:39:30
driver.executeScript("arguments[0].value = '" + longstring + "'", inputField) 另一个可能的改进也适用于 textAreas(不过我只在 Chrome 中测试过)
2021-05-10 14:39:30

将大量重复字符发送到文本字段的另一种方法(例如测试字段允许的最大字符数)是键入几个字符,然后重复复制和粘贴它们:

inputField.sendKeys('0123456789');
for(int i = 0; i < 100; i++) {
    inputField.sendKeys(Key.chord(Key.CONTROL, 'a'));
    inputField.sendKeys(Key.chord(Key.CONTROL, 'c'));
    for(int i = 0; i < 10; i++) {
        inputField.sendKeys(Key.chord(Key.CONTROL, 'v'));
    }
}

不幸的是,除非REQUIRE_WINDOW_FOCUS启用(这可能会导致其他问题),否则按 CTRL 似乎不适用于 IE ,但它适用于 Firefox 和 Chrome。

感谢 Andrey-Egorov 和这个答案,我已经成功地用 C# 做到了

IWebDriver driver = new ChromeDriver();
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string value = (string)js.ExecuteScript("document.getElementById('elementID').setAttribute('value', 'new value for element')");
与之前的答案相比,您的答案有哪些新变化?
2021-04-16 14:39:30
@Stepan - 不多,但没有一个答案在 C# 中,这是我一直在寻找的,但在任何地方都找不到。所以在这里。它可以在未来帮助像我这样的人。
2021-04-21 14:39:30