我使用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()并添加睡眠时间。他们也没有工作。
我想知道从这篇文章中逐一输入字符:How to enter characters one by one in to a text field in selenium webdriver?
虽然有效,但这意味着我必须将所有代码从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");
}
如果你们知道更好的方法,请帮忙! :)
答案 0 :(得分:3)
我认为这是由Angular2问题引起的https://github.com/angular/angular/issues/5808
当Angular到达太快时,它无法处理输入事件。
作为一种解决方法,您需要在每个字符之间发送一个小延迟的单个字符。
答案 1 :(得分:1)
我在使用NightwatchJS(使用硒)进行集成测试时偶然发现了这个错误。
所以我正在为将来来这里的人写这篇文章。
我为nightwatch写了扩展命令:
r.B.B1, r.B.B2
可以这样使用:
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;
};
在NightwatchJS的github here
中也讨论了这个问题答案 2 :(得分:0)
这是由于Angular应用程序中的错误所致。解决方法是设置睡眠功能。睡眠时间无所谓。在下面的示例中,它休眠10毫秒。
public void setText(By element, String text) {
sleep(10); // Angular 2 apps require this sleep due to a bug
driver.findElement(element).clear();
driver.findElement(element).sendKeys(text);
}
答案 3 :(得分:0)
我在Java Selenium中也遇到了此错误。您在编写代码时也可能会遇到此错误-Web元素类型的“ sendKeys(CharSequence)指向缺少的charSequence类型”
我尝试改变等待时间,甚至在主要字符之前键入多余的字符,这些字符都无效。
我使用的简单技巧是将Java编译器版本从JRE 9更改为JRE10。
答案 4 :(得分:0)
我遇到了同样的问题,如果您仔细查看selenium正在更改字符,某些数字执行了退格键或其他符号,我读到它与vncserver一起使用selenium时发生了,我更改为firefox ....并且它起作用了
如果这不是您的问题,则可以分部分发送数据:
input1="Joh201605130947AM"
txtFirstName.sendKeys(input1[0:7])
txtFirstName.sendKeys(input1[8:end])
答案 5 :(得分:0)
使用
该行为也会发生,甚至更糟: 我看到输入了该字符,此后突然消失了。 一种解决方法是持久化,然后再试一次。然后再次。直到最终输入字符为止。
// 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));
}
}
答案 6 :(得分:0)
对于 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
}
希望对您有所帮助。
答案 7 :(得分:-2)
尝试此代码..使用javascript设置值的其他方法 WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse =(JavascriptExecutor)驱动程序; jse.executeScript(“document.getElementsByName('body')[0] .setAttribute('type','text');”); 。driver.findElement(By.xpath( “//输入[@名称= '主体']”))明确(); driver.findElement(By.xpath(“// input [@ name ='body']”))。sendKeys(“Ripon:body text”);