Selenium sendKeys 没有发送所有字符
Selenium sendKeys are not sending all characters
我正在使用 Java、Selenium 和 Chrome 进行测试自动化。我们的开发人员最近将我们的 UI 从 AngularJS 升级到了 Angular2(不确定这是否重要)。但从那以后,sendKeys 正在向文本字段输入不完整的字符。这是一个例子:
public void enterCustomerDetails()
{
txtFirstName.sendKeys("Joh201605130947AM");
txtSurname.sendKeys("Doe201605130947AM");
txtEmail.sendKeys("johndoe@gmail.com");
}
我也尝试过使用 executeScript。它没有用。它可以输入完整的字符,但表单认为该字段为空。
public void forceSendKeys(WebElement element, String text)
{
if (element != null)
((JavascriptExecutor) this.webDriver).executeScript("arguments[0].value=arguments[1]", element, text);
}
public void enterCustomerDetails()
{
forceSendKeys(txtFirstName, "Joh201605130947AM");
forceSendKeys(txtSurname, "Doe201605130947AM");
forceSendKeys(txtEmail, "johndoe@gmail.com");
}
我还尝试在 .sendKeys 之前使用 .click() 并添加睡眠时间。他们也没有用。
我从这个 post: How to enter characters one by one in to a text field in selenium webdriver?
得到一个输入字符 1 到 1 的想法
有效,但这意味着我必须将所有代码从 sendKeys 重写为新函数:
public void sendChar(WebElement element, String value)
{
element.clear();
for (int i = 0; i < value.length(); i++){
char c = value.charAt(i);
String s = new StringBuilder().append(c).toString();
element.sendKeys(s);
}
}
public void enterCustomerDetails()
{
sendChar(txtFirstName, "Joh201605130947AM");
sendChar(txtSurname, "Doe201605130947AM");
sendChar(txtEmail, "johndoe@gmail.com");
}
如果你们知道更好的方法,请帮忙! :)
我认为这是由 Angular2 问题引起的 https://github.com/angular/angular/issues/5808
Angular 无法处理到达太快的输入事件。
作为解决方法,您需要发送单个字符,每个字符之间有一个小的延迟。
尝试此代码..使用 javascript 设置值的其他方法
WebDriver 驱动程序 = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)驱动程序;
jse.executeScript("document.getElementsByName('body')[0].setAttribute('type', 'text');");
driver.findElement(By.xpath("//输入[@name='body']")).clear();
driver.findElement(By.xpath("//输入[@name='body']").sendKeys("Ripon: body text");
我在使用 NightwatchJS(使用 selenium)进行集成测试时偶然发现了这个错误。
所以我写这篇文章是为了以后来这里的人。
我为守夜人写了这个扩展命令:
exports.command = function (selector, value, using) {
var self = this;
self.elements(using || 'css selector', selector, function (elems) {
elems.value.forEach(function (element) {
for (var c of value.split('')) {
self.elementIdValue(element.ELEMENT, c);
}
});
});
return this;
};
可以这样使用:
var username = 'integration@test.com';
browser.setValueSlow('input[ngcontrol=username]', username); //Works with ng2!
这个问题也在 NightwatchJS 的 github here
上讨论过
这是由于 Angular 应用中的一个错误。解决方法是放置一个睡眠函数。
public void setText(By element, String text) {
sleep(100); // Angular version < 2 apps require this sleep due to a bug
driver.findElement(element).clear();
driver.findElement(element).sendKeys(text);
}
我在 Java 中也遇到了这个错误,Selenium。您在编写代码时也可能会遇到此错误 - "sendKeys (CharSequence) from the type Webelement refers to the missing type charSequence"
我试过改变等待时间,甚至在主要角色之前输入额外的字符,但都没有用。
我使用的简单技巧是将 Java 编译器版本从 JRE 9 更改为 JRE 10。
我有同样的问题,如果你仔细看到它 selenium 正在改变字符,一些数字执行退格或其他符号,我读到它发生在将 selenium 与 vncserver 一起使用时,我改为 firefox ....和成功了。
如果这不是你的问题,也许可以分段发送数据:
input1="Joh201605130947AM"
txtFirstName.sendKeys(input1[0:7])
txtFirstName.sendKeys(input1[8:end])
正在使用
- 铬 78.0.3904.70,
- Vaadin 流框架 14.1.3,
- 硒 3.141.59
- 和 OpenJDK 11.0.5
该行为也会发生并且更糟:
我看到输入的字符突然消失了。
解决方法是坚持不懈,然后再试一次。然后再次。直到最终输入字符。
// Type in every single character
for (int i = 0; i < textToType.length(); i++) {
boolean typingCharacterWasSuccessful = false;
// If typing was not successful before, just type again
while (!typingCharacterWasSuccessful) {
// Type in the character
char singleCharacterToType = textToType.charAt(i);
htmlTextfeld.sendKeys(Character.toString(singleCharacterToType));
// Wait a little. Maybe alternatively/additionally wait.until(...)
Thread.sleep(200);
// Check typed in string.
String inputValueAfterTyping = htmlTextfeld.getAttribute("value");
if (inputValueAfterTyping.length() > i + 1) {
// Alternatively: delete everything and start all over
throw new Exception("Input value too long. Maybe character typed in twice!?");
}
// Typing was successful if the value in the input field is as expected (up to now)
typingCharacterWasSuccessful
= inputValueAfterTyping.equals(textToType.substring(0, i + 1));
}
}
我在 Java 中遇到了类似的大文本问题。
我在键盘相关方法中使用复制和粘贴文本解决了这个问题,如下面的方法:
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
public static void clickAndSetMultilineText(WebElement element, String text) {
/** click on element **/
element.click();
/** clear older content of the text using keyboard functionality **/
element.sendKeys(Keys.CONTROL + "a"); // select all text
element.sendKeys(Keys.DELETE); // delete old text
StringSelection stringSelection= new StringSelection(text);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null); // copy text to the keyboard
element.sendKeys(Keys.CONTROL+"v"); // paste text to the field
}
希望对您有所帮助。
通过使用 Actions class,这个问题为我解决了
试了很多上面说的方法。还尝试通过 js executescript 设置值
最后,找到了这段代码,它适用于构建在 angular
上的网格组件
actions.sendKeys(webElement,
modifiedValue).perform();
我正在使用 Java、Selenium 和 Chrome 进行测试自动化。我们的开发人员最近将我们的 UI 从 AngularJS 升级到了 Angular2(不确定这是否重要)。但从那以后,sendKeys 正在向文本字段输入不完整的字符。这是一个例子:
public void enterCustomerDetails()
{
txtFirstName.sendKeys("Joh201605130947AM");
txtSurname.sendKeys("Doe201605130947AM");
txtEmail.sendKeys("johndoe@gmail.com");
}
我也尝试过使用 executeScript。它没有用。它可以输入完整的字符,但表单认为该字段为空。
public void forceSendKeys(WebElement element, String text)
{
if (element != null)
((JavascriptExecutor) this.webDriver).executeScript("arguments[0].value=arguments[1]", element, text);
}
public void enterCustomerDetails()
{
forceSendKeys(txtFirstName, "Joh201605130947AM");
forceSendKeys(txtSurname, "Doe201605130947AM");
forceSendKeys(txtEmail, "johndoe@gmail.com");
}
我还尝试在 .sendKeys 之前使用 .click() 并添加睡眠时间。他们也没有用。
我从这个 post: How to enter characters one by one in to a text field in selenium webdriver?
得到一个输入字符 1 到 1 的想法有效,但这意味着我必须将所有代码从 sendKeys 重写为新函数:
public void sendChar(WebElement element, String value)
{
element.clear();
for (int i = 0; i < value.length(); i++){
char c = value.charAt(i);
String s = new StringBuilder().append(c).toString();
element.sendKeys(s);
}
}
public void enterCustomerDetails()
{
sendChar(txtFirstName, "Joh201605130947AM");
sendChar(txtSurname, "Doe201605130947AM");
sendChar(txtEmail, "johndoe@gmail.com");
}
如果你们知道更好的方法,请帮忙! :)
我认为这是由 Angular2 问题引起的 https://github.com/angular/angular/issues/5808
Angular 无法处理到达太快的输入事件。
作为解决方法,您需要发送单个字符,每个字符之间有一个小的延迟。
尝试此代码..使用 javascript 设置值的其他方法 WebDriver 驱动程序 = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptExecutor)驱动程序; jse.executeScript("document.getElementsByName('body')[0].setAttribute('type', 'text');"); driver.findElement(By.xpath("//输入[@name='body']")).clear(); driver.findElement(By.xpath("//输入[@name='body']").sendKeys("Ripon: body text");
我在使用 NightwatchJS(使用 selenium)进行集成测试时偶然发现了这个错误。
所以我写这篇文章是为了以后来这里的人。
我为守夜人写了这个扩展命令:
exports.command = function (selector, value, using) {
var self = this;
self.elements(using || 'css selector', selector, function (elems) {
elems.value.forEach(function (element) {
for (var c of value.split('')) {
self.elementIdValue(element.ELEMENT, c);
}
});
});
return this;
};
可以这样使用:
var username = 'integration@test.com';
browser.setValueSlow('input[ngcontrol=username]', username); //Works with ng2!
这个问题也在 NightwatchJS 的 github here
上讨论过这是由于 Angular 应用中的一个错误。解决方法是放置一个睡眠函数。
public void setText(By element, String text) {
sleep(100); // Angular version < 2 apps require this sleep due to a bug
driver.findElement(element).clear();
driver.findElement(element).sendKeys(text);
}
我在 Java 中也遇到了这个错误,Selenium。您在编写代码时也可能会遇到此错误 - "sendKeys (CharSequence) from the type Webelement refers to the missing type charSequence"
我试过改变等待时间,甚至在主要角色之前输入额外的字符,但都没有用。
我使用的简单技巧是将 Java 编译器版本从 JRE 9 更改为 JRE 10。
我有同样的问题,如果你仔细看到它 selenium 正在改变字符,一些数字执行退格或其他符号,我读到它发生在将 selenium 与 vncserver 一起使用时,我改为 firefox ....和成功了。
如果这不是你的问题,也许可以分段发送数据:
input1="Joh201605130947AM"
txtFirstName.sendKeys(input1[0:7])
txtFirstName.sendKeys(input1[8:end])
正在使用
- 铬 78.0.3904.70,
- Vaadin 流框架 14.1.3,
- 硒 3.141.59
- 和 OpenJDK 11.0.5
该行为也会发生并且更糟: 我看到输入的字符突然消失了。 解决方法是坚持不懈,然后再试一次。然后再次。直到最终输入字符。
// Type in every single character
for (int i = 0; i < textToType.length(); i++) {
boolean typingCharacterWasSuccessful = false;
// If typing was not successful before, just type again
while (!typingCharacterWasSuccessful) {
// Type in the character
char singleCharacterToType = textToType.charAt(i);
htmlTextfeld.sendKeys(Character.toString(singleCharacterToType));
// Wait a little. Maybe alternatively/additionally wait.until(...)
Thread.sleep(200);
// Check typed in string.
String inputValueAfterTyping = htmlTextfeld.getAttribute("value");
if (inputValueAfterTyping.length() > i + 1) {
// Alternatively: delete everything and start all over
throw new Exception("Input value too long. Maybe character typed in twice!?");
}
// Typing was successful if the value in the input field is as expected (up to now)
typingCharacterWasSuccessful
= inputValueAfterTyping.equals(textToType.substring(0, i + 1));
}
}
我在 Java 中遇到了类似的大文本问题。
我在键盘相关方法中使用复制和粘贴文本解决了这个问题,如下面的方法:
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
public static void clickAndSetMultilineText(WebElement element, String text) {
/** click on element **/
element.click();
/** clear older content of the text using keyboard functionality **/
element.sendKeys(Keys.CONTROL + "a"); // select all text
element.sendKeys(Keys.DELETE); // delete old text
StringSelection stringSelection= new StringSelection(text);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null); // copy text to the keyboard
element.sendKeys(Keys.CONTROL+"v"); // paste text to the field
}
希望对您有所帮助。
通过使用 Actions class,这个问题为我解决了 试了很多上面说的方法。还尝试通过 js executescript 设置值 最后,找到了这段代码,它适用于构建在 angular
上的网格组件 actions.sendKeys(webElement,
modifiedValue).perform();